Mybatis的SqlSessionFactoryBuilderSqlSessionFactorySqlSession生命周期总结

xiaoxiao2021-03-01  14

一.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(); }
转载请注明原文地址: https://www.6miu.com/read-3350359.html

最新回复(0)