天天看點

Mybatis的SqlSessionFactoryBuilder/SqlSessionFactory/SqlSession生命周期總結一.Mybatis的基本構成:核心元件二.生命周期

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

繼續閱讀