一.Mybatis的基本構成:核心元件
1.SqlSessionFactoryBuilder
構造器,根據配置資訊負責生成SqlSessionFactory(工廠接口)。
2.SqlSessionFactory
依靠本工廠接口來生成SqlSession
3.SqlSession
是一個既可以發送Sql去執行并傳回會結果,也可以擷取Mapper接口。
4.Sql Mapper
由一個Java接口和對應的XML檔案(或者注解)構成,需要給出對應的SQL和映射規則,負責發送SQL去執行,并傳回結果。
下面給一個執行個體看如何由SqlSessionFactoryBuild建立SqlSessionFactory,并獲得SqlSession。
package forum.dao;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
public class BaseMapperTest{
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() {
System.out.println("sys statup");
try {
//讀取配置檔案
Reader reader = Resources.getResourceAsReader("res/mybatis/mybatis-config.xml");
//擷取sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
}
catch(IOException ex) {
ex.printStackTrace();
}
}
/*傳回sqlSession/
public SqlSession getSqlSession() {
return BaseMapperTest.sqlSessionFactory.openSession();
}
}
擷取sqlSession
public class UserMapperTest extends BaseMapperTest {
@Test
public void SelectByIdTest() {
SqlSession sqlSession = getSqlSession();
try {
//根據映射接口類獲得執行個體
TUserMapper userMapper = sqlSession.getMapper(TUserMapper.class)
//執行Sql處理,并傳回執行結果
TUser user = userMapper.selectByPrimaryKey();
printUser(user);
}
finally {
//使用完後關閉sqlSession,不要忘記
sqlSession.close();
}
}
}
二.生命周期
1.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是利用注解或者XML方式建立SqlSessionFactory。通過它可以建構多個SqlSessionFactory,一旦建構完成就失去了作用,是以它的生命周期隻存在局部方法内。
2.SqlSessionFactory
每次程式通路資料庫,需要通過SqlSessionFactory擷取SqlSession,是以它的生命周期存在Mybatis的整個生命周期中。
如果一個資料庫建立多個SqlSessionFactory,每次建立都會打開更多的資料庫連接配接資源,那麼資料庫的連接配接資源很快就會耗盡。 是以每個資料庫應該隻建立一個SqlSessionFactory。
3.SqlSession
SqlSession是一個會話,相當于JDBC的一個Connection對象,它的生命首期應該是請求資料庫處理事務的過程中,比如查詢,插入等操作。
SqlSession是一個線程不安全對象,在涉及多線程的時候需要注意操作資料庫的隔離級别,資料庫鎖等進階特性。
每次建立SqlSession時都會使資料庫的連接配接池資源減少,這會導緻系統性能下降。是以每次使用完之後都需要關閉SqlSession。
finally {
//使用完後關閉sqlSession,不要忘記
sqlSession.close();
}