mybatis-generator代码生成与手写代码分离实践

使用mybatis-generator自动生成代码,还是很方便的,但是自动生成的代码,都是简单的单表查询sql,显然没办法满足所有的业务需求,所以还有很多sql是需要手写的,那么这时,手写代码是写到自动生成的xml和接口类里呢,还是另外创建xml和类呢?

如果直接写到自动生成的文件里,那么当业务需求更新,表结构变更后,需要重新生成xml和接口类时,就麻烦了,经常会有手写代码被覆盖掉。

当然也可以用另一种方式,就是另外创建xml和接口类,把手写代码和自动生成代码分离开,但这样就不好像写在一起那样方便的引自动生成的BaseResultMap和Base_Column_List了(通过命名空间.BaseResultMap来引,应该也是能引到的,我没这样实践过),感觉也不是太方便,那么有没有办法解决呢?

下面介绍下我解决此问题的实践。首先需要用到我之前一篇博客里介绍到的mybatis mapper继承的相关知识(https://blog.csdn.net/ytzzh0726/article/details/84701786),具体做法请参考那篇博客。

实践创建的demo源码地址:https://gitee.com/regedit0726/mybatis-generator-demo

这是一个基于spring boot的demo,启动后直接访问http://localhost:8080/test就可以看到实践结果了。

然后把表结构改下,加个int类型的age,在这一列加上数据,然后执行一下单元测试雹下的GeneratorConfig类的方法generate,源码中的自动生成的mapper,dao接口和model类就更新了,再访问下上面的接口,返回数据就更新了,添加了age字段的数据。

resources/sql下有demo的建表sql

resources/generatorConfig.xml是自动生成代码的配置,这个和一般使用的配置没什么区别,使用过mybatis-generator的应该比较熟悉了

关键代码:

单元测试雹下的GeneratorConfig类的方法generate

这个方法就是具体的自动代码生成脚本,里面写了详细的注释,应该完全能看懂了,最前面就是一般使用的脚本,会先按一般方式生成代码,然后会利用反射修改生成的接口类,model类和xml文件相关信息,删除之前生成的文件,重新生成一遍文件,这时生成的接口类和model类,就直接带了声明父接口(当然model类声明父接口并不是必要的,这部分可以根据需要注释掉相关脚本即可)

几个注意问题:

1,父接口类,不能注入,确保不要被Spring扫描注入,不然程序运行会报错(这个在之前mapper继承的博文里有说到)

2,报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

这个有两种可能性,一种是xml文件没打到包里,所以找不到sql,还有就是配置mapper扫描路径,没有扫到extMapper.xml

3,执行GeneratorConfig类的generate方法后没有生成类文件,也没有报错,这可能的原因是路径不对,当使用IDEA加载一个多模块的maven项目,或者是用IDEA直接打开一个目录,而这个目录并不是项目的根目录,项目是以模块的形式导入的,这时,generatorConfig.xml中的targetProject以及脚本中写文件的路径就不对了,这时设置起来就比较麻烦些了,我当时是debug到生成文件的那行代码,取了目标文件路径,和实际文件做对比,再试着改设置,才最终使得脚本正确运行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值