![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码学习
文章平均质量分 72
A股慈善家
金融鬼才
展开
-
mybatis源码学习------执行器Executor(二)
SimpleExecutorSimpleExecutor继承自BaseExecutor类,是最简单的Executor实现类,增删改查功能都依赖其持有的StatementHandler实例来完成。doUpdatepublic int doUpdate(MappedStatement ms, Object parameter) throws SQLException { Statement stmt = null; try { Configuration configuration = m原创 2020-11-14 19:07:13 · 374 阅读 · 2 评论 -
mybatis源码学习------执行器Executor(一)
Executor该接口中定义了操作数据库的各种方法,是mybatis的核心接口之一,是SqlSession接口的基础,其定义如下:public interface Executor { ResultHandler NO_RESULT_HANDLER = null; //执行增删改操作 int update(MappedStatement ms, Object parameter) throws SQLException; //执行查询操作 <E> List<E&g原创 2020-11-13 10:41:43 · 469 阅读 · 0 评论 -
mybatis源码学习------StatementHandler
StatementHandler接口StatementHandler接口提供了很多功能(从接口的定义中可以看出),是sql执行器接口的基础。接口定义public interface StatementHandler { //从连接对象中获取一个Statement Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException; //给Statement绑定实参原创 2020-11-12 21:23:09 · 486 阅读 · 0 评论 -
mybatis源码学习------主键生成器
正常情况下insert语句不会返回插入后所生成的主键,返回的是受影响的记录数。如果在插入一条数据后希望能得到数据库生成的主键(无论是oracle的自增序列,还是mysql的自增主键),则可以使用KeyGenerator接口。使用方式为在<insert/>或<update/>标签上配置useGeneratedKeys属性,关于useGeneratedKeys、keyProperty和keyColumn属性,官方文档对其的描述为:useGeneratedKeys(仅适用于原创 2020-11-12 18:20:19 · 1481 阅读 · 0 评论 -
mybatis源码学习------ResultSetHandler接口
ResultSetHandler的主要作用是将数据库的结果集按照用户在配置文件中配置的映射关系组装成对应的java对象,这是mybatis的核心功能之一。当执行完select查询语句之后,mybatis会将查询得到的结果集交给ResultSetHandler完成映射处理。ResultSetHandler接口ResultSetHandler接口的定义如下,其定义了三个方法,用于适配三种不同的场景:public interface ResultSetHandler { //映射结果集,得到E类型的对原创 2020-11-11 18:56:38 · 507 阅读 · 0 评论 -
mybatis源码学习------ResultSetHandler之嵌套查询&懒加载
延迟加载的概念延迟加载(lazy load)也称为懒加载,是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。mybatis对延迟加载的配置<resultMap>节点的fetchType属性,有效值为 lazy 和 eager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。全局配置文件中的lazyLoadingEnabled属性,延迟加载的全局开,当开启时,所有关联对象都会延迟加载。原创 2020-11-11 18:45:50 · 412 阅读 · 0 评论 -
mybatis源码学习------ResultSetHandler之嵌套映射
DefaultResultSetHandler的handleRowValues方法中有两个分支,一个用于处理嵌套映射,一个用于处理简单映射,本文讲分析其处理嵌套映射的分支。handleRowValues方法的定义如下:public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping p原创 2020-11-11 11:29:55 · 683 阅读 · 0 评论 -
mybatis源码学习------ResultSetHandler之简单映射
DefaultResultSetHandler的handleRowValues方法中有两个分支,一个用于处理嵌套映射,一个用于处理简单映射,本文讲分析其处理简单映射的分支。handleRowValues方法的定义如下:public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping p原创 2020-11-10 19:13:21 · 586 阅读 · 0 评论 -
mybatis源码学习------目录
Reflector类Invoker接口及其子类property工具包TypeParameterResolverMetaClass类MetaObject&ObjectWrapperUnpooledDataSourcePooledDataSourcecache缓存模块Transaction事务模块类型处理器模块binding模块configuration配置的解析mapper配置的解析resultMap和sql片段的解析sql语句配置的解析动态sql的解析(SqlNod.原创 2020-11-10 09:06:02 · 1427 阅读 · 6 评论 -
mybatis源码学习------sql语句的解析
解析insert、update、delete和select配置的代码入口如下所示:buildStatementFromContext方法逻辑同解析sql片段相似,都是先检查数据库厂商ID是否匹配private void buildStatementFromContext(List<XNode> list) { if (configuration.getDatabaseId() != null) { buildStatementFromContext(list, configu原创 2020-11-10 08:37:11 · 518 阅读 · 0 评论 -
mybatis源码学习------动态sql的解析(SqlSource)
SqlSourceSqlSource为SQL 来源接口。它代表从 Mapper XML 或方法注解上,读取的一条 SQL 内容。SqlSource接口SqlSource接口的定义如下:public interface SqlSource { //根据传入的实际参数,返回一个BoundSql对象 BoundSql getBoundSql(Object parameterObject);}SqlSource有多个实现类,类图如下:实现类的区别DynamicSqlSource 表示原创 2020-11-10 07:41:01 · 1775 阅读 · 0 评论 -
mybatis源码学习------动态sql的解析(SqlNode)
123原创 2020-11-04 23:20:07 · 1976 阅读 · 0 评论 -
mybatis源码学习------resultMap和sql片段的解析
resultMap的解析书接上回,mybatis对于<resultMap></resultMap>标签解析的方法入口为:resultMapElements(List list)根据mybatis-3-mapper.dtd文件中对于resultMap的定义可知,一个mapper节点内可以定义任意多个resultMap节点,所以resultMapElements方法会遍历所有的resultMap进行解析,代码如下:private void resultMapElements(L原创 2020-11-02 23:57:33 · 461 阅读 · 0 评论 -
mybatis源码学习------configuration的解析
通过上文的分析可以知道,解析mybatis-config.xml文件的工作是由XMLConfigBuilder类完成的,所以接下来学习mybatis是如何解析mybatis-config.xml文件中的配置项的。parse入口为parse()方法,parse()方法的源码为:public Configuration parse() { //防止重复解析 if (parsed) { throw new BuilderException("Each XMLConfigBuilder can原创 2020-11-02 23:56:38 · 475 阅读 · 0 评论 -
mybatis源码学习------mapper配置的解析
XMLMapperBuilder介绍XMLMapperBuilder类继承自BaseBuilder类,该类也使用了建造者设计模式。XMLMapperBuilder类的主要作用是解析xxxMapper.xml配置文件中用户的配置,如下图所示。mybatis-3-mapper.dtd文件中对于mapper节点的定义如下:XMLMapperBuilder类的核心功能就是解析<mapper></mapper>标签中配置的内容。字段XMLMapperBuilder类中定义的字段原创 2020-11-02 23:55:42 · 735 阅读 · 0 评论 -
mybatis源码学习------binding模块
简介Mybatis的Binding模块用于实现Mapper接口与Mapper.xml绑定,当用于定义了AuthorMapper.java和AuthorMapper.xml后,mybatis需要将AuthorMapper.java中定义的方法与AuthorMapper.xml中定义的sql语句关联起来,并封装到指定的数据结构中便于后续上层应用的调用。如果在绑定的过程中发现存在无法关联的sql语句,则mybatis会在初始化时抛出异常,而不是等到用户实际调用的时候再抛出异常。问题: 平时的业务代码调用的都是原创 2020-09-29 19:07:10 · 433 阅读 · 0 评论 -
mybatis源码学习------类型处理器模块
简介① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及:在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。类型处理器的作用如下图所示TypeHandler接口及其实现类TypeHandler接口中定义了两种类型的方原创 2020-09-29 11:49:22 · 389 阅读 · 0 评论 -
mybatis源码学习------Transaction
简介ManagedTransactionFactoryManagedTransactionFactoryMyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务,spring如何处理事务的代码会在后续分析mybatis-spring工程时分析,这里只看mybatis提供的简单实现,逻辑很简单,直接看注释就行了,不做分析。类图如下:接口事务工厂接口public interfac原创 2020-09-07 17:25:06 · 333 阅读 · 1 评论 -
mybatis源码学习------cache缓存模块
简介在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。这里需要注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时,优先考虑使用 Redis、M原创 2020-09-07 15:58:12 · 309 阅读 · 0 评论 -
mybatis源码学习------PooledDataSource
概述本文将会学习PooledDataSource、PooledConnection和PoolState这三个类的源码实现,mybatis通过这三个类实现了一个简单的数据库连接池,这三个类的功能分别为:PooledDataSource:数据库的连接池PooledConnection:连接池中的连接对象PoolState:提供一些统计信息,用于监控当前连接池的状态下面来分别学习这三个类的代码实现PooledConnectionPooledConnection类实现了InvocationHand原创 2020-09-07 08:06:32 · 1208 阅读 · 0 评论 -
mybaits源码学习------UnpooledDataSource
简介数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等,选择性能优秀的数据源组件对于提升 ORM 框架乃至整个应用的性能都是非常重要的。MyBatis 自身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。mybatis的datasource模块将数据源分为下面三类:JNDI数据源非池化数据源池化数据源非池化数据源这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢原创 2020-09-07 08:03:31 · 1281 阅读 · 0 评论 -
mybaits源码学习------MetaObject&ObjectWrapper
ObjectFactory对象工厂用于创建所有mybaits需要的对象ObjectFactory接口public interface ObjectFactory { default void setProperties(Properties properties) { } //根据空参构造函数创建对象 <T> T create(Class<T> type); //调用指定的有参构构造函数创建对象 <T> T create(Class原创 2020-09-02 15:28:20 · 662 阅读 · 0 评论 -
mybatis源码学习------MetaClass
MetaClass简介MetaClass意为类元信息,可以理解为是对Reflector功能的增强。可以理解为:MetaClass是 反射器Reflector+反射器工厂reflectorFactory+属性分词器PropertyTokenizer 三者的能力的组合假设当前类的定义如下:public class RichType { private RichType richType; private String richField; private String richProp原创 2020-08-15 20:51:59 · 472 阅读 · 0 评论 -
mybatis源码学习------TypeParameterResolver
TypeParameterResolver简介TypeParameterResolver是反射包下的一个工具类,用于解析方法的参数、返回类型和类中定义的字段的类型。在阅读本片文章之前最好还是先了解一下java.lang.reflcet包下的Type接口及其子接口和实现,关于Type接口的介绍请移步TypeParameterResolver类中的resolveFieldType方法、resolveReturnType方法和resolveParamTypes方法分别用于解析字段的类型、解析方法返回的类型以原创 2020-08-14 14:45:04 · 643 阅读 · 3 评论 -
mybatis源码学习-----property工具包
property工具包简介org.apache.ibatis.reflection.property包下共有三个工具类,PropertyCopier、PropertyNamer和PropertyTokenizer。PropertyCopier:主要用于两个对象之间进行属性复制PropertyNamer:主要用于完成属性名和方法名之间的转换PropertyTokenizer:主要用于解析属性表达式,比如在mapper.xml中经常写的<if test="order.orderName !=原创 2020-08-12 20:49:28 · 388 阅读 · 0 评论 -
mybatis源码学习------Invoker接口及其子类
Invoker介绍Invoker是对getter和setter方法调用的封装,为了简化对属性和字段的操作,Invoker的实现类使用了适配器模式来屏蔽二者的差异,便于上层代码调用。Invoker及其实现的类图代码比较简单,直接看代码和注释即可public interface Invoker { //执行调用 Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTarget原创 2020-08-12 17:30:59 · 737 阅读 · 0 评论 -
mybatis源码学习------Reflector类
Reflector简介Reflector反射器,每个Reflector对象对应一个类,该对象会缓存反射操作所需要的类元信息,便于后续反射操作。Reflector的类注释如下(难得作者心情好,写了两行注释):This class represents a cached set of class definition information that allows for easy mapping between property names and getter/setter methods.此类表原创 2020-08-12 17:26:02 · 491 阅读 · 0 评论 -
netty NioEventLoopGroup的类图分析
NioEventLoopGroup的类图如下:各接口功能说明Executor接口:任务执行器ExecutorService接口:提供了异步执行任务能力的执行器ScheduledExecutorService接口:提供了执行定时任务的能力EventExecutorGroup接口:ExecutorService的分组接口AbstractEventExecutorGroup:EventEx...原创 2020-01-20 14:28:30 · 297 阅读 · 0 评论 -
netty NioEventLoop中run()方法执行流程分析
NioEventLoop的run方法的执行过程在创建线程对象的任务中调用了SingleThreadEventExecutor.this#run()方法,使NioEventLoop开始运行,开始处理任务。NioEventLoop#run()方法如下所示,可以看到run()方法是一个无限循环,直到NioEventLoop被关闭。run()方法中的逻辑主要分为以下三大步骤select 选择任...原创 2020-01-20 14:25:56 · 1405 阅读 · 0 评论 -
netty创建并启动新线程流程分析
本文主要分享服务端ServerSocketChannel所绑定的NioEventLoop的线程的创建过程在服务端启动流程中当执行到注册操作时,会判断当前线程是否是ServerSocketChannel所绑定的NioEventLoop中的线程,如果不是的话,会将注册操作封装成一个线程任务交给NioEventLoop中的线程去执行,相关代码如下所示:@Overridepublic final v...原创 2020-01-20 14:24:09 · 944 阅读 · 0 评论 -
netty服务端新连接接入的流程分析
由前面的分析可知NioEventLoop的run()方法是一个无限循环,NioEventLoop会不断的调用Selector的select(timeout)方法查询是否有新的IO事件,所以当一个客户端连接进入的时候会被Boss线程select到,故新连接接入流程的入口为Bose线程的select方法。select(boolean oldWakenUp)方法如下所示(仅保留相关代码):priva...原创 2020-01-20 14:22:02 · 452 阅读 · 0 评论 -
netty 服务端的启动过程
服务端的启动过程ServerBootstrap和Bootstrap的类图如下所示:可以看到ServerBootstrap和Bootstrap都是继承自抽象类AbstractBootstrap。因为 ServerBootstrap 和 Bootstrap 大部分的方法和职责都是相同的,所以公共的逻辑由AbstractBootstrap类实现。本文仅分享 ServerBootstrap 启动 ...原创 2020-01-17 16:31:27 · 289 阅读 · 0 评论 -
netty UnpooledHeapByteBuf类
UnpooledHeapByteBuf类UnpooledHeapByteBuf类的类图如下所示,UnpooledHeapByteBuf继承自AbstractReferenceCountedByteBuf类,UnpooledHeapByteBuf是一个基于JVM堆内存进行内存分配的缓冲区,是一个非池化的实现,所以在每次IO读写的时候都会创建一个UnpooledHeapByteBuf对象。基于堆内存...原创 2020-01-09 17:51:01 · 869 阅读 · 0 评论 -
netty AbstractReferenceCountedByteBuf类
AbstractReferenceCountedByteBuf作用AbstractReferenceCountedByteBuf类提供了引用计数的功能,其所有的子类都可以使用该功能防止内存泄漏。属性REFCNT_FIELD_OFFSET:refCnt字段在内存中的地址偏移量AIF_UPDATER:refCnt字段更新器updater:更新器refCnt:保存引用计数的字段priva...原创 2020-01-09 14:15:20 · 562 阅读 · 0 评论 -
netty AbstractByteBuf类
ByteBuf和ByteBuffer的关系Netty的ByteBuf及其子类可以看做是对JDK提供的ByteBuffer的一种扩展,JDK提供的ByteBuffer类有如下缺点:长度固定,ByteBuffer类一旦被创建则它的容量是不能被改变的只有一个标识位置的指针position,对于读写操作其提供的API比较复杂,编程复杂度较高ByteBuf通过提供自动扩容的方法解决了ByteBu...原创 2020-01-09 10:14:32 · 238 阅读 · 0 评论 -
HashMap源码学习
HashMap的成员属性//数组的默认初始化容量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//哈希表的最大容量static final int MAXIMUM_CAPACITY = 1 << 30;//默认的加载因子static final float DEFAULT_LOAD_FACTOR = 0.7...原创 2019-09-05 16:30:16 · 166 阅读 · 0 评论 -
ArrayBlockingQueue源码学习
ArrayBlockingQueue介绍ArrayBlockingQueue是采用数组实现的有界阻塞线程安全队列。如果向已满的队列继续塞入元素,将导致当前的线程阻塞。如果向空队列获取元素,那么将导致当前线程阻塞。ArrayBlockingQueue类的几个主要成员属性:final Object[] items; //用于存放队列元素的数组int takeIndex; //消费者取的元素的数...原创 2019-08-30 16:01:57 · 238 阅读 · 0 评论 -
ReentrantLock的await/signal机制源码学习
测试代码如下:public class ConditionTest { static ReentrantLock lock = new ReentrantLock(); //创建锁对象 static Condition condition = lock.newCondition(); //创建条件变量 public static void main(Str...原创 2019-08-29 20:37:42 · 2108 阅读 · 0 评论 -
ReentrantLock公平锁的获取和释放源码学习
ReentrantLock公平锁的测试代码如下: public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(true);//创建一个公平锁 lock.lock(); try{ TimeUnit.SECONDS.slee...原创 2019-08-28 17:48:26 · 171 阅读 · 0 评论 -
ReentrantLock非公平模式下获取和释放锁的源码学习
ReentrantLock类A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchronized methods and statements, but with extended capabili...原创 2019-08-13 15:44:40 · 340 阅读 · 3 评论