手写spring+springmvc+mybatis框架篇Mybatis

作者:小亮,原创投稿

知音专栏

整合Mybatis是本项目中的一个难点。

实现功能:

1 动态绑定用户输入参数

2 Mybatis的resultType动态绑定返回实体类。

3 在spring中的接口注入

4 xml版本的mapper注入。

关于Mybatis的优秀文章给大家推荐两个:

1、手写简化版mybatis

https://my.oschina.net/liughDevelop/blog/1631006

2、Mybatis源码解读-设计模式总结

手写板大致思路如下:

https://my.oschina.net/liughDevelop/blog/1631006

这里的Myconfiguration和我的JDBCUtils类似。

实现思路:

首先用XmlBuilderMapper类读取mapper.xml(我是在initBean中指定要读取的配置文件,并没有写成在xml中配置动态的读取xml。)文件,获取MapperInfo对象保存信息。

用户用MysqlSession的getMapper方法,返回一个代理对象,用这个代理对象来执行MySqlSession定义的selectOne方法来查询,Mybaits中的SqlSession中定义了大量的方法,我这里简化只有一个selectOne方法。

然后这个方法调用executor执行器来解析sql,传入参数,执行数据库操作。最后返回结果。将返回结果封装成对象。

动态代理一般有两种,一种是jdk一种是cglib动态代理,本项目采用是jdk动态代理实现。

XmlBuilderMapper.class

然后介绍一下MapperInfo对象

JDBCUtils工具类我在开篇就介绍了,也没什么新内容,不贴在这里了

其实关键点就是动态代理和执行器

MySqlSession(动态代理部分)

MyMapperProxy(jdk动态代理的实现) 代理之后执行的还是sqlSession中的方法

返回到MySqlSession后,就轮到执行器MyExcutor出场了。

MyExcutor:也是一个难点,先说一下程序的逻辑。读取到mapperinfo对象,获得定义的sql,返回类的名称等信息。

用正则解析sql,根据#{},判断sql中有几处?,然后将用户传递的参数按照顺序依次写入到sql的?中。

最后读取结果集,用set方法注入到返回的对象中,这样就实现了返回时候的实体类绑定了。

我将此项目上传到了github,需要的童鞋可以自行下载。

https://github.com/836219171/MySSM

推荐大而全的【后端技术精选】

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730A098VO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券