使用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到生成文件的那行代码,取了目标文件路径,和实际文件做对比,再试着改设置,才最终使得脚本正确运行的。