一.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(1);
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();
}