Mybatis的SqlSessionFactoryBuilder/SqlSessionFactory/SqlSession生命周期总结

一.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();
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值