学习
实践
活动
专区
工具
TVP
写文章

老司机对Mybatis源码浅析及定制原理的讲解

Mybatis为Javaer们提供了强大的数据库访问支持,但对于绝大多数场景来说,使用上仍然不够简单,比如:还是需要编写包含SQL语句的XML或注解。

本文对Mybatis的原理进行了简单的介绍,并介绍了我们部门自己基于Mybatis源代码修改并开发的Mybatis扩展框架——Appassist-dao。

一、Mybatis基础

1

两种Mybatis使用方式

spring集成方式

直接调用初始化方式

下图是两种初始化方式之间的关系:

2

Mybatis-spring的初始化流程

1. mybatis-spring是对mybatis的封装,因此实际上mybatis-spring的初始化流程包含了标准的mybais初始化流程。下图展示了mybatis-spring初始化的大体流程,其中红框部分会进行mapper xml的扫描,也就是右侧的流程部分。

2. mybatis-spring除了可以使用SqlSessionFacotryBean来初始化各个mapper,还可以用MapperScanConfigurer来扫描指定包路径下的Mapper接口,自动向spring框架中注入对应的Mapper实现:

3 Mybatis两种使用模式

1. 传统模式,使用SqlSession进行访问:

2. MapperProxy模式

4 MapperProxy做了些什么?

MapperProxy实际上是一个JDK代理:InvocationHandler。被代理的则是与xxxMapper.xml中namespace对应的接口。

二、Mybatis定制

实现基础Dao类——BaseDao,并为继承BaseDao类的Mapper接口自动注入mybatis sql xml。

1 需要定制的功能

比如,目前在我们部们内测时候用的dao框架 appassist-dao,它定义了一个基础接口,凡是集成自该接口的Dao对象,都会根据它的类型参数"T extends BaseQuery"去生成对应的sql语句。

举个例子:我们定义一个Dao,并定义对应的Domain对象(即PO对象)。

appassist-dao可以使得数据库访问变得更简单,就如上述两个类——User和UserDao。只要将UserDao扫描并实例化注入到spring中,就能够像如下使用:

2 定制功能的实现

前面有讲到,spring中Mybatis的初始化入口为:SqlSessionFactoryBean。为了在mybatis初始化的时候能够扫描UserDao和User类,并根据User类中的注解自动生成sql注册到Mybatis中。我们需要对它进行改写。一共有两个hack点:

1. 图2中的绿色部分

对应mybatis源码:

2. MapperScannerConfigurer将对象自动扫描注入后,对Dao接口方法进行注解扫描。对应mybatis源码:

其中红框部分即为我们自己添加的Sql自动生成并注册mybatis的代码。

AutoSqlInjector中,根据Domain对象中Table、Column注解等信息,生成对应的BaseDao中方法所对应mybatis sql片段。再通过调用以下方法,来将生成好的sql片段注册到mybatis中。

3 这样定制带来的几大好处

1. mybatis orm化,对于大多数应用场景无需mapper xml文件,即可使用。

2. 采用了比较好的Mybatis实践来实现方法,由sql技术大牛统一编写mybatis sql,避免大多数情况下自己编写sql导致的问题。

3. 能够植入一些mybatis不具备的特别的功能,比如dao方法监控自动接入、分库分表、过滤空条件update和delete。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180521A0VGSE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券