MyBatis 的基本要素—核心對象


MyBatis 三個基本要素

    ➢ 核心接口和類
   ➢ MyBatis 核心配置文件(mybatis-config.xml)
   ➢ SQL 映射文件(mapper.xml)

 

MyBatis 核心接口和類

 

      說明:

      1、每個 MyBatis 的應用程序都以一個 SqlSessionFactory 對象的實例為核心,SqlSessionFactory 對象實例可以通過 SqlSessionFactoryBuilder 對象來獲得。首先獲取 SqlSessionFactoryBuilder 對象,可以根據 XML 配置文件或 Configuration 類的實例構建該對象。然后獲取 SqlSessionFactory 對象,有了 SqlSessionFactory 對象之后,就可以進而獲取 Sqlsession 實例, Sqlsession 對象中完全包含以數據庫為背景的所有執行 SQL 操作的方法。可以用該實例來直接執行已映射的 SQL 語句。

      2、根據 XML 配置文件構建 SqlSessionFactory 的實例非常簡單,建議使用。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);   //獲取 SqlSessionFactory 對象實例
SqlSession session = sqlSessionFactory.openSession();   //獲取 SqlSession 對象實例

try {
    //業務邏輯代碼:如通過調用 session 對象的一系列 SQL 操作方法,對數據庫表執行 CRUD 操作
    int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2);  //方式 1
    int count= session.getMapper(UserMapper.class).count(2);  //方式 2:更簡單,代碼更安全,減少類型轉換錯誤(推薦使用)
} finally {
    session.close();    //關閉 SqlSession 
}   

說明:
     1、UserMapper mapper = session.getMapper(UserMapper.class);   //獲取映射器實例 mapper 
   2、映射器是你創建綁定映射語句的接口,映射器接口的實例可以從 SqlSession 中獲得,映射器實例的最佳范圍是方法范圍。即它們應該在使用它們的方法中被請求,然后就拋棄掉。它們不需要明確地關閉。

 

SqlSessionFactoryBuilder

    1、SqlSessionFactoryBuilder 作用

  SqlSessionFactoryBuilder 負責構建 SqlSessionFactory,並且提供了多個 build() 方法的重載,由於方法參數 environment 和 Properties 都可以為 null,那么去除重復的,真正的重載方法其實只有如下三種:

build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)

  通過上述分析,發現配置信息可以以三種形式提供給 SqlSessionFactoryBuilder 的 build() 方法,分別是 InputStream(字節流)、 Reader(字符流)、 Configuration(類),由於字節流與字符流都屬於讀取配置文件的方式,所以從配置信息的來源就很容易想到構建一個 SqlSessionFactory 有兩種方式:讀取 XML 配置文件構造方式和編程構造方式。我們采用讀取 XML 配置文件的方式來構造 SqlSessionFactory。

 

    2、SqlSessionFactoryBuilder 的生命周期和作用域

  SqlSessionFactoryBuilder 的最大特點是:用過即丟。一旦創建了 SqlSessionFactory 對象之后,這個類就不再需要存在了,因此 SqlSessionFactoryBuilder 的最佳范圍就是存在於方法體內,也就是局部變量而已。即最佳范圍是方法范圍 (本地方法變量)。

 

SqlSessionFactory

    1、SqlSessionFactory 的作用

  SqlSessionFactory 簡單的理解就是創建 SqlSession 實例的工廠。所有的 MyBatis 應用都是以 SqlSessionFactory 實例為中心, SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 對象來獲得。有了它之后,顧名思義,就可以通過 SqlSessionFactory 提供的 openSession() 方法來獲取 SqlSession 實例。

  

  說明: openSession() 方法的參數為 boolean 值時,若傳入 true 表示關閉事務控制,自動提交; false 表示開啟事務控制。若不傳入參數,默認為 true。

openSession (boolean autoCommit)
openSession()//若不傳入參數,默認為 true ,自動提交

    

    2、SqlSessionFactory 的生命周期和作用域

  SqlSessionFactory 對象一旦創建,就會在整個應用運行過程中始終存在。沒有理由去銷毀或再創建它,並且在應用運行中也不建議多次創建 SqlSessionFactory 。因此 SqlSessionFactory 的最佳作用域是 Application,即隨着應用的生命周期一同存在。那么這種 “存在於整個應用運行期間,並且同時只存在一個對象實例” 的模式就是所謂的單例模式(指在應用運行期間有且僅有一個實例)。即 SqlSessionFactory 的最佳范圍是應用范圍

  

SQLSession

  1、SqlSession

  SqlSession 是用於執行持久化操作的對象,類似於 JDBC 中的 Connection 。它提供了面向數據庫執行 SQL 命令所需的所有方法,可以通過 SqlSession 實例直接運行已映射的 SQL 語句。

 

    2、SqlSession 的生命周期和作用域

  正如其名, SqlSession 對應着一次數據庫會話。由於數據庫會話不是永久的,因此 SqlSession 的生命周期也不應該是永久的。相反,在每次訪問數據庫時都需要創建它(注意:並不是說在 SqlSession 里只能執行一次 SQL,是完全可以執行多次的,但是若關閉了 SqlSession ,那么就需要重新創建它)。創建 SqlSession 的地方只有一個,那就是 SqlSessionFactory 對象的 openSession()方法。

  需要注意的是:每個線程都有自己的 SqlSession 實例, SqlSession 實例不能被共享,也不是線程安全的。因此最佳的作用域范圍是請求 request 范圍或者方法范圍

 

  關閉 SqlSession 是非常重要的。必須要確保 SqlSession 在 finally 語句塊中正常關閉。可以使用下面的標准方式來關閉:

SqlSession session =sqlSessionFactory.openSession();
try{
    //do work
}finally{
    session.close();   //關閉 SqlSession 
}

 

  3、SqlSession 的兩種使用方式

//方式 1:通過 SQLSession 實例調用 selectList、selectOne 等方法來直接執行已映射的 SQL 語句。(不需要編寫 DAO 接口)
    
        // MyBatis 通過 mapper 文件的 namespace 和子元素的 id 來找到相應的 SQL,從而執行查詢操作
        userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList"); 

    說明:
        1、com.smbms.dao.UserMapper.getUserList=namespace+id
        2、使用方式一可以不用寫接口中的方法,因為方式一直接執行映射文件的 SQL 語句。
     3、執行 CRUD 操作,有參數傳遞時此方式不適用,應使用方式 2//方式 2:基於 mapper 接口方式操作數據。(官方推薦使用)

        //創建綁定映射語句的接口 UserMapper.java,並提供接口方法 getUserList(),該接口稱為映射器。
         userList=sqlSession.getMapper(UserMapper.class).getUserList();

     說明:
        1、接口的方法必須與 SQL 映射文件中 SQL 語句的 id 一一對應。
        2、第二種方式是通過 SQLSession 實例調用 getMapper(Mapper.class) 執行 Mapper 接口方法來實現對數據庫的查詢操作。
        3、第一種方式是舊版本的 MyBatis 提供的操作方式,雖然現在也可以正常工作,但是第二種方式是 MyBatis 官方所推薦使用的,其表達方式也更加直白。代碼更加清晰,類型安全,也不用擔心易錯的字符串字面值以及強制類型轉換。

 

獲取 SqlSession 的工具類(MyBatisUtil.java)

  此 MyBatisUtil.java 文件是優化后獲取 SqlSession ,關閉 SqlSession 的公用工具類

 

package cn.mybatis.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {
    
    private static SqlSessionFactory sessionFactory;
    
    static{//在靜態代碼塊下,sessionFactory 只會被創建一次
        try {
            //讀取 mybatis-config.xml 文件
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            //創建SqlSessionFactoryBuilder對象
            SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
            //利用SqlSessionFactoryBuilder對象 去構建sessionFactory工廠
            sessionFactory = sessionFactoryBuilder.build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    //創建sqlSession
    public static SqlSession getSqlSession(){
        //利用sessionFactory工廠對象去生產sqlSession
        SqlSession sqlSession = sessionFactory.openSession(false);//false代表不會自動提交事務,true 代表自動提交事務
        return sqlSession;
    }
    
    //關閉sqlSession
    public static void close(SqlSession sqlSession){
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
    
}
MyBatisUtil 工具類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM