真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SqlSessionFactory和SqlSession怎么在MyBatis中使用

這篇文章給大家介紹SqlSessionFactory和SqlSession怎么在MyBatis中使用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、靈武網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

SqlSessionFactory和SqlSession怎么在MyBatis中使用

MyBatis的持久化解決方案是將用戶從原始的JDBC訪問中解放出來,用戶只需要定義需要操作的SQL語句,無須關(guān)注底層的JDBC操作,就可以以面向?qū)ο蟮姆绞絹磉M行持久化層操作.底層數(shù)據(jù)庫連接的獲取,數(shù)據(jù)訪問的實現(xiàn),事務(wù)控制等都無須用戶關(guān)心,從而將應(yīng)用層從底層的JDBC/JTA API抽取出來.通過配置文件管理JDBC連接,讓MyBatis解決持久化的實現(xiàn).在MyBatis中的常見對象有SqlSessionFactory和SqlSession.本文這種介紹一下兩者的概念和使用.
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------

一、 SqlSessionFactory
SqlSessionFactory是MyBatis的關(guān)鍵對象,它是個單個數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像.SqlSessionFactory對象的實例可以通過SqlSessionFactoryBuilder對象類獲得,而SqlSessionFactoryBuilder則可以從XML配置文件或一個預(yù)先定制的Configuration的實例構(gòu)建出SqlSessionFactory的實例.每一個MyBatis的應(yīng)用程序都以一個SqlSessionFactory對象的實例為核心.同時SqlSessionFactory也是線程安全的,SqlSessionFactory一旦被創(chuàng)建,應(yīng)該在應(yīng)用執(zhí)行期間都存在.在應(yīng)用運行期間不要重復(fù)創(chuàng)建多次,建議使用單例模式.SqlSessionFactory是創(chuàng)建SqlSession的工廠.

//SqlSessionFactory接口源碼如下所示:

package org.apache.ibatis.session;

import java.sql.Connection;

public interface SqlSessionFactory {

  SqlSession openSession();//這個方法最經(jīng)常用,用來創(chuàng)建SqlSession對象.

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

}

二、SqlSession
SqlSession是MyBatis的關(guān)鍵對象,是執(zhí)行持久化操作的獨享,類似于JDBC中的Connection.它是應(yīng)用程序與持久層之間執(zhí)行交互操作的一個單線程對象,也是MyBatis執(zhí)行持久化操作的關(guān)鍵對象.SqlSession對象完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行SQL操作的方法,它的底層封裝了JDBC連接,可以用SqlSession實例來直接執(zhí)行被映射的SQL語句.每個線程都應(yīng)該有它自己的SqlSession實例.SqlSession的實例不能被共享,同時SqlSession也是線程不安全的,絕對不能講SqlSeesion實例的引用放在一個類的靜態(tài)字段甚至是實例字段中.也絕不能將SqlSession實例的引用放在任何類型的管理范圍中,比如Servlet當(dāng)中的HttpSession對象中.使用完SqlSeesion之后關(guān)閉Session很重要,應(yīng)該確保使用finally塊來關(guān)閉它.
 

//SqlSession接口源碼如下所示:

package org.apache.ibatis.session;

import java.io.Closeable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.executor.BatchResult;

public interface SqlSession extends Closeable {

   T selectOne(String statement);

   T selectOne(String statement, Object parameter);

   List selectList(String statement);

   List selectList(String statement, Object parameter);

   List selectList(String statement, Object parameter, RowBounds rowBounds);

   Map selectMap(String statement, String mapKey);

   Map selectMap(String statement, Object parameter, String mapKey);

   Map selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);

  void select(String statement, Object parameter, ResultHandler handler);

  void select(String statement, ResultHandler handler);

  void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);

  int insert(String statement);

  int insert(String statement, Object parameter);

  int update(String statement);

  int update(String statement, Object parameter);

  int delete(String statement);

  int delete(String statement, Object parameter);

  void commit();

  void commit(boolean force);

  void rollback();

  void rollback(boolean force);

  List flushStatements();

  void close();

  void clearCache();

  Configuration getConfiguration();

   T getMapper(Class type);

  Connection getConnection();
}

三、SqlSessionFactory和SqlSession實現(xiàn)過程

mybatis框架主要是圍繞著SqlSessionFactory進行的,創(chuàng)建過程大概如下:

    (1)、定義一個Configuration對象,其中包含數(shù)據(jù)源、事務(wù)、mapper文件資源以及影響數(shù)據(jù)庫行為屬性設(shè)置settings

    (2)、通過配置對象,則可以創(chuàng)建一個SqlSessionFactoryBuilder對象

    (3)、通過 SqlSessionFactoryBuilder 獲得SqlSessionFactory 的實例。

    (4)、SqlSessionFactory 的實例可以獲得操作數(shù)據(jù)的SqlSession實例,通過這個實例對數(shù)據(jù)庫進行操作

并且如果想按照上述方式得到SqlSessionFactory,最好使用下面的mybatis-config.xml類似的配置.在這里mybatis-config.xml配置文件是沒有和Spring配置文件整合過得,如果項目中mybaits的配置文件和Spring配置文件整合過了,則下面的代碼運行估計會出錯,因為一般spring和mybatis整合過之后,mybatis的配置文件基本沒有存在的必要了,之前在mybatis中配置的數(shù)據(jù)源和事務(wù)這兩個方面,一般的做法都會spring的配置文件,則下面的代碼加載mybatis-config.xml的時候,得不到必要的信息,創(chuàng)建的過程中會有問題.所以在這里先給一份mybatis-config.xml單獨的配置文件.
 

  
  

   
      
      

      
      
          
      

      
      

          
          
              
              
              
              
                  
                  
                  
                  
                  
              
          

          
          
              
              
              
              
                  
                  
                  
                  
                  
              
          
      

      
      
          
      

下面的這行代碼功能是通過配置文件mybatis-config.xml,創(chuàng)建SqlSessionFactory對象,然后產(chǎn)生SqlSession,執(zhí)行SQL語句.而mybatis的初始化發(fā)生在:

SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(resourceAsStream);

如果是spring和mybaits整合之后的配置文件,一般以這種方式實現(xiàn),SqlSessionFactory的創(chuàng)建:


        
        
        

關(guān)于SqlSessionFactory和SqlSession兩個對象給一個具體的使用過程:

package com.cn.testIUserService;

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;

import com.cn.entity.User;

public class MyBatisTest {

    public static void main(String[] args) {
        try {
            //讀取mybatis-config.xml文件
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            //初始化mybatis,創(chuàng)建SqlSessionFactory類的實例
            SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(resourceAsStream);
            //創(chuàng)建session實例
            SqlSession session = sqlSessionFactory.openSession();
            /*
             * 接下來在這里做很多事情,到目前為止,目的已經(jīng)達到得到了SqlSession對象.通過調(diào)用SqlSession里面的方法,
             * 可以測試MyBatis和Dao層接口方法之間的正確性,當(dāng)然也可以做別的很多事情,在這里就不列舉了
             */
            //插入數(shù)據(jù)
            User user = new User();
            user.setC_password("123");
            user.setC_username("123");
            user.setC_salt("123");
            //第一個參數(shù)為方法的完全限定名:位置信息+映射文件當(dāng)中的id
            session.insert("com.cn.dao.UserMapping.insertUserInformation", user);
            //提交事務(wù)
            session.commit();
            //關(guān)閉session
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

針對上面的代碼給出詳細的說明關(guān)于SqlSessionFactory和SqlSession創(chuàng)建過程涉及的內(nèi)容.

SqlSessionFactory和SqlSession怎么在MyBatis中使用

結(jié)合上述SqlSessionFactory和SqlSession使用過程和結(jié)構(gòu)圖,涉及到的方法為下面步驟,結(jié)合源碼中的方法為下面的步驟:

第一步首先SqlSessionFactoryBuilder去讀取mybatis的配置文件,然后build一個DefaultSqlSessionFactory,即得到SqlSessionFactory

//源碼中涉及的包和具體方法為:
//涉及的包為:package org.apache.ibatis.session;

//第一個類為:SqlSessionFactoryBuilder,設(shè)計到此類的方法為下面部分:
public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      //通過XMLConfigBuilder解析配置文件,解析的配置相關(guān)信息都會封裝為一個Configuration對象
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      //然后返回一個DefaultSqlSessionFactory
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

 //得到DefaultSqlSessionFactory
 public SqlSessionFactory build(Configuration config) {
   return new DefaultSqlSessionFactory(config);
 }

//第二個類為:DefaultSqlSessionFactory,涉及的方法為:
  public DefaultSqlSessionFactory(Configuration configuration) {
    this.configuration = configuration;
  }

第二步,獲取到SqlSessionFactory之后,就可以利用SqlSessionFactory方法的openSession來獲取SqlSession對象了。

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
  Transaction tx = null;
  try {
    //通過Confuguration對象去獲取Mybatis相關(guān)配置信息, Environment對象包含了數(shù)據(jù)源和事務(wù)的配置
    // execType為執(zhí)行器類型,配置文件中定義
    // SimpleExecutor -- SIMPLE 就是普通的執(zhí)行器。
    //ReuseExecutor -執(zhí)行器會重用預(yù)處理語句(prepared statements)
    //BatchExecutor --它是批量執(zhí)行器
    final Environment environment = configuration.getEnvironment();
    final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
    tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
    //定義執(zhí)行器,是對statement的封裝
    final Executor executor = configuration.newExecutor(tx, execType);
    //最后返回一個SqlSession
    return new DefaultSqlSession(configuration, executor, autoCommit);
  } catch (Exception e) {
    closeTransaction(tx); // may have fetched a connection so lets call close()
    throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
  } finally {
    ErrorContext.instance().reset();
  }
}

得到SqlSession對象之后就可以利用SqlSession內(nèi)部的方法進行CRUD操作了。

注意一點,Connection對象是在SqlSession對象創(chuàng)建之后進行CURD操作中創(chuàng)建的。深入查找之后找到在ManagedTransaction類中找到獲取Connection對象的關(guān)鍵代碼如下:

protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    //dataSource 來源有三種,JndiDatasource,PooledDataSource,UnpooledDataSource,配置文件中定義
    this.connection = this.dataSource.getConnection();
    if (this.level != null) {
      this.connection.setTransactionIsolation(this.level.getLevel());
    }
  }

PooledDataSource和UnPooledDataSource的區(qū)別是PooledDataSource使用了連接池。為什么使用連接池呢?因為創(chuàng)建一個Connection對象的過程,在底層就相當(dāng)于和數(shù)據(jù)庫建立的通信連接,在建立通信連接的過程,消耗了非常多的時間,而往往我們建立連接后(即創(chuàng)建Connection對象后),就執(zhí)行一個簡單的SQL語句,然后就要拋棄掉,這是一個非常大的資源浪費!mybatis針對這一個問題提出的PooledDataSource使用了連接池。關(guān)于數(shù)據(jù)庫連接池的知識點,可以自行百度,在這里就不擴展介紹了.

關(guān)于SqlSessionFactory和SqlSession怎么在MyBatis中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享名稱:SqlSessionFactory和SqlSession怎么在MyBatis中使用
當(dāng)前鏈接:http://weahome.cn/article/geccjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部