首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  Java

mybatis-generator 是只能生成一次吗?如果数据库修改之后要怎么用?

  •  
  •   lhx2008 · 293 天前 · 3477 次点击
    这是一个创建于 293 天前的主题,其中的信息可能已经有所发展或是发生改变。
    mybatis-generator 生成了一次 之后,手工修改了 pojo 和 mapper (比如增加一对多,多对一的关联查询)
    当我修改了数据库字段时候,是不是就不能再用 mybatis-generator 生成了?
    试了好多次好像都是全文件覆盖模式,以前写的就没了,
    不会自动删除以前自动生成的代码重新生成并且保留我写的代码。
    20 回复  |  直到 2018-01-02 22:29:18 +08:00
        1
    coder2cooker   293 天前   ♥ 1
    好像有个逆向工程支持一对多关联关系的插件,可以去 google 下。

    如果每次增量修改的内容很少,手工编写代码是不是还方便一些?
        2
    lhx2008   293 天前 via Android
    @coder2cooker 但是还是感觉治标不治本,如果没有什么好办法就只能是自己手改了
        3
    kulove   293 天前
    为什么要手工改它生成的文件?手工的单独写个啊
        4
    lhx2008   293 天前 via Android
    @kulove 那有有关联表的怎么办? pojo 还是要改吧
        5
    paragon   293 天前
    生成的和自己写的分开 自动生成的那部分用 CI 自动构建
        6
    lhx2008   293 天前 via Android
    @paragon 那 pojo 类怎么处理呢?
        7
    flowerwrong   293 天前   ♥ 2
    我觉得三个方案:
    1. 再加一层 modle extension,继承 model,父 modle 里面只放模板内容,自动生产且不变动,子 model 随意。
    2. 自定义 mybatis-generator,把表间关系那些都自动生成。
    3. 1 + 2 我就是这么干的。
        8
    paragon   293 天前   ♥ 1
    @lhx2008 也分你自己写的和自动生成的~
        9
    lhx2008   293 天前 via Android
    @flowerwrong

    @paragon

    谢谢,看来就是 pojo 继承自动生成的,自动生成的 pojo 在实际业务中隐藏
    然后关联查询也是继承自动生成的 mapper 接口就行
        10
    lhx2008   293 天前
    @flowerwrong 实际撸的时候又有问题,父类是模板内容,子类继承模板内容,但是 mapper 里面返回的是父类,怎么转到子类呢?
        11
    flowerwrong   293 天前
    @lhx2008 通用 mapper 和自定义 mapper 分开。
        12
    flowerwrong   293 天前
    @lhx2008 我项目比较复杂,完全把自动生成的东西和自定义的分开的。model,通用 mapper (参考插件 https://github.com/itfsw/mybatis-generator-plugin )都是生成的。如果需要 join 表自定义查询等,就新建 mapper 继承。该返回哪个 model 看需要,也可能定义新的 dto 返回。
        13
    lhx2008   293 天前
    @flowerwrong 对,这样子就弄等于就是从 sql 开始弄了两套了,虽然用继承可以少一点代码,但是还是很麻烦。
    我的是小项目,想快速开发,我想是 DAO 层不动直接用生成的,然后直接在 Service 层做一些关联查询还有一些瞬时数据插入之类的。
    但是自动生成的 model 又和 mapper 绑定了,直接在生成的 model 追加瞬时变量就可以满足我的需求。
    所以现在到底要不要直接改 model 我也很纠结。
        14
    lhx2008   293 天前 via Android
    @flowerwrong 按照你的弄的话就是还要完全重写一个 mapper 的接口和一个 xml 来继承自动生成的,包括 get list 方法都要写一遍,但是我只是想多加几个瞬时属性
        15
    18583826786   293 天前 via Android   ♥ 1
    pojo 中添加包装类,mapper 里在原来的 xml 中添加 sql 和创建新的 xml
        16
    lhx2008   293 天前
    自己摸索了个几个小时,找到一个比较好的方法,
    让自己定义的 extension 当父类,然后在 generator 中设置<property name="rootClass" value="pojo.extension.xxxExtension"/>,就可以自动让生成出来类的继承自己的 Extension
    然后如果要写自己写 mapper 也 extension 就好,非常简单
        17
    xiaoyangsa   292 天前
    。。我自己写了个生成.
    lz 改 pojo 是不是和我一样,喜欢在 pojo 里面定义些类型常量。。
    比如
    数据库字段有个 int type
    然后我 pojo 里会有个 String[] typeNameArray={"类型 1","类型 2"};
    然后再构造一个 String typeName; get。。。set。。
    这样来方便每次前端的显示。。

    一直感觉这样不是个好习惯。讨论下。。
        18
    lhx2008   292 天前
    @xiaoyangsa
    主要是为了定义常量和一对多关联。定义常量 我一般是用 Enum,哈哈。但是主要是一对多等等关联 mybatis-generator 不提供,自己写又要单元测试测半天,我也不知道各位大佬用 mybatis-generator 怎么优雅地解决关联管理的。
    主要是以前用 hibernate 的惯性,只要一个 @OnetoMany 就可以定义一对多,自动 fetch,很爽,定义 @Transient 就可以随便加在前端显示的内容
    但是换了 mybatis 之后,特别是用了 mybatis-generator 之后就啥也没有了,没 @OnetoMany,没 @Transient,于是就只能自己造轮子了,但是又不想破坏 mybatis-generator 生成的文件,于是研究了一天。
        19
    xiaoyangsa   292 天前
    @lhx2008
    谢谢回复。我现在也是改用 Enum,感觉没有直接写方便。哈哈~
        20
    icegreen   292 天前
    推荐用 jpa. 完全自动化,简单项目下, 没有 sql, 没有建表语句, 很安逸.
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2197 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 19ms · UTC 13:15 · PVG 21:15 · LAX 06:15 · JFK 09:15
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1