深入理解mybatis

MyBatis-Plus与SpringBoot整合(01--SqlSessionFactory的注入) 然后继续看MybatisSqlSessionFactoryBuilder【3】的build方法, 里面调用了super.build(configuration),该类继承了mybatis的SqlSessionFactoryBuilder类。第二,我们看类上的关键方法sqlSessionFactory,通过Bean结合FactoryBean机制进行SqlSessionFactory的注入(FactoryBean的实际运用实例)第二种情况才是最常见、最重要的,毕竟谁也不会一直跑一个空项目吧。 阅读详情

Mybatis组件时序图

SqlSessionFactoryBuilder类通过读取Configuration.xml文件的配置调用build()方法生成SqlSessionFactory对象。集成了spring的话,spring容器在启动的时候会就会加载好SqlSessionFacotry这对象也是调用这个类build()的方法。

SqlSession是当一个请求进来的时候SqlSessionFactory会通过openSession方法创建一个新的实例对象sqlSession 


一、配置
Configuration这是一个配置对象,存放的是Configuration.xml里面的我们对于mybatis的一些配置,项目初始化的时候加载
Environment是一个数据源配置配置对象,也是配置在Configuration.xml里面的Environment标签。项目初始化的时候就加载好了(我们用的是alibaba的druid数据源)



二、事务
结合图openSession方法其中的TransactionFactory是mybatis的事务管理(工厂模式)
mybatis的本身事务管理机制分成两种
    1、使用JDBC事务管理机,这种机制会生成一个JdbcTransaction对象有。也就是调用java.sql.Connection来进行管理
    2、使用容器的管理机制也就是ManagedTransaction这个对象来管理事务。这种方式程序本身是不会去 管理事务了,即使在程序中执行了commit和rollback也没用。因为程序本身不对事务进行管理了。这个事务管理交给容器
如果mybatis集成了spring 而是使用org.mybatis.spring包里面的SpringManagedTransaction来进行管理(spring容器进行事务管理)

三、sqlSession和Executor执行器

sqlSession默认实现类defaultSqlSession, 在这个对象中它执有configuration对象和executor对象。
configuration对象就是我们上面提到的一个配置对像,根据Configuration.xml配置文件而来的一个对象

查看DefaultSqlSession的源码,可以发现它所有的操作都通过executor对象在调用。其实sqlSession就像只是对外暴露的一个接口,而真正对数据的交互是由executor来进行操作的。sqlSession其实只是对Executor一个包装。
而Executor才是真正的工作者。Executor的实现类分别是以下三种,以下是它们的区别和它们的关系图

1.SimpleExecutor是mybatis默认的实现类。它的特性是每对数据进行一次交互会关闭掉statement
2.ReuseExecutor会对statement进行重复使用。对数据库操作执行完成之后会把statement放在一个map里面,key是执行的sql,value就是本次执行的statement对象。如果本次会话再次对数据进行操作。
那么这个执行器会根据sql去调用这个map里面statement去执行没有则创建并存放到map里同。而不是重新去实例化一个新的statement对象。
3.BatchExecutor支持批量操作

注:statement 就是java自带的jdbc的数据操作对象

以下是它们之间的类图(策略模式) 


四、缓存

CachingExexutor是mybatis二级缓存机制的体现,它也实现了Executor这个接口 (装饰者模式),
mybatis缓存机制分一级缓存和二级缓存,
1.一级缓存是session会话级,一次会话创建一个缓存对象这个缓存对象在本次会话是共享的,会话结束缓存对象也就销毁了,一次SqlSession会创建一个executor对象。executor对象会执有一个PerpetualCahce缓存对象。
这个缓存对象会将本次的查询结果集放到一个map的value里面。key是根据statementId、sql、param生成
2.二级缓存是application级别,所有会话都可以对这个缓存对象进行操作的。这个缓存是共享的。这个缓存级别粒度非常细。在开发过种中开发者可以自定义缓存实现方式,需要实现Cache接口。需要在maaper文件里面配置通过cache标签配置缓存。
也可以通过cach-ref标签引入别一个mapper里面定义的缓存

注:mybatis是缓存机制是先调用 二级缓存,如果不存在再去调用一级缓存。如果一级缓存也不存在。才会去数据库查。 



先看看SimpleExecutor执行器对一个数据库查询语句是怎么去实现的数据库查询的。首先它会创建一个jdbc statement对象

参数:
    MappedStatement:mapper文件里面sql配置信息
    object parameter: 动态sql语句的参数
    RowBounds: mybais自带的分页功能
    ResultHandler: sql语句返回的结果集处理器,比如我们mapper文件里面配置 resultMap , resultType结果集的处理
    BoundSql: sql语句及一些sql的简单信息,比如sql用几个 ?占位符,几个参数等一些信息。
五、StatementHandler处理器
以下是StatementHandler类图(策略模式) 



StatementHandler默认实现类是RoutingStatementHandler,以下是它的构造方法



statementType是配置在mapper.xml文件sql语句标签上的。   不写的话默认是PREPARED 


这三个StatementHandler。   分别是 statement、PreparedStatement、CallableStatement 
SimpleStatementHandler            

                                                               

PreparedStatementHandler                                                        

CallableStatementHandler



 以下是它们的区别

  1. 1、Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement.
  2.    注:根据这个statement特性。如果一条sql语句使用了这个statement来进行数据操作。那么mybatis的SimpleStatementHandler是不会对参数进行处理的。它会默认认为你这条sql是没有参数的。不会调用mybatis的ParamerHandler来进行参数处理
  3. 2、 PreparedStatement是预编译的,使用PreparedStatement有几个好处(mybatis默认是使用这个)
  4. a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
  5. b. 安全性好,有效防止Sql注入等问题。
  6. c.  对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
  7. d.  代码的可读性和可维护性。
  8. 3、CallableStatement接口扩展 PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。


六、ParamerHandler参数处理

    ParamerHandler的实现类只有一个DefaultParamerHandler,它的主要作用是对参数进行处理。基中mybatis   $ 和 # 这两个符号的处理方式不一样。
$符号处理方式: 会将值直接附到sql上面去,进行预编译,存在sql注入功击。当你不确认这个$符号绑定的那个对象的值时 ,  慎用!!!
#符号处理方式:会采用 ?这个占位符进行预编译。较为安全


七、ResultSetHandler结果集处理

    ResultSetHandler的主要功能是对结果集返回的一个封装。

SqlSession对象

有状态:有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象  ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。

无状态:无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象  .不能保存数据,是不变类,是线程安全的。

因为mybatis的sqlSesssion 执有Exector对象。所以他是一个有状态的对象。官方给出的解释也是说这个对象是非线程安全的。

 但是mybatis对这个对象做了一个封装SqlSessionTemplate对象。SqlSessionTemplate对象主要是对sqlsession做了一个线程安全的实现。就是用java的动态代理。

 sqlsessionTemplate内部执有一个对sqlsession的一个代理对象。这个代理对象的实现就是生成一个新的sqlsession 这个sqlsession对象是从sqlsessionUtil.getsqlsession获取到的。

 这个类是在org.mybatis.spring包下面的是集成了spring的 。   它获取sqlsession的时候会先从spring中去获取。如果开启了spring的事务管理。那么你本次调用的sqlsession就会是你这次会话一个共用的sqlsession, 如果你没有开启事务的话,每次更新就会是一个新的sqlsession

 








mybatis之深入理解 Mybatis是一款半自动的ORM框架,是目前国内Java web开发的主流ORM框架,因此作为一名开发者非常有必要掌握其实现原理,才能更好的解决我们开发中遇到的问题;同时,Mybatis的架构和源码也是很优雅的,使用了大量的设计模式实现解耦以及高扩展性,所以对其设计思想,我们也非常有必要好好理解掌握。(PS:本系列文章基于3.5.0版本分析) 阅读详情

相关推荐

深入理解 MyBatis

通过SqlSessionFactoryBuilder解析Mybatis所有的属性配置,生成一个包含所有的配置信息的Configuration对象。然后用Configuration生成一个DefaultSqlSessionFactory,整个过程的时序图如下获取SqlSessionFactory后,会调用SqlSessionFactory#openSession方法,在这个方法里面会创建一个你的SQL执行器,Sql执行器会代理你配置的拦截器方法。方法。//省略......

m0_67322837的博客 1012

Mybatis-plus 定义SqlSessionFactory

Mybatis-plus 定义SqlSessionFactory

m0_56419249的博客 3614

快速入门,深入理解MyBatis!

MyBatis是一款强大且广泛使用的Java持久层框架,它简化了数据库访问的过程,提供了灵活的SQL映射和对象关系映射(ORM)功能。本文将带你深入了解MyBatis的核心概念和用法,并提供相应的源代码示例,让你快速上手。MyBatis提供了简洁的配置方式和灵活的SQL映射功能,使得开发者可以更加高效地与数据库进行交互。现在,我们已经完成了MyBatis的配置和映射文件的编写。的映射文件,用于定义SQL语句和结果映射规则。在上述配置文件中,我们指定了数据库连接信息和映射文件的位置。假设我们有一个用户表。

NknkCode的博客 123

【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法

其他的帖子大多都停留在 SpringBoot 2版本时代,MyBatis 在2022年11月才对 SpringBoot 3 提供支持,如果其他文章不能解决该报错,那么新的途径如下。

叼辣条闯天涯 6155

深度学习、图像分类入门,从VGG16卷积神经网络开始

刚开始接触深度学习、卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一、我认为学习卷积神经网络必须知道的几个概念: 1、卷积过程:   我们经常说卷积神经网络卷积神经网络,到底什么才是卷积?网络层卷积过程到底怎么实现?我们在这里借鉴了另一位博客大牛的动态图来给大

Errors_In_Life的博客 16万+

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3533

mybatis-plus自定义SqlSessionFactory

mybatis-plus自定义SqlSessionFactory

Coco_chun的博客 2800

【存储原理】IO超时处理 块层block-scsi层之间

【存储原理】IO超时处理 块层block-scsi层之间

sinat_37817094的博客 1025

Mybatis-plus 自定义SqlSessionFactory

项目中需要用到Mybatis的插件,配置插件的时候需要自定义SqlSessionFactory 网上的信息不太准确,本文记录订正并共享大家。 Mybatis-plus 和Mybatis 是兼容的。 所以网上的配置 mybatis 的SqlSessionFactory 的方法基本上可行,但是对于mybatis-plus 的一些特性会丢失 例如 @TableField(fill = FieldFill.INSERT) 注解 正确的配置方式: @Component public class DateAutoFil

keep_learn的专栏 1万+

单片机:实现FFT快速傅里叶变换算法(附完整源码)

单片机:实现FFT快速傅里叶变换算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1103

3步!Spring Boot+OCR引擎秒提身份证/营业执照?手把手教你从零实现!

OCR技术革新文档识别效率 本文演示了如何利用Spring Boot+Tesseract OCR+OpenCV构建自动化文档识别系统。相比传统人工录入,OCR技术可实现: 5秒极速提取身份证/营业执照关键信息 精准识别中文文本(准确率90%+) 正则过滤自动匹配结构化数据 技术要点: OpenCV图像预处理(灰度化+二值化) Tesseract多语言OCR识别 正则表达式精准提取证件号码 效率提升达100倍,错误率降低90%,适用于金融、政务等需要批量处理证件的场景。

java专栏 905

深入理解MyBatis原理 img

深入理解MyBatis原理

weixin_33936401的博客 114

W5500以太网&PoE扩展模块原理图设计,已量产

本文将以 W5500 以太网 & PoE 扩展板为对象,从嵌入式硬件设计的视角,深度拆解其电路架构、核心器件选型、关键功能实现,以及这款板子解决行业痛点的设计思路。

不脱发的程序猿 949

MyBatis源码-深入理解MyBatis Executor的设计思想

文章目录Pre回顾JDBC的执行过程 Pre 如果MyBatis的基础用法还不熟悉,31篇入门博客送给您 https://blog.youkuaiyun.com/yangshangwei/category_7205317.html 回顾JDBC的执行过程

小工匠 2万+

反应动力学仿真软件:Kintecus_(12).高级功能与技巧

Kintecus允许用户自定义复杂的反应方程,包括非线性反应和多相反应。通过自定义反应方程,用户可以更准确地描述实际反应系统。多尺度仿真是指在同一模型中同时考虑不同时间和空间尺度的反应过程。Kintecus提供了工具来处理从微观分子动力学到宏观反应动力学的多尺度仿真。通过本节的学习,您已经掌握了Kintecus的高级功能与技巧,包括复杂反应网络的构建、参数优化与敏感性分析、自定义反应机制、多尺度仿真、并行计算与批处理,以及数据可视化与后处理。

kkchenjj的博客 1048

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

专注于编程、AI、人工智能等多个领域内容研究和分析 641

《深入理解Mybatis原理》MyBatis配置解析过程

配置解析主体方法 javapublic Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //源码中没有这一句,只有 ...

weixin_37007126的博客 95

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入理解《MyBatis核心原理》

本文介绍了MyBatis框架的核心概念与基本使用。MyBatis是一个轻量级半自动化的ORM框架,相比JDBC减少了重复代码,相比Hibernate保留了SQL灵活性。文章详细讲解了MyBatis环境搭建步骤,包括Maven依赖配置、核心配置文件编写、Mapper接口与映射文件定义等。重点分析了MyBatis的核心工作流程,包括SqlSessionFactory创建、动态代理机制实现SQL调用,以及常用动态SQL标签的使用方法。同时介绍了resultType和resultMap两种结果映射方式的应用场景。M

2301_80866152的博客 848

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深入理解MyBatis(七)—MyBatis事务

深入理解MyBatis(七)—MyBatis事务 MyBatis可以通过XML配置文件设定是否进行事务管理, 事务管理主要包括事务的提交,回滚等; 本文主要介绍了事务的入口,MyBatis事务操作对数据库SELECT操作和UPDATE操作的影响等; 个人主页:tuzhenyu’s page 原文地址:深入理解MyBatis(七)—MyBatis事务 (0) M

tuzhenyu的博客 3万+

深入理解MyBatis

深入理解MyBatis statement和preparedstatement区别 statement是语句对象,preparedstatement是预编译语句对象。 前者每次执行都需要安全性检测和编译,后者第一次需要,以后不需要 前者即便执行的语句结构一样但参数不同,但执行一百次仅有参数不同的sql,数据库就要生成100此执行计划,效率很低。而后者可重用第一次的执行计划 前者不安全,比如whe...

caihongjianke的博客 415

深入理解MyBatis(一)—MyBatis基础

深入理解MyBatis(一)—MyBatis基础 MyBatis是一个可以自定义SQL,存储过程和高级映射的ORM框架;相比于传统的JDBC,MyBatis底层维护着数据库连接池避免了连接不断创建销毁带来的资源消耗,同时MyBatis的SQL语句写在配置文件里.实现了代码和SQL的解耦;另外MyBatis提供了数据库表字段与对象属性之间的映射,无需手动创建对象进行属性的赋值; 相

tuzhenyu的博客 1053

Mybatis 深入理解

1. 新增返回主键 1.1 在自增主键使用 useGenerateKeys 1.2 使用函数LAST_INSERT_ID 使用于主键不能自增 2.bind用法 bind标签可以使用 OGNL 表达式创建一个变量并将其绑定到上下文中。在前面的例子中,UserMapper.xml 有一个selectByUser方法,这个方法用到了like查询条件,部分代码如下。 <if test="userName != null and userName != ''"&g...

zzqtty的博客 291

if mybatis or test_mybatis-spring深入理解-理解spring如何集成MyBatis的

mybatis-spring深入理解1.mybatis-spring怎么用用spring了,我们的连接池,事物都交由spring去管理,对mybatis来说,需要利用spring管理的连接池去构建configuration,用sqlsessionFactory去创建session,操作数据库。1)导入mybatis-spring的包org.mybatismybatis-spring1.2.5用哪个...

weixin_34964950的博客 102
下一篇: logback异步输出日志
Psuso_
博客等级 码龄10年 11粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值