请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

mybatis-generator 解决数据库字段更新问题

老师,我遇到情况如下:

使用mybatis-generator  生成以后,在后期需要添加字段,或修改字段名称, 这个时候使用插件去生成的话,会把原来的java 文件覆盖掉,里面已经有我自己写的方法,现在的解决办法是自己手段去修改xml文件,但是这样就很麻烦,感觉这个插件不够灵活。有没有什么解决办法

正在回答

3回答

你好,同学,很好的问题,其实实际生产环境我们也 是碰到这个问题,还没有好的解决办法,后期增加字段,包括写sql,都是人工控制的。不能再生成,容易把之前写的自定义的sql冲掉。。。

现在工作的时候也是这么做的。。囧,如果同学发现好办法,也顺便告诉我一下,学习一下。谢谢啦~~



2 回复 有任何疑惑可以回复我~
  • 提问者 慕娘9543598 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-03-26 09:47:24
KD里的傻气 2018-08-27 15:37:54

你这个问题也困扰我好久,在网上找了很多资料,只找到这一篇:

https://blog.csdn.net/HK2311/article/details/80536901

我试着做了一下,可以实现。但是上面这篇里面写的不太清楚,我稍微整理了一下,供参考。

大致的思路就是,比如有一张表Test,运行mybatis-generator后会生成一个叫Test.java的POJO,一个叫TestMapper.java的DAO接口,以及对应的TestMapper.xml。

现在建一个BaseTestMapper.java的DAO接口,使TestMapper继承BaseTestMapper;

再建一个BaseTestMapper.xml对应BaseTestMapper.java中的接口。

这样,自已添加的SQL时,只要修改BaseTestMapper.java中的接口,并在BaseTestMapper.xml写入对应的SQL。

具体就是:

1、在generatorConfig.xml中的table节点中增加一个配置

<property name="rootInterface" value="com.xxx.dao.BaseTestMapper"/>

https://img1.sycdn.imooc.com//szimg/5b83a7e600016e0607690299.jpg

2、运行mybatis-generator后,自动生成POJO、DAO和Mapper,可以看到,生成的DAO中已经自动把extends BaseTestMapper添加上去了

https://img1.sycdn.imooc.com//szimg/5b83a8490001f06404280306.jpg

3、在DAO层中创建一个BaseTestMapper接口,作为TestMapper的父级,并把需要添加的功能全部写在这里

https://img1.sycdn.imooc.com//szimg/5b83a8ba0001e35405980097.jpg

4、在Mapper中创建一个BaseTestMapper.xml,里面的<mapper>节点中的namespace参数要写的跟TestMapper.xml一样。把需要添加的SQL全部写在这个文件里。

https://img1.sycdn.imooc.com//szimg/5b83a918000108d708050235.jpg

在Controller中使用DAO时,还是照样使用TestMapper。

这样一来,以后如遇到表结构变化,需要重新运行mybatis-generator时,直接运行就可以,因为我们自已添加的代码全部写在了BaseTestMapper.java和BaseTestMapper.xml中了。

这个办法有点奇怪,因为我一开始的想法是应该把mybatis-generator生成的DAO作为父类,自定义的作为子类从它继承,但是试过以后发现不行,具体我也不解释了。

这个应该不是最好的办法,但是目前是能够解决一下这个问题。希望 Geely老师看看顺着这个思路,有没有更好的办法。。。


1 回复 有任何疑惑可以回复我~
提问者 慕娘9543598 2018-03-21 12:44:28

老师,我现在放弃这个插件了, 现在的思路都是,给每一层都加一个base类,继承这个基类,通过反射+泛型将sql语句拼接出来实现增伤改查,以及分页这些基本功能。xml里面只写非通用功能sql语句。 不过在想一个问题,这样子是不是每次查询,都要先做拼接。不过我想了想,mybatis 其实也是这么干的。不知道我理解有没有错老师。

1 回复 有任何疑惑可以回复我~
  • Geely #1
    你好,同学,这样也是可以的哟~~很赞~~不过反射的话,在非常频繁的时候会有性能瓶颈,不过对于一期项目可以先忽略。平外拼接的时候记得使用预编译的方式。
    回复 有任何疑惑可以回复我~ 2018-03-25 16:23:12
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信