mybatis
文章平均质量分 81
二狗家有矿
这个作者很懒,什么都没留下…
展开
-
Mybatis源码解析之懒加载(三):序列化
前面我们分析了mybatis的懒加载是通过ProxyFactory生成代理对象以AOP的方式实现的。通过拦截对象的方法,如果发现方法与懒加载的属性相关时才能属性进行加载然后执行相应的方法。但是,这个时候有一个序列化的问题。如果我们对这个懒加载涉及的对象进行了序列化与反序列化,那么反序列化得到的对象属性的正确性吗?如果序列化时对象的所有属性都已经被加载,此时序列化自然是不会对对象造成影响的。那么按照这个思路,我们可以在对对象序列化时加载所有还没有加载的属性以保证正确性,但是这样子无法满足不符合懒加载的按需加转载 2021-04-01 00:11:53 · 462 阅读 · 0 评论 -
Mybatis源码解析之懒加载(二):ProxyFactory
一、ProxyFactory在Mybatis源码解析之DefaultResultSetHandler的handleResultSets方法解析中我们已经分析到,在对查询得到的结果集处理成list时,由ProxyFactory查理懒加载问题。从接口命名就可以看出,mybatis懒加载使用的是代理模式。public interface ProxyFactory { void setProperties(Properties properties); Object createProxy(O转载 2021-04-01 00:09:44 · 294 阅读 · 0 评论 -
Mybatis源码解析之懒加载(一):配置和ResultLoaderMap
在前面的文章里,我们已经提到,mybatis支持懒加载的方式去查询对象的属性。本篇文章,我们将针对懒加载的实现源码展开解析。一. 懒加载的配置1. setting节点在全局配置的setting节点中,有3个配置属性与懒加载相关。proxyFactory 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 以上)lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联...转载 2021-04-01 00:07:43 · 259 阅读 · 0 评论 -
Mybatis源码解析之Spring集成mybatis-spring分析
前面的几篇相关博客都针对原生的mybatis进行解析,从本文开始将针对mybatis和spring的集成进行解析。若无特殊说明,所有的源码都基于org.mybatis:mybatis-spring:1.3.1的jar包一、jar包介绍mybatis-spring是spring与mybatis的集成jar包,因此对spring和mybatis的相关jar包都存在依赖。二、配置文件在spring中集成mybatis框架,主要需要对以下两者进行bean注入。1. SqlSessionFa...转载 2021-04-01 00:05:37 · 356 阅读 · 0 评论 -
Mybatis源码解析之DefaultResultSetHandler的handleResultSets方法解析
ResultSetHandler是Mybatis的核心组件,主要负责将结果集resultSets转化成结果列表(或cursor)和处理储存过程的输出。DefaultResultSetHandler是Myabtis为ResultSetHandler提供的唯一一个实现类,下面我们将深入DefaultResultSetHandler的源码了解其实如何转化结果集resultSet的。一、ResultSetHandlerpublic interface ResultSetHandler { //...转载 2021-03-31 01:50:24 · 1040 阅读 · 0 评论 -
Mybatis源码解析之mapper接口的代理模式
一、简介在mybatis中执行sql时有两种方式,一种是基于statementId,也就是直接调用SqlSession的方法,如sqlSession.update(“statementId”);还有一种方法是基于java接口,也是日常开发中最常用的方式。mapper接口中的每个方法都可以喝mapper xml中的一条sql语句对应,我们可以直接通过调用接口方法的方式进行sql执行。因为mybatis会为mapper接口通过jdk动态代理的方法生成接口的实现类,本篇文章将针对mapper接口的代...转载 2021-03-31 01:47:57 · 240 阅读 · 0 评论 -
Mybatis源码解析之插件机制
为了保证程序的扩展性,提供使用者在框架基础上增强自定义的逻辑处理,mybatis提供了一种基于拦截器的插件机制。一、Interceptor接口public interface Interceptor { //覆盖原来的方法逻辑 Object intercept(Invocation invocation) throws Throwable; //为被拦截的对象生成一个代理对象 Object plugin(Object target);//设置配置的属性值 voi...转载 2021-03-31 01:46:28 · 118 阅读 · 0 评论 -
Mybatis源码解析之缓存机制(二):二级缓存
为了节约每次连接数据库查询数据库的资源消耗,并提高查询效率,Mybatis提供了双重缓存机制,包括HashMap结构的一级缓存和Cache结构的二级缓存。本文主要对二级缓存进行解析。一、缓存机制二、二级缓存的配置及其解析二级缓存又被称作全局缓存,作用域是整个application。1. 全局cacheEnabled参数的配置Mybatis通过setting节点的cacheEnabled参数对Mybatis是否启用二级缓存进行配置。<!--cacheEnabled用...转载 2021-03-31 01:44:51 · 289 阅读 · 0 评论 -
Mybatis源码解析之缓存机制(一):一级缓存
一、CacheKeyCacheKey是每次查询操作的特征值抽象而成的类,用于区别查询是否相同,从而从cache中找到对应的结果。当下列元素相同时,我们认为是相同的查询。(1)statementId(2)要求的查询结果集的范围(RowBounds的offset和limit)(3)传给statement的sql语句(4)传给statement的参数集但是Cachekey并不是简单的直接由这四个元素作为成员变量组成的一个类,而是进一步抽象,并没有限制特征值的数量和类型。CacheKey的...转载 2021-03-31 01:43:15 · 227 阅读 · 0 评论 -
Mybatis源码解析之事务管理
一、事务简介1. 事务的特性(ACID)(1)原子性(Atomicity)一个事务内的所有操作,要么全部完成,要么全部没做,不可能存在中间状态。如果一个事务在执行过程中出现异常,会将已经执行完成的操作回滚,使得所有操作保持在全部没做的状态(2)一致性(Consistency)事务执行前和执行后的数据库的完整性约束没有变化,执行前和执行后都处于一致性状态。比如,A向B转账,转账就是一个事务,不管转账多少次,A和B的账户总额一致。(3)隔离性(Isolation)事务和事务之...转载 2021-03-31 01:41:24 · 178 阅读 · 0 评论 -
Mybatis源码解析之数据库连接和连接池
一、数据库连接的获取Mybatis作为ORM框架,在上一篇博客中可以了解到在sql执行流程中会在BaseExecutor#getConnection(Log)中去获取数据库连接。1. BaseExecutor#getConnection(Log)protected Connection getConnection(Log statementLog) throws SQLException { Connection connection = transaction.getConnect...转载 2021-03-31 01:39:56 · 573 阅读 · 0 评论 -
Mybatis源码解析之执行流程解析
本篇文章将在前两篇文章的基础上解析Mybatis执行sql的流程。一、 映射集mappers解析对于在原生mybatis中的sql执行,需要在配置文件中通过标签引入mapper.xml文件。前文已经提到,对于xml配置文件,mybatis在XMLConfigBuilder#parseConfiguration(Xnode)方法中进行解析,对于mappers节点的解析在mapperElement(root.evalNode("mappers"));进行处理。1. XMLConfigBuilder#转载 2021-03-31 01:37:47 · 108 阅读 · 0 评论 -
Mybatis源码解析之初始化分析
Mybatis的初始化过程就是mybatis配置文件的解析过程并将解析结果保存到Configuration类。一、 Mybatis配置文件configuation是mybatis配置文件的根节点。configuration 配置 -properties 属性 -settings 设置 -typeAliases 类型别名 -typeHandlers 类型处理器 -objectFactory 对象工厂 -plugins 插件 -environments 环境 -environme转载 2021-03-31 01:34:38 · 140 阅读 · 0 评论 -
Mybatis源码解析之核心类分析
以下Mybatis解析基于org.mybatis:mybatis:3.4.5一、整体设计图片来源二、核心类解读1. SqlSession和SqlSessionFactorySqlSession是Mybatis框架对外暴露的顶层API接口,通过这个接口可以实现增删改查、事务管理等数据库操作,框架中提供了DefaultSqlSession和SqlSessionManager两个实现类。在SqlSession的所有增删改查的操作方法中,其第一个参数均为String statement,对应接口转载 2021-03-31 01:32:27 · 146 阅读 · 0 评论 -
Mybatis源码(九)mybatis常见的面试题
Spring 和MyBatis整合之后 为什么一级缓存会失效 因为Spring在使用完dao之后会立即关闭sqlSession对象。如果让它生效的话,打开事务就会生效。 二级缓存中要注意的点 二级缓存里面的数据不能存那种一直累加到很大的。 二级缓存是基于命名空间来的,缓存是拿来存储少量或者周期不长 但是要经常需要操作的数据 ResultMap和ResultType的差别 ResultType 一般是直接指定返回值与别名库当中的java对象的映射..转载 2021-02-10 09:54:58 · 232 阅读 · 0 评论 -
Mybatis源码(八)mybatis的查询的结果集的封装
前面的博客介绍执行的流程的增删改查,但是由于结果的集的封装我们没有讲清楚,所以写一篇博客。来详细的说明一下。mybatis的对查询的结果集的封装问题。前面的一篇博客介绍了mybatis会根据返回值类型,来决定执行什么样的操作。至此我们看下有那几种的返回的类型,然后写出对应的测试的方法。具体的代码如下:public class MapperMethod { public static class MethodSignature { public MethodSignature(Configurati转载 2021-02-10 09:54:09 · 472 阅读 · 0 评论 -
Mybatis源码(七)mybatis的日志体系
今天我们来谈下mybatis的日志体系。说到mybatis的日志体系我们不得不说下java的日志体系。java的日志体系真的太多了。有log4j,jul,jcl等等。因为java是一个开源的语言。所以难免有很多的日志框架。今天我们就来说下java的日志体系,然后再说下mybatis的日志体系。首先我们先来看下log4j,写出如下的代码,测试一下。我们先引入对应的依赖,具体的代码如下:<dependency> <groupId>log4j</groupId>转载 2021-02-10 09:48:27 · 100 阅读 · 0 评论 -
Mybatis源码(六)mybatis的插件编写之分页插件
前面我们已经介绍了mbatis的一些源码,这篇博客我们说下mybatis的插件的书写,首先我们要先了解一下mybatis的执行流程,具体如下图:想想我们在执行分页查询的时候,应该在什么时候,虽然上面后三个阶段都可以拦截,但是这儿的分页查询,我们在执行SQL语句之间进行拦截,所以这儿就在StatementHandler的阶段拦截。然后我们再想下,执行分页查询的步骤有哪些?具体如下:第一步 执行一条count语句第二步 重写sql select * from admin limit start,转载 2021-02-10 09:45:37 · 197 阅读 · 0 评论 -
Mybatis源码(五)mybatis的缓存机制
前面的博客,我们介绍mybatis的查询的流程,但是我们忘记介绍XML中匹配的参数是怎么生成的。今天会介绍一下,同时会介绍一下mybatis的一级和二级缓存。我们先看参数的生成的代码,具体的代码如下:public class ParamNameResolver { public ParamNameResolver(Configuration config, Method method) { final Class<?>[] paramTypes = method.getParam转载 2021-02-10 09:43:09 · 166 阅读 · 0 评论 -
Mybatis源码(四)mybatis的执行流程之增删改
上篇博客我们介绍了mybatis的执行流程中查询的操作,同时介绍了两种SQL语句。但是增删改没有讲,这篇博客我们就介绍一下mybatis中的增删改的执行流程。首先我们书写以下的测试的代码,具体的代码如下:public class TestInsertOrUpdateOrDelete { public static void main(String[] args) throws IOException { String resource = "mybatis.xml"; InputS转载 2021-02-10 09:38:07 · 119 阅读 · 0 评论 -
Mybatis源码(三)mybatis的执行流程之查询
前面的博客已经介绍了mybatis的主配置文件的解析以及mapper文件的解析的全流程,我们已经得知mapper文件解析有两种情况,一种是只有#占位符的SQL语句,这种查询语句会将#转成?。还有一种就是含有$或者动态标签的SQL语句,这个时候不做任何处理。今天针对这两种情况,我们来分析一下源码,不过只分析select查询,至于还有insert delete update会在下篇博客中详细说明。下面来书写我们的测试代码,具体的代码如下:<?xml version="1.0" encoding=".转载 2021-02-10 09:31:42 · 124 阅读 · 0 评论 -
Mybatis源码(二)mybatis的mapper文件解析
由于上篇博客,介绍了主配置文件的加载过程,至于mapper的文件的解析,也是讲了但是不够详细,这篇博客我决定重写梳理一遍,首先我们先看我们运行代码的以及对应的mapper文件,具体的内容如下:public class Test { public static void main(String[] args) throws Exception { String resource = "mybatis.xml"; InputStream inputStream = Resources.转载 2021-02-10 09:23:10 · 261 阅读 · 0 评论 -
Mybatis源码(一)mybatis的主配置文件解析
从今天开始,我们要开始mybatis源码的阅读之旅了,前置知识:JDBC,xml配置文件的解析的API。有了这些前置的知识就可以了。今天我们会讲下mybatis的主配置文件的解析过程。废话不多说,直接上代码。mybatis的配置文件如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "转载 2021-02-10 09:18:37 · 168 阅读 · 0 评论 -
mybatis实战教程(mybatis in action),mybatis入门到精通
分类: SSH2(19) 目录(?)[-]mybatis实战教程mybatis in action之一开发环境搭建mybatis实战教程mybatis in action之二以接口的方式编程mybatis实战教程mybatis in action之三实现数据的增删改查mybatis实战教程mybatis in action之四实现关联数据的查询mybatis转载 2016-06-22 11:28:30 · 198 阅读 · 0 评论