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

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

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

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

    @paragon

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

    一直感觉这样不是个好习惯。讨论下。。
    lhx2008
        18
    lhx2008  
    OP
       2018-01-02 21:37:26 +08:00
    @xiaoyangsa
    主要是为了定义常量和一对多关联。定义常量 我一般是用 Enum,哈哈。但是主要是一对多等等关联 mybatis-generator 不提供,自己写又要单元测试测半天,我也不知道各位大佬用 mybatis-generator 怎么优雅地解决关联管理的。
    主要是以前用 hibernate 的惯性,只要一个 @OnetoMany 就可以定义一对多,自动 fetch,很爽,定义 @Transient 就可以随便加在前端显示的内容
    但是换了 mybatis 之后,特别是用了 mybatis-generator 之后就啥也没有了,没 @OnetoMany,没 @Transient,于是就只能自己造轮子了,但是又不想破坏 mybatis-generator 生成的文件,于是研究了一天。
    xiaoyangsa
        19
    xiaoyangsa  
       2018-01-02 22:03:10 +08:00
    @lhx2008
    谢谢回复。我现在也是改用 Enum,感觉没有直接写方便。哈哈~
    icegreen
        20
    icegreen  
       2018-01-02 22:29:18 +08:00
    推荐用 jpa. 完全自动化,简单项目下, 没有 sql, 没有建表语句, 很安逸.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:14 · PVG 09:14 · LAX 17:14 · JFK 20:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.