MyBatis Generator生成纯净代码

作者:梁开权,叩丁狼高级讲师。原创文章,转载请注明原文章地址,谢谢!

各位小伙伴们大家好,我是叩丁狼的梁开权老师,代号逍遥,今天要给大家带来的福利是如何覆盖MyBatis Generator的源码还你一个纯洁的mapper.xml文件。

相信大家在使用MyBatis框架时一定会遇到要重复的去写domain / mapper接口 / mapper.xml,这些基础性的工作既没有技术含量又不得不写,后来官方出了个MyBatis的代码生成器,能帮助我们直接生成和数据库表对应的domain / mapper接口 / mapper.xml文件

这个代码生成器虽然很不错,但是对于有些遇到有代码洁癖的程序员来讲,还是比较喜欢看到一个纯洁的mapper.xml,我们先来对比下他们的不同,然后再来吐槽

截取一小段生成的mapper.xml文件来观赏下

<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC 
  "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="lcw.dao.MessgaeMapper" >
   <resultMap id="BaseResultMap" type="cn.wolfcode.pss.mapper.DepartmentMapper" >
       <id column="id" property="id" jdbcType="BIGINT" />
       <result column="name" property="name" jdbcType="VARCHAR" />
   </resultMap> 
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
       select id,name from department
       where id = #{id,jdbcType=BIGINT}
   </select>
   ...省略其他...
</mapper>

吐槽

在上面的代码中大家可以看到在默认的情况下会生成jdbcTypeparameterType两个属性,而且在脚本语言中也带有jdbcType,本身来讲这个不是什么问题,但是如果遇到传入的对象是parameterType的子类对象,并且在脚本语言中用到了子类对象特有属性时,就会出现找不到属性的异常了,所以该属性最好就不要生成出来

解决方案

在MyBatis Generator的源代码中找到其生成XML文件的代码,删除或者注释掉后重新编译,再把编译好的字节码替换jar包中对于的字节码那就大功告成啦!

具体操作步骤

1:在maven中下载其源代码,坐标如下:
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.5</version>
</dependency>

在本地仓库中根据坐标找到mybatis-generator-core-1.3.5-sources.jar
解压其源码的压缩包,把代码拷贝到IDE工具中

2:找到并操作以下几个核心的类:

org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities
该类的功能之一:生成脚本表达式,也就是#{…}内容,该类中有个静态方法获取参数从句,如图:
MyBatis3FormattingUtilities
把圈红的代码注释掉,那么生成的脚本表达式中就不再生成,jdbcType=xxx,那么脚本表达式就变纯洁啦!!

org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator
该类的作用是用于生成查询单个对象的statement语句,该类中有个方法public void addElements(XmlElement parentElement)其作用往mapper.xml中添加select id=”selectByPrimaryKey”元素,我们需要注释的代码在第66行,如图所示:
SelectByPrimaryKeyElementGenerator

其他的insert / updateByPrimaryKey / deleteByPrimaryKey / selectAll等标签的生成器类都对于在org.mybatis.generator.codegen.mybatis3.xmlmapper.elements包中能找到对于的ElementGenerator类,其规律是id名称+ElementGenerator,在这些类中都能找到一样的代码统统注释,然后拿到重新编译好的字节码去替换mybatis-generator-core-1.3.5.jar中的对于的字节码,以后就可以使用干净整洁的生成器啦!

有没有好爽的感觉?有需要的小伙伴可以去试试。

扫描二维码关注公众号,回复: 1674425 查看本文章


猜你喜欢

转载自blog.csdn.net/wolfcode_cn/article/details/80747911