返回顶部
首页 > 资讯 > 数据库 >如何理解SqlSession技术
  • 558
分享到

如何理解SqlSession技术

2024-04-02 19:04:59 558人浏览 泡泡鱼
摘要

这篇文章主要介绍“如何理解sqlSession技术”,在日常操作中,相信很多人在如何理解SqlSession技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解SqlS

这篇文章主要介绍“如何理解sqlSession技术”,在日常操作中,相信很多人在如何理解SqlSession技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解SqlSession技术”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

老规矩,先上案例代码,我们按照这个案例一步一步的搞定mybatis源码

public class MybatisApplication {     public static final String URL = "jdbc:Mysql://localhost:3306/mblog";     public static final String USER = "root";     public static final String PASSWord = "123456";      public static void main(String[] args) {         String resource = "mybatis-config.xml";         InputStream inputStream = null;         SqlSession sqlSession = null;         try {             inputStream = Resources.getResourceAsStream(resource);             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);             sqlSession = sqlSessionFactory.openSession();             UserMapper userMapper = sqlSession.getMapper(UserMapper.class);             System.out.println(userMapper.selectById(1));          } catch (Exception e) {             e.printStackTrace();         } finally {             try {                 inputStream.close();             } catch (IOException e) {                 e.printStackTrace();             }             sqlSession.close();         }     }

由于很多小伙伴在催,说Mybatis源码系列好像何时才有下文了,为此老田熬夜写了这篇。

继续开撸~~

SqlSession sqlSession = sqlSessionFactory.openSession();

前面那篇文章已经分析了,这里的sqlSessionFactory其实就是DefaultSqlSessionFactory。

所以这里,我们就从DefaultSqlSessionFactory里的openSession方法开始。

public class DefaultSqlSessionFactory implements SqlSessionFactory {    private final Configuration configuration;    public DefaultSqlSessionFactory(Configuration configuration) {     this.configuration = configuration;   }   //创建session,这个方法直接调用本类中的另外一个方法   @Override   public SqlSession openSession() {     return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);   }   //其实是调用这个方法   private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {     Transaction tx = null;     try {       //对应xml标签<environments> ,这个在配置文件解析的时候就已经存放到configuration中了。       final Environment environment = configuration.getEnvironment();       final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);       tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);       //创建一个executor来执行SQL         final Executor executor = configuration.newExecutor(tx, execType);       //这里也说明了,为什么我们代码里的SqlSession是DefaultSqlSession       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();     }   }        private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) {     if (environment == null || environment.getTransactionFactory() == null) {       return new ManagedTransactionFactory();     }     return environment.getTransactionFactory();   }

这个方法中的主要内容有:

如何理解SqlSession技术

下面我们就来逐个攻破。

创建事务Transaction

事务工厂类型可以配置为JDBC类型或者MANAGED类型。

如何理解SqlSession技术

JdbcTransactionFactory生产JdbcTransaction。

ManagedTransactionFactory生产ManagedTransaction。

如果配置的JDBC,则会使用Connection对象的commit()、rollback()、close()方法来管理事务。

如果我们配置的是MANAGED,会把事务交给容器来管理,比如JBOSS,WEBlogic。因为我们是本地跑的程序,如果配置成MANAGED就会不有任何事务。

但是,如果我们项目中是spring集成Mybatis,则没有必要配置事务,因为我们会直接在applicationContext.xml里配置数据源和事务管理器,从而覆盖Mybatis的配置。

创建执行器Executor

调用configuration的newExecutor方法创建Executor。

final Executor executor = configuration.newExecutor(tx, execType); //Configuration中 public Executor newExecutor(Transaction transaction, ExecutorType executorType) {     executorType = executorType == null ? defaultExecutorType : executorType;     executorType = executorType == null ? ExecutorType.SIMPLE : executorType;     Executor executor;     //第一步     if (ExecutorType.BATCH == executorType) {       executor = new BatchExecutor(this, transaction);     } else if (ExecutorType.REUSE == executorType) {       executor = new ReuseExecutor(this, transaction);     } else {       executor = new SimpleExecutor(this, transaction);     }     //第二步     if (cacheEnabled) {       executor = new CachingExecutor(executor);     }     //第三步     executor = (Executor) interceptorChain.pluginAll(executor);     return executor;   }

此方法分三个步骤。

第一步:创建执行器

Executor的基本类型有三种:

public enum ExecutorType {   SIMPLE, REUSE, BATCH }

SIMPLE为默认类型。

如何理解SqlSession技术

为什么要让抽象类BaseExecutor实现Executor接口,然后让具体实现类继承抽象类呢?

这就是模板方法模式的实现。

模板方法模式就是定义一个算法骨架,并允许子类为一个或者多个步骤提供实现。模板方法是得子类可以再不改变算法结构的情况下,重新定义算法的某些步骤。

抽象方法是在子类汇总实现的,每种执行器自己实现自己的逻辑,BaseExecutor最终会调用到具体的子类中。

抽象方法

protected abstract int doUpdate(MappedStatement ms, Object parameter) throws SQLException;  protected abstract List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException;  protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException;  protected abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)  throws SQLException;

第二步:缓存装饰

在上面代码中的第二步

if (cacheEnabled) {       executor = new CachingExecutor(executor); }

如果cacheEnabled=true,会用装饰器设计模式对Executor进行装饰。

第三步:插件代理缓存装饰完后,就会执行

executor = (Executor) interceptorChain.pluginAll(executor);

这里会对Executor植入插件逻辑。

比如:分页插件中就需要把插件植入的Executor

如何理解SqlSession技术

好了,到此,执行器创建的就搞定了。

创建DefaultSqlSession对象

把前面解析配置文件创建的Configuration对象和创建的执行器Executor赋给DefaultSqlSession中的属性。

public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {   this.configuration = configuration;   this.executor = executor;   this.dirty = false;   this.autoCommit = autoCommit; }

到这里,SqlSession(DefaultSqlSession)对象就创建完毕。

到此,关于“如何理解SqlSession技术”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何理解SqlSession技术

本文链接: https://lsjlt.com/news/61926.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解SqlSession技术
    这篇文章主要介绍“如何理解SqlSession技术”,在日常操作中,相信很多人在如何理解SqlSession技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解SqlS...
    99+
    2024-04-02
  • 如何理解Hibernate技术
    这篇文章主要介绍“如何理解Hibernate技术”,在日常操作中,相信很多人在如何理解Hibernate技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Hibernate技术”的疑惑有所帮助!接下来...
    99+
    2023-06-15
  • 如何理解Raid技术
    如何理解Raid技术,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),...
    99+
    2023-06-04
  • 如何理解AJAX开发技术
    本篇内容介绍了“如何理解AJAX开发技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!AJAX(Async...
    99+
    2024-04-02
  • 如何理解Java反射技术
    本篇内容介绍了“如何理解Java反射技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前期概要1、 什么是反射Java 反射机制在程序运...
    99+
    2023-06-02
  • 如何理解IPv6过渡技术中的NAT-PT技术
    这篇文章将为大家详细讲解有关如何理解IPv6过渡技术中的NAT-PT技术,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。       IPv6的应用是一...
    99+
    2023-06-03
  • 如何理解IPv6过渡技术中的双栈技术
    这期内容当中小编将会给大家带来有关如何理解IPv6过渡技术中的双栈技术,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。       IPv6经过20多年的发展研究实验...
    99+
    2023-06-03
  • 如何理解IPv6过渡技术中的隧道技术
    如何理解IPv6过渡技术中的隧道技术,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。       基于互联网的快速发展,IPv4地址即将使...
    99+
    2023-06-03
  • 如何理解Ubuntu Linux技术应用
    本篇文章给大家分享的是有关如何理解Ubuntu Linux技术应用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。特别值得一提的是Ubuntu有很多值得学习的地方,这里我们主要介...
    99+
    2023-06-17
  • 如何理解MySQL的索引技术?
    如何理解MySQL的索引技术?在数据库中,索引是一种提高查询效率的重要技术。MySQL作为一种流行的关系型数据库管理系统,其索引技术的运用能够显著提升查询性能。本文将从索引的定义、类型、创建和优化几个方面来解析MySQL的索引技术。首先,索...
    99+
    2023-10-22
    MySQL 索引技术
  • 如何理解Linux故障定位技术
    本篇文章为大家展示了如何理解Linux故障定位技术,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主要是来了解并学习linux中故障定位技术的学习,故障定位技术分为在线故障定位和离线故障定位。故障定位...
    99+
    2023-06-16
  • 如何理解Fedora 7配置DNS技术
    如何理解Fedora 7配置DNS技术,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。经过长时间学习Fedora 7配置DNS,Fedora 7配置DNS能提高更方便的使用性能。...
    99+
    2023-06-17
  • 零拷贝Zero-Copy技术如何理解
    这篇文章将为大家详细讲解有关零拷贝Zero-Copy技术如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 1.前言今天和大家一起学习个底层技术点-零拷贝Zero-Copy。L...
    99+
    2023-06-15
  • 如何快速理解MySQL核心技术?
    如何快速理解MySQL核心技术?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种应用程序和网站开发中。理解MySQL的核心技术对于数据库开发和管理非常关键。本文将介绍一些快速理解MySQL核心技术的方法和建议。首先,了解MySQL...
    99+
    2023-10-22
    MySQL 数据库 核心技术
  • 如何理解JVM for Linux JIT诊断技术
    如何理解JVM for Linux JIT诊断技术,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JVM有很多值得学习的地方,简要介绍Just-In-Time(JIT)编译器...
    99+
    2023-06-17
  • Java内存模型技术该如何理解
    Java内存模型技术该如何理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  因为Java内存模型不仅是Java重点要学习的技术知识,还是面试的时候经典面试题,希望引起同...
    99+
    2023-06-02
  • 如何理解javascript面向对象技术基础
    这篇文章给大家介绍如何理解javascript面向对象技术基础,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。数组我们已经提到过,对象是无序数据的集合,而数组则是有序数据的集合,数组中的...
    99+
    2024-04-02
  • 如何理解MySQL的分页和排序技术?
    如何理解MySQL的分页和排序技术?概述:MySQL是一个广泛使用的关系型数据库管理系统,它提供了丰富的功能和技术,其中包括了分页和排序技术。分页技术可以用来显示大量数据的部分内容,而排序技术则可以对数据按照特定规则进行排序。在实际应用中,...
    99+
    2023-10-22
    分页 MySQL 排序
  • 如何理解Oracle系统数据的复制技术
    本篇文章为大家展示了Oracle系统数据的复制技术,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数据复制的实现下面我们举一个例子来说明各步具体需要完成的工作。在这个...
    99+
    2024-04-02
  • 如何理解MySQL的锁和并发控制技术?
    如何理解MySQL的锁和并发控制技术?MySQL是一种常用的关系型数据库管理系统,它支持并发访问和操作数据,同时也提供了一些锁和并发控制技术,以保证数据的一致性和并发性。本文将详细介绍MySQL的锁和并发控制技术,并通过代码示例来加深理解。...
    99+
    2023-10-22
    MySQL 并发控制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作