Sqlsession 的理解

Sqlsession 的理解MyBatis 的持久化解决方案是将用户从原始的 JDBC 访问中解放出来 用户只需要定义需要操作的 SQL 语句 无须关注底层的 JDBC 操作 就可以以面向对象的方式来进行持久化层操作 底层数据库连接的获取 数据访问的实现 事务控制等都无须用户关心 从而将应用层从底层的 JDBC JTAAPI 抽取出来 通过配置文件管理 JDBC 连接 让 MyBatis 解决持久化的实现 在 MyBatis 中的常见对象有 SqlSes

MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作.底层数据库连接的获取,数据访问的实现,事务控制等都无须用户关心,从而将应用层从底层的JDBC/JTA API抽取出来.通过配置文件管理JDBC连接,让MyBatis解决持久化的实现.在MyBatis中的常见对象有SqlSessionFactory和SqlSession.本文这种介绍一下两者的概念和使用.

一、 SqlSessionFactory

SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory是创建SqlSession的工厂.

 

package org.apache.ibatis.session; import java.sql.Connection; public interface SqlSessionFactory { SqlSession openSession();//这个方法最经常用,用来创建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的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.每个线程都应该有它自己的SqlSession实例.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它.

 1 //SqlSession接口源码如下所示:  2  3 package org.apache.ibatis.session;  4  5 import java.io.Closeable;  6 import java.sql.Connection;  7 import java.util.List;  8 import java.util.Map;  9 10 import org.apache.ibatis.executor.BatchResult; 11 12 public interface SqlSession extends Closeable { 13 14 
    
     T selectOne(String statement);  
    15 
    16 
     
      T selectOne(String statement, Object parameter);  
     17 
     18 
     
       List 
       
        selectList(String statement);  
       19 
       20 
       
         List 
         
          selectList(String statement, Object parameter);  
         21 
         22 
         
           List 
           
            selectList(String statement, Object parameter, RowBounds rowBounds);  
           23 
           24 
           
             Map 
             
              selectMap(String statement, String mapKey);  
             25 
             26 
             
               Map 
               
                selectMap(String statement, Object parameter, String mapKey);  
               27 
               28 
               
                 Map 
                 
                  selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);  
                 29 
                 30 
                 void 
                 select 
                 (String statement, Object parameter, ResultHandler handler);  
                 31 
                 32 
                 void 
                 select 
                 (String statement, ResultHandler handler);  
                 33 
                 34 
                 void 
                 select 
                 (String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);  
                 35 
                 36 
                 int 
                  insert(String statement);  
                 37 
                 38 
                 int 
                  insert(String statement, Object parameter);  
                 39 
                 40 
                 int 
                  update(String statement);  
                 41 
                 42 
                 int 
                  update(String statement, Object parameter);  
                 43 
                 44 
                 int 
                  delete(String statement);  
                 45 
                 46 
                 int 
                  delete(String statement, Object parameter);  
                 47 
                 48 
                 void 
                  commit();  
                 49 
                 50 
                 void 
                  commit(boolean force);  
                 51 
                 52 
                 void 
                  rollback();  
                 53 
                 54 
                 void 
                  rollback(boolean force);  
                 55 
                 56 List 
                  
                   flushStatements();  
                  57 
                  58 
                  void 
                   close();  
                  59 
                  60 
                  void 
                   clearCache();  
                  61 
                  62 
                   Configuration getConfiguration();  
                  63 
                  64 
                  
                    T getMapper(Class 
                    
                     type);  
                    65 
                    66 
                     Connection getConnection();  
                    67 } 
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
   

三、SqlSessionFactory和SqlSession实现过程

 

mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:

(1)、定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings (2)、通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象 (3)、通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。 (4)、SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作 

并且如果想按照上述方式得到SqlSessionFactory,最好使用下面的mybatis-config.xml类似的配置.在这里mybatis-config.xml配置文件是没有和Spring配置文件整合过得,如果项目中mybaits的配置文件和Spring配置文件整合过了,则下面的代码运行估计会出错,因为一般spring和mybatis整合过之后,mybatis的配置文件基本没有存在的必要了,之前在mybatis中配置的数据源和事务这两个方面,一般的做法都会spring的配置文件,则下面的代码加载mybatis-config.xml的时候,得不到必要的信息,创建的过程中会有问题.所以在这里先给一份mybatis-config.xml单独的配置文件. 1
1.0 encoding=UTF-8?> 2 2-//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd>

 3 3 
      
       4 
      4 
       5 
      5 
       
       6 
      6 
      
        " 
       jdbc.properties 
       "> 
        7 
       7 
       
       8 
      8 
       
       9 
      9 
      
        default= 
       " 
       development 
       "> 
       10 
       10 
        
       11 
       11 
       
         " 
        development 
        "> 
        12 
        12 
        
          " 
         JDBC 
         " /> 
         13 
         13 
          
         14 
         14 
         
           " 
          POOLED 
          "> 
          15 
          15 
          
            " 
           driver 
           " value= 
           " 
           ${jdbc.driver} 
           " /> 
           16 
           16 
           
             " 
            url 
            " value= 
            " 
            ${jdbc.url} 
            " /> 
            17 
            17 
            
              " 
             username 
             " value= 
             " 
             ${jdbc.username} 
             " /> 
             18 
             18 
             
               " 
              password 
              " value= 
              " 
              ${jdbc.password} 
              " /> 
              19 
              19 
              
             
            
           
          
         20 
         20 
         
        
       21 
       21 
       
      22 
      22 
       
      
23 23 24 24 " com/ys/mapper/userMapper.xml "/> 25 25 26 26

下面的这行代码功能是通过配置文件mybatis-config.xml,创建SqlSessionFactory对象,然后产生SqlSession,执行SQL语句.而mybatis的初始化发生在:

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

如果是spring和mybaits整合之后的配置文件,一般以这种方式实现,SqlSessionFactory的创建:
" sqlSessionFactory " class= " org.mybatis.spring.SqlSessionFactoryBean "> " dataSource " ref= " dataSource "> " mapperLocations " value= " classpath:com/cn/mapper/*.xml ">

/
*关于SqlSessionFactory和SqlSession两个对象给一个具体的使用过程:
*/
1


package com.cn.testIUserService; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 import com.cn.entity.User; 11 12 public class MyBatisTest { 13 14 public static void main(String[] args) { 15 try { 16 //读取mybatis-config.xml文件 17 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); 18 //初始化mybatis,创建SqlSessionFactory类的实例 19 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); 20 //创建session实例 21 SqlSession session = sqlSessionFactory.openSession(); 22 /* 23 * 接下来在这里做很多事情,到目前为止,目的已经达到得到了SqlSession对象.通过调用SqlSession里面的方法, 24 * 可以测试MyBatis和Dao层接口方法之间的正确性,当然也可以做别的很多事情,在这里就不列举了 25 */ 26 //插入数据 27 User user = new User(); 28 user.setC_password("123"); 29 user.setC_username("123"); 30 user.setC_salt("123"); 31 //第一个参数为方法的完全限定名:位置信息+映射文件当中的id 32 session.insert("com.cn.dao.UserMapping.insertUserInformation", user); 33 //提交事务 34 session.commit(); 35 //关闭session 36 session.close(); 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 }

结合上述SqlSessionFactory和SqlSession使用过程和结构图,涉及到的方法为下面步骤,结合源码中的方法为下面的步骤:
第一步首先SqlSessionFactoryBuilder去读取mybatis的配置文件,然后build一个DefaultSqlSessionFactory,即得到SqlSessionFactory

//源码中涉及的包和具体方法为: //涉及的包为:package org.apache.ibatis.session; //第一个类为:SqlSessionFactoryBuilder,设计到此类的方法为下面部分: public SqlSessionFactory build(InputStream inputStream) { return build(inputStream, null, null); } public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { //通过XMLConfigBuilder解析配置文件,解析的配置相关信息都会封装为一个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对象了。

得到SqlSession对象之后就可以利用SqlSession内部的方法进行CRUD操作了。 注意一点,Connection对象是在SqlSession对象创建之后进行CURD操作中创建的。深入查找之后找到在ManagedTransaction类中找到获取Connection对象的关键代码如下:

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { 2 Transaction tx = null; 3 try { 4 //通过Confuguration对象去获取Mybatis相关配置信息, Environment对象包含了数据源和事务的配置 5 // execType为执行器类型,配置文件中定义 6 // SimpleExecutor -- SIMPLE 就是普通的执行器。 7 //ReuseExecutor -执行器会重用预处理语句(prepared statements) 8 //BatchExecutor --它是批量执行器 9 final Environment environment = configuration.getEnvironment(); 10 final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); 11 tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); 12 //定义执行器,是对statement的封装 13 final Executor executor = configuration.newExecutor(tx, execType); 14 //最后返回一个SqlSession 15 return new DefaultSqlSession(configuration, executor, autoCommit); 16 } catch (Exception e) { 17 closeTransaction(tx); // may have fetched a connection so lets call close() 18 throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); 19 } finally { 20 ErrorContext.instance().reset(); 21 } 22 }

 1 protected void openConnection() throws SQLException {  2 if (log.isDebugEnabled()) {  3 log.debug("Opening JDBC Connection");  4  }  5 //dataSource 来源有三种,JndiDatasource,PooledDataSource,UnpooledDataSource,配置文件中定义  6 this.connection = this.dataSource.getConnection();  7 if (this.level != null) {  8 this.connection.setTransactionIsolation(this.level.getLevel());  9  } 10 }

PooledDataSource和UnPooledDataSource的区别是PooledDataSource使用了连接池。为什么使用连接池呢?因为创建一个Connection对象的过程,在底层就相当于和数据库建立的通信连接,在建立通信连接的过程,消耗了非常多的时间,而往往我们建立连接后(即创建Connection对象后),就执行一个简单的SQL语句,然后就要抛弃掉,这是一个非常大的资源浪费!mybatis针对这一个问题提出的PooledDataSource使用了连接池

——————— 

作者:可乐丶 

来源:CSDN 

原文:https://blog.csdn.net/u0/article/details/ 

版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/minixiong/p/10135257.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228869.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:00
下一篇 2026年3月16日 下午6:00


相关推荐

  • css 重绘和回流

    css 重绘和回流浏览器渲染过程解析 HTML 生成 DOM 树 解析 CSS 生成 CSSOM 树将 DOM 树和 CSSOM 树结合 生成渲染树 RenderTree Layout 回流 根据生成的渲染树 进行回流 Layout 得到节点的几何信息 位置 大小 Painting 重绘 根据渲染树以及回流得到的几何信息 得到节点的绝对像素 Display 将像素发送给 GPU 展示在页面上 比如会在 GPU 将多个合成层合并为同一个层 并展示在页面中 而 css3 硬件加速的原理则是新建合成层 生成渲染树过程从 DOM 树的

    2026年3月18日
    2
  • Java四种引用类型_JAVA引用数据类型

    Java四种引用类型_JAVA引用数据类型今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混。后来在网上查资料,感觉收获颇多,现记录如下。    对象的强、软、弱和虚引用在JDK1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachabl

    2022年4月19日
    56
  • Dialog中使用Printf

    Dialog中使用Printf

    2021年8月20日
    49
  • 热拔插更换硬盘方法

    热拔插更换硬盘方法热拔插更换硬盘方法如果要替换的磁盘已做了镜像,推荐如下步骤:1.删除该磁盘上所有逻辑卷的复件,使用rmlvcopy命令或unmirrorvg命令。2.从卷组中删除该磁盘,使用reducevg命令。3.使用rmdev命令删除该磁盘定义。4.物理移除该磁盘。如果磁盘不是可热交换的(hot-swappable),可能要求重启系统。5.使备用的磁盘可用。如果磁盘是可

    2022年5月30日
    38
  • js 字符串转json对象_json字符串转java对象

    js 字符串转json对象_json字符串转java对象js对象转json字符串将js对象转为json格式的字符串,可以用JSON.stringify方法。varuser1={‘height’:170,’name’:’张三’};varuser1Str=JSON.stringify(user1)console.info(user1Str)typeofuser1Str使用typeof来获取对象user1Str的类型,能看到控制台输出的user1的值以及它的类型string。{“height”:170,“name”:“张三”}“s

    2025年12月16日
    4
  • Mac 本地安装 OpenClaw 详细指南(Qwen/Minimax + 飞书)

    Mac 本地安装 OpenClaw 详细指南(Qwen/Minimax + 飞书)

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号