《mybatis 3 源码深度解析》
内容来自书《mybatis 3 源码深度解析》的整理,后续会写一下自己的总结
外外外
这个作者很懒,什么都没留下…
展开
-
NoClassDefFoundError: com/baomidou/mybatisplus/plugins/Page
现象描述:A项目调用B项目的接囗(dubbo调用)报错原因:B项目的接囗传参里使用了mybatis-plus的Page类,A项目中使用的mybatis-plus的版本是3.1.0,Page所在包为com.baomidou.mybatisplus.extension.plugins.pagination,B项目中使用的mybatis-plus的版本是2.1.9,page所在包为com.baomidou.mybatisplus.plugins因为mybatis-plus新旧版本的page不兼容,所以导原创 2021-03-31 11:39:07 · 6697 阅读 · 0 评论 -
MyBatis 源码学习17——学习总结
之前的内容都是总结至《MyBatis 3 源码深度解析》之前看的时候不知道重点,就每章都整理了下,一年过去了,回看这些内容,总结下学习重点,主要是四点一、Configuration类的三种作用1.控制MyBatis运行时的行为2.容器:存放TypeHandler(类型处理器)、Mapper、 SQL’,3.组件的工厂类:Executor、StatementHandler、ResultSetHandler、ParameterHandler,方便实现插件拦截二、MyBatis各组件与JDBC各组件之原创 2021-03-15 10:20:55 · 143 阅读 · 2 评论 -
MyBatis 源码学习16——MyBatis与Spring整合(下)
四、Mapper动态代理对象注册过程Spring框架启动时:会扫描指定路径下的Mapper接口,将Mapper接口转换为Spring中的BeanDefinition对象,并且beanClass属性为MapperFactoryBean,Spring框架在所有的Bean配置转换为BeanDefinition对象后,就会根据BeanDefinition对象的beanClass属性创建Bean的实例。Spring框架启动后:每个Mapper接口创建一个MapperFactoryBean对象,当我们通过Ma原创 2020-05-13 22:13:56 · 229 阅读 · 0 评论 -
MyBatis 源码学习15——MyBatis与Spring整合(上)
一、MyBatis与Spring整合MyBatis与Spring框架通过MyBatis Spring模块进行整合。整合原理:MyBatis的Mapper实例是通过动态代理创建的。与Spring框架整合后,MyBatis中的Mapper动态代理对象会作为Spring框架中的Bean注册到Spring容器中。Bean的配置如下:Spring配置Bean的方式有多种,例如XML文件、Java注解以及JavaConfig等方式。这里我们使用JavaConfig方式配置:1.配置数据源对象2.配置Sql原创 2020-05-13 00:06:42 · 216 阅读 · 0 评论 -
MyBatis 源码学习14——级联映射及懒加载
MyBatis级联映射及懒加载MyBatis Mapper配置中通过<association>标签建立一对一映射,通过<collection>标签建立一对多映射。<association>和<collection>标签有两种映射方式:一种是为Java实体属性关联一个外部的查询Mapper,MyBatis实际上为实体的属性执行一次额外的查询操作;一种是为实体属性的每个字段配置映射,然后通过JOIN语句进行关联查询。除此还有一种额外标签Discrimin原创 2020-05-12 23:46:40 · 302 阅读 · 0 评论 -
MyBatis 源码学习13——ResultMap
一、ResultMap:ResultMap:保存Java实体属性与数据库表字段之间的映射关系,是实现级联映射和懒加载机制的基础。MyBatis是一个半自动化的ORM框架,可以将数据库中的记录转换为Java实体对象,但是Java实体属性通常采用驼峰命名法,而数据库字段习惯采用下画线分割命名法,因此需要用户指定Java实体属性与数据库表字段之间的映射关系。MyBatis的Mapper配置中提供了一个<resultMap>标签,用于建立数据库字段与Java实体属性之间的映射关系。<r原创 2020-05-12 23:45:57 · 699 阅读 · 0 评论 -
MyBatis 源码学习12——MyBatis插件原理及应用
MyBatis插件:通过<plugins>标签配置,以拦截器的方式实现,可以方便地改变SQL的执行行为,例如在SQL执行时追加SQL分页语法达到简化分页查询的目的。MyBatis支持对Executor、ParameterHandler、ResultSetHandler、StatementHandler四种组件的方法进行拦截。一、拦截器的注册过程:先看下Configuration类,它维护了一个interceptorChain属性,这个属性是一个拦截器链,用于存放通过<plugin原创 2020-05-12 23:06:24 · 167 阅读 · 0 评论 -
MyBatis 源码学习11——动态SQL实现原理(下)
五、动态SQL解析过程SqlSource用于描述通过XML文件或者Java注解配置的SQL资源信息;SqlNode用于描述动态SQL中<if>、<where>等标签信息;LanguageDriver用于对Mapper SQL配置进行解析,将SQL配置转换为SqlSource对象。MyBatis动态SQL的解析过程,主要分为两部分:1.使用LanguageDriver解析sql语句,将解析后sqlNode对象放入SqlSource对象中,并SqlSource对象放入Mappe原创 2020-05-12 00:59:32 · 280 阅读 · 1 评论 -
MyBatis 源码学习10——动态SQL实现原理(上)
一、动态SQL的使用动态SQL:事先无法预知具体的条件,需要在运行时根据具体的情况动态地生成SQL语句。使用MyBatis动态SQL进行条件查询的一个案例:MyBatis动态SQL相关的标签:• <if>:通过OGNL表达式判断参数内容是否为空,如果表达式结果为true,则MyBatis框架会自动拼接标签内的SQL内容,否则会对标签内的SQL片段进行忽略• <where>:用于保证至少有一个查询条件时,才会在SQL语句中追加WHERE关键字,同时能够剔除WHERE关键字后原创 2020-05-11 21:15:05 · 741 阅读 · 0 评论 -
MyBatis 源码学习9——MyBatis日志
一、Java日志体系目前比较常用的日志框架:Log4j:一个基于Java的日志记录工具,现在则是Apache软件基金会的一个项目。Log4j 2:Apache Log4j 2是Apache开发的一款Log4j的升级产品。Commons Logging:Apache基金会所属的项目,是一套Java日志接口。SLF4J:类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。Logback:一套日志组件的实现,属于SLF4J阵营。JUL:全称是Java Util Lo原创 2020-05-11 20:57:06 · 306 阅读 · 0 评论 -
MyBatis 源码学习8——MyBatis缓存
在应用程序和数据库都是单节点的情况下,合理使用缓存能够减少数据库IO,能显著提升系统性能。但是现在大多是分布式环境,如果使用不当,则可能带来数据一致性问题。MyBatis提供了一级缓存和二级缓存,其中一级缓存基于SqlSession实现,二级缓存基于Mapper实现。一、MyBatis缓存的使用MyBatis的缓存分为一级缓存和二级缓存,一级缓存默认是开启的,而且不能关闭,用户只能控制缓存的级别。MyBatis核心开发人员解释:MyBatis的一些关键特性例如通过<association&g原创 2020-05-08 23:06:06 · 240 阅读 · 0 评论 -
MyBatis 源码学习7——SqlSession执行Mapper过程(下)
三、Mapper方法调用过程详解用SqlSession对象的getMapper()方法获取一个动态代理对象,然后通过代理对象调用方法,即执行MapperProxy类的invoke()方法:详细看下MapperProxy类的invoke()方法实现,1.如果方法是从Object类继承的,不做任何处理,2.如果是Mapper接口中定义的方法,调用cachedMapperMethod()方法获取一个MapperMethod对象。其中,cachedMapperMethod()方法中对MapperMeth原创 2020-05-08 22:38:38 · 613 阅读 · 0 评论 -
MyBatis 源码学习6——SqlSession执行Mapper过程(上)
Mapper由两部分组成:Mapper接口和通过注解或者XML文件配置的SQL语句。SqlSession执行Mapper过程主要分为4个阶段:1.Mapper接口的注册过程,2.MappedStatement对象的注册过程,3.Mapper方法的调用过程,4.SqlSession执行Mapper的过程。一、Mapper接口的注册过程Mapper接口:定义执行SQL语句相关的方法,方法名一般和Mapper XML配置文件中<select|update|delete|insert>标原创 2020-05-08 21:52:36 · 389 阅读 · 0 评论 -
MyBatis 源码学习5——SqlSession创建过程
SqlSession的创建过程SqlSession对象表示MyBaits框架与数据库建立的会话,我们通过SqlSession实例完成对数据库的增删改查操作。下面开始了解SqlSession实例的创建过程,主要分为3个阶段:1.Configuration实例的创建过程2.SqlSessionFactory实例的创建过程3.SqlSession实例化的过程一、XPath方式解析XML文件...原创 2020-05-07 23:01:35 · 644 阅读 · 0 评论 -
MyBatis 源码学习4——Mybatis核心组件(下)
五、MappedStatementMappedStatement:描述<select|update|insert|delete>或者@Select、@Update等注解配置的SQL信息。<select>标签中的常用属性:id:命名空间中唯一的标识符,可以被用来引用这条配置信息。parameterType:用于指定这条语句的参数类的完全限定名或别名。MyBatis能...原创 2020-05-07 22:33:24 · 285 阅读 · 0 评论 -
MyBatis 源码学习3——Mybatis核心组件(上)
一、MyBatis框架操作数据库,步骤:1.编写MyBatis的主配置文件2.新增Java实体与数据库表建立映射:MyBatis属于半自动化的ORM框架,可以将数据库中的数据转换为Java实体,因此需要一个Java实体类与数据库中的表相对应,可以使用了Lombok工具,通过注解为Java类的属性自动生成Setter/Getter方法,消除冗余代码。3.定义用于执行SQL的Mapper:M...原创 2020-05-06 23:33:29 · 258 阅读 · 0 评论 -
MyBatis 源码学习2——Mybatis常用工具类
一、org.apache.ibatis.jdbc.SQLSQL工具类:继承至AbstractSQL,只重写了该类的getSelf()方法 @Override public SQL getSelf() { return this; }AbstractSQL:内部维护了一个SQLStatement内部类,用于描述一个sql语句,作用是拼接sql。具体实现1.在调用SEL...原创 2020-05-06 22:58:21 · 596 阅读 · 0 评论 -
MyBatis 源码学习1——JDBC规范
mybatis框架是对JDBC API的轻量级封闭,所以先学习下JDBC规范。一、JDBC API简介JDBC(java database connectivity):java语言中提供的访问关系型数据库的接囗。二、JDBC操作数据源的步骤:1.与数据源建立连接:API中定义了Connection接囗,用来表示与底层数据源的连接。有两种获得Connection对象的方式a.Driver...原创 2020-05-05 23:41:41 · 387 阅读 · 0 评论