自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 资源 (1)
  • 收藏
  • 关注

原创 mybatis源码学习------目录

Reflector类Invoker接口及其子类property工具包TypeParameterResolverMetaClass类MetaObject&ObjectWrapperUnpooledDataSourcePooledDataSourcecache缓存模块Transaction事务模块类型处理器模块binding模块configuration配置的解析mapper配置的解析resultMap和sql片段的解析sql语句配置的解析动态sql的解析(SqlNod.

2020-11-10 09:06:02 1411 6

原创 Scala函数式编程中的Monoid

在本文中,我们将会从一个简单的需求出发,尝试通过对代码的多次重构,逐步帮你理解什么是Monoid。基本概念群(category)的基本概念群(category)有两个组成要素:由一些同一个类型的对象组成一种态设关系(map),可以将范畴中的任何一个对象转换成另外一个对象,转换之后的类型还是class的。其示意图如下所示:另外,一个群还需要满足两个公理:结合律,以加法为例,(a+b)+c = a+(b+c)同一律,群中存在一个特殊的对象e,使得 e * y = y = y

2021-01-31 08:57:38 429 2

原创 Redis中的高可用

什么是高可用?高可用的定义维基百科中对于高可用的定义如下:高可用性(英语:high availability,缩写为 HA),IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度。是进行系统设计时的准则之一。高可用性系统与构成该系统的各个组件相比可以更长时间运行。[1]高可用性通常通过提高系统的容错能力来实现。高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。高可用的度量其度量方式,是根据系

2021-01-23 23:28:43 470

原创 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 368 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 456

原创 mybatis源码学习------StatementHandler

StatementHandler接口StatementHandler接口提供了很多功能(从接口的定义中可以看出),是sql执行器接口的基础。接口定义public interface StatementHandler { //从连接对象中获取一个Statement Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException; //给Statement绑定实参

2020-11-12 21:23:09 462

原创 mybatis源码学习------主键生成器

正常情况下insert语句不会返回插入后所生成的主键,返回的是受影响的记录数。如果在插入一条数据后希望能得到数据库生成的主键(无论是oracle的自增序列,还是mysql的自增主键),则可以使用KeyGenerator接口。使用方式为在<insert/>或<update/>标签上配置useGeneratedKeys属性,关于useGeneratedKeys、keyProperty和keyColumn属性,官方文档对其的描述为:useGeneratedKeys(仅适用于

2020-11-12 18:20:19 1465

原创 mybatis源码学习------ResultSetHandler接口

ResultSetHandler的主要作用是将数据库的结果集按照用户在配置文件中配置的映射关系组装成对应的java对象,这是mybatis的核心功能之一。当执行完select查询语句之后,mybatis会将查询得到的结果集交给ResultSetHandler完成映射处理。ResultSetHandler接口ResultSetHandler接口的定义如下,其定义了三个方法,用于适配三种不同的场景:public interface ResultSetHandler { //映射结果集,得到E类型的对

2020-11-11 18:56:38 480

原创 mybatis源码学习------ResultSetHandler之嵌套查询&懒加载

延迟加载的概念延迟加载(lazy load)也称为懒加载,是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。mybatis对延迟加载的配置<resultMap>节点的fetchType属性,有效值为 lazy 和 eager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。全局配置文件中的lazyLoadingEnabled属性,延迟加载的全局开,当开启时,所有关联对象都会延迟加载。

2020-11-11 18:45:50 400

原创 mybatis源码学习------ResultSetHandler之嵌套映射

DefaultResultSetHandler的handleRowValues方法中有两个分支,一个用于处理嵌套映射,一个用于处理简单映射,本文讲分析其处理嵌套映射的分支。handleRowValues方法的定义如下:public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping p

2020-11-11 11:29:55 634

原创 mybatis源码学习------ResultSetHandler之简单映射

DefaultResultSetHandler的handleRowValues方法中有两个分支,一个用于处理嵌套映射,一个用于处理简单映射,本文讲分析其处理简单映射的分支。handleRowValues方法的定义如下:public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping p

2020-11-10 19:13:21 564

原创 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 476

原创 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 1631

原创 mybatis源码学习------动态sql的解析(SqlNode)

123

2020-11-04 23:20:07 1891

原创 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 445

原创 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 461

原创 mybatis源码学习------mapper配置的解析

XMLMapperBuilder介绍XMLMapperBuilder类继承自BaseBuilder类,该类也使用了建造者设计模式。XMLMapperBuilder类的主要作用是解析xxxMapper.xml配置文件中用户的配置,如下图所示。mybatis-3-mapper.dtd文件中对于mapper节点的定义如下:XMLMapperBuilder类的核心功能就是解析<mapper></mapper>标签中配置的内容。字段XMLMapperBuilder类中定义的字段

2020-11-02 23:55:42 700

原创 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 419

原创 递归判断对象或集合是否全为空的工具

说明1、代码依赖了hutool的相关API,如果不想依赖hutool的话可以用阿帕奇或者spring的相关API进行替换。2、对于是否为空的标准在代码里是写死的,详见注释。代码实现工具类的代码如下:/** * {@link #isDeepEmpty(Object object, Boolean ignoreBoolean)}的重载方法,ignoreBoolean参数为false * * @param object 要判断的对象 * @return object的所有属性是否都为空 */

2020-09-29 17:31:38 828

原创 mybatis源码学习------类型处理器模块

简介① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及:在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。类型处理器的作用如下图所示TypeHandler接口及其实现类TypeHandler接口中定义了两种类型的方

2020-09-29 11:49:22 363

原创 mybatis源码学习------Transaction

简介ManagedTransactionFactoryManagedTransactionFactoryMyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务,spring如何处理事务的代码会在后续分析mybatis-spring工程时分析,这里只看mybatis提供的简单实现,逻辑很简单,直接看注释就行了,不做分析。类图如下:接口事务工厂接口public interfac

2020-09-07 17:25:06 325 1

原创 mybatis源码学习------cache缓存模块

简介在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。这里需要注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时,优先考虑使用 Redis、M

2020-09-07 15:58:12 304

原创 mybatis源码学习------PooledDataSource

概述本文将会学习PooledDataSource、PooledConnection和PoolState这三个类的源码实现,mybatis通过这三个类实现了一个简单的数据库连接池,这三个类的功能分别为:PooledDataSource:数据库的连接池PooledConnection:连接池中的连接对象PoolState:提供一些统计信息,用于监控当前连接池的状态下面来分别学习这三个类的代码实现PooledConnectionPooledConnection类实现了InvocationHand

2020-09-07 08:06:32 1172

原创 mybaits源码学习------UnpooledDataSource

简介数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等,选择性能优秀的数据源组件对于提升 ORM 框架乃至整个应用的性能都是非常重要的。MyBatis 自身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。mybatis的datasource模块将数据源分为下面三类:JNDI数据源非池化数据源池化数据源非池化数据源这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢

2020-09-07 08:03:31 1246

原创 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 653

原创 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 448

原创 mybatis源码学习------TypeParameterResolver

TypeParameterResolver简介TypeParameterResolver是反射包下的一个工具类,用于解析方法的参数、返回类型和类中定义的字段的类型。在阅读本片文章之前最好还是先了解一下java.lang.reflcet包下的Type接口及其子接口和实现,关于Type接口的介绍请移步TypeParameterResolver类中的resolveFieldType方法、resolveReturnType方法和resolveParamTypes方法分别用于解析字段的类型、解析方法返回的类型以

2020-08-14 14:45:04 628 2

原创 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 370

原创 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 685

原创 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 475

原创 nginx+keepalived 主备搭建记录

nginx安装1.软件安装nginx version: nginx/1.16.1nginx安装的服务器: 192.168.4.201/192.168.4.202yum install -y nginx2.软件启动systemctl start nginx3.查看nginx.conf位置[root@localhost bin]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx:

2020-07-13 16:51:06 193

原创 linux系统安装seata-server步骤记录

服务端安装seata-server下载seata-servercd /home/installwget https://github.com/seata/seata/releases/download/v1.2.0/seata-server-1.2.0.tar.gztar -zxvf seata-server-1.2.0.tar.gz修改seata-server的配置文件cd home/install/seata/conf修改file.confvim file.conffile.

2020-07-13 16:43:18 2702 1

原创 netty NioEventLoopGroup的类图分析

NioEventLoopGroup的类图如下:各接口功能说明Executor接口:任务执行器ExecutorService接口:提供了异步执行任务能力的执行器ScheduledExecutorService接口:提供了执行定时任务的能力EventExecutorGroup接口:ExecutorService的分组接口AbstractEventExecutorGroup:EventEx...

2020-01-20 14:28:30 280

原创 netty NioEventLoop中run()方法执行流程分析

NioEventLoop的run方法的执行过程在创建线程对象的任务中调用了SingleThreadEventExecutor.this#run()方法,使NioEventLoop开始运行,开始处理任务。NioEventLoop#run()方法如下所示,可以看到run()方法是一个无限循环,直到NioEventLoop被关闭。run()方法中的逻辑主要分为以下三大步骤select 选择任...

2020-01-20 14:25:56 1380

原创 netty创建并启动新线程流程分析

本文主要分享服务端ServerSocketChannel所绑定的NioEventLoop的线程的创建过程在服务端启动流程中当执行到注册操作时,会判断当前线程是否是ServerSocketChannel所绑定的NioEventLoop中的线程,如果不是的话,会将注册操作封装成一个线程任务交给NioEventLoop中的线程去执行,相关代码如下所示:@Overridepublic final v...

2020-01-20 14:24:09 918

原创 netty服务端新连接接入的流程分析

由前面的分析可知NioEventLoop的run()方法是一个无限循环,NioEventLoop会不断的调用Selector的select(timeout)方法查询是否有新的IO事件,所以当一个客户端连接进入的时候会被Boss线程select到,故新连接接入流程的入口为Bose线程的select方法。select(boolean oldWakenUp)方法如下所示(仅保留相关代码):priva...

2020-01-20 14:22:02 446

原创 netty 服务端的启动过程

服务端的启动过程ServerBootstrap和Bootstrap的类图如下所示:可以看到ServerBootstrap和Bootstrap都是继承自抽象类AbstractBootstrap。因为 ServerBootstrap 和 Bootstrap 大部分的方法和职责都是相同的,所以公共的逻辑由AbstractBootstrap类实现。本文仅分享 ServerBootstrap 启动 ...

2020-01-17 16:31:27 287

原创 netty UnpooledHeapByteBuf类

UnpooledHeapByteBuf类UnpooledHeapByteBuf类的类图如下所示,UnpooledHeapByteBuf继承自AbstractReferenceCountedByteBuf类,UnpooledHeapByteBuf是一个基于JVM堆内存进行内存分配的缓冲区,是一个非池化的实现,所以在每次IO读写的时候都会创建一个UnpooledHeapByteBuf对象。基于堆内存...

2020-01-09 17:51:01 863

原创 netty AbstractReferenceCountedByteBuf类

AbstractReferenceCountedByteBuf作用AbstractReferenceCountedByteBuf类提供了引用计数的功能,其所有的子类都可以使用该功能防止内存泄漏。属性REFCNT_FIELD_OFFSET:refCnt字段在内存中的地址偏移量AIF_UPDATER:refCnt字段更新器updater:更新器refCnt:保存引用计数的字段priva...

2020-01-09 14:15:20 550

原创 netty AbstractByteBuf类

ByteBuf和ByteBuffer的关系Netty的ByteBuf及其子类可以看做是对JDK提供的ByteBuffer的一种扩展,JDK提供的ByteBuffer类有如下缺点:长度固定,ByteBuffer类一旦被创建则它的容量是不能被改变的只有一个标识位置的指针position,对于读写操作其提供的API比较复杂,编程复杂度较高ByteBuf通过提供自动扩容的方法解决了ByteBu...

2020-01-09 10:14:32 234

设计模式之禅

使用java编程语言讲解设计模式,内容通俗易懂,幽默风趣。

2018-07-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除