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

请教 Mybatis plus 用法

  •  
  •   xiaoyureed ·
    xiaoyureed · 2024-08-09 08:55:10 +08:00 · 7305 次点击
    这是一个创建于 391 天前的主题,其中的信息可能已经有所发展或是发生改变。

    俺用 mybatis-plus 做业务的时候, 经常碰到需要用 apply 自定义 sql 的场景, 像这样

    gp=report.png

    APPROVE_TODO_STAFF 是数据库的字段名字, 对应 java entity 里的一个字段 approveTodoStaff, 有时候用 IDE 对 approveTodoStaff重构, APPROVE_TODO_STAFF 不会自动修改,就漏了.

    我的问题是, 有办法消除 APPROVE_TODO_STAFF 吗?

    第 1 条附言  ·  2024-08-09 10:31:15 +08:00
    决定改成 xml 写法
    第 2 条附言  ·  2024-08-10 20:55:13 +08:00
    对开始的问题还是找到了解决方法, 给有心人参考

    可以利用 `AbstractLambdaWrapper`

    ```java

    public class ColResolver<T> extends AbstractLambdaWrapper<T, ColResolver<T>> {

    public static <T> ColResolver<T> create() {
    return new ColResolver<>();
    }

    public String columnName(SFunction<T, ?> getter) {
    return this.columnToString(getter);
    }

    /** useless */
    @Override
    protected ColResolver<T> instance() {
    return null;
    }

    @Override
    protected String columnToString(SFunction<T, ?> column) {
    return super.columnToString(column);
    }
    }
    ```
    45 条回复    2024-09-14 11:15:32 +08:00
    montaro2017
        1
    montaro2017  
       2024-08-09 09:02:40 +08:00   ❤️ 2
    可以通过 lambda 表达式获取字段名,然后驼峰转下划线获取
    ```java
    LambdaMeta meta = LambdaUtils.extract(Project::getResearchType);
    String fieldName = PropertyNamer.methodToProperty(meta.getImplMethodName());
    fieldName = StrUtil.toUnderlineCase(fieldName);

    ```
    montaro2017
        2
    montaro2017  
       2024-08-09 09:09:13 +08:00
    @montaro2017 #1 驼峰转下划线可以直接使用 mp 内置工具类
    fieldName = StringUtils.camelToUnderline(fieldName);
    SmartTom
        3
    SmartTom  
       2024-08-09 09:15:18 +08:00   ❤️ 5
    歪个楼,这样写有可读性可言吗?
    vishun
        4
    vishun  
       2024-08-09 09:22:19 +08:00   ❤️ 1
    @SmartTom #3 曾经我也认为这样用 ORM 是更现代的方式,但是后来慢慢觉得这样真的是没有 xml 中写的直观和有可读性。
    hapeman
        5
    hapeman  
       2024-08-09 09:23:08 +08:00
    反射?
    hyqCrystal
        6
    hyqCrystal  
       2024-08-09 09:23:15 +08:00
    我觉得简单的用 mybatis plus 无可厚非 复杂的写自定义 sql 可读性 维护性高点
    wetalk
        7
    wetalk  
       2024-08-09 09:23:36 +08:00
    @SmartTom 我认为没有,属于把 plus 用歪了
    ma836323493
        8
    ma836323493  
       2024-08-09 09:23:41 +08:00
    这种这么长的查询,建议你直接写 sql , 不要用 mybatis plus , 我都是简单查询和更新才用 plus
    BiChengfei
        9
    BiChengfei  
       2024-08-09 09:25:15 +08:00
    insert
    updteById
    小表查询直接用 .selectList(Wrappers.emptyWrapper()).stream().filter()..... 内存查找
    复杂查询用 xml ,千万别用 like()、in() 这些函数
    wuvvu
        10
    wuvvu  
       2024-08-09 09:30:08 +08:00
    问个题外话,这个显示缩进的是怎么实现的,是插件吗
    flowerains
        11
    flowerains  
       2024-08-09 09:30:32 +08:00
    plus 的重点是简化你的单表查询负担,用 querywrapper 构造一些简单应用增删改查

    像你写的这种就应该用 mybatis 自带的,直接在 xml 中写 SQL
    shuqin2333
        12
    shuqin2333  
       2024-08-09 09:32:36 +08:00   ❤️ 2
    写个自定义的方法支持下就好了 ColumnUtil.getColumnName(Approve::getApproveTodoStaff)


    感觉还是直接写 sql 更直观,好维护点
    laikick
        13
    laikick  
       2024-08-09 09:37:29 +08:00
    多表的时候还是喜欢写 sql.
    angenin
        14
    angenin  
       2024-08-09 09:49:22 +08:00
    简单的查询用 plus ,复杂的还是写 sql 吧
    xiaoyureed
        15
    xiaoyureed  
    OP
       2024-08-09 09:50:11 +08:00
    @SmartTom 哈哈可读性好不好不确定, 反正写起来挺快的;
    fangxisama
        16
    fangxisama  
       2024-08-09 09:52:53 +08:00
    折腾来折腾去,最后还是只用 mybatis 和生成工具。
    xiaoyureed
        17
    xiaoyureed  
    OP
       2024-08-09 09:54:11 +08:00   ❤️ 1
    xiaoyureed
        18
    xiaoyureed  
    OP
       2024-08-09 09:56:03 +08:00
    @hyqCrystal 只是看起来查询条件很多, 其实都是简单的条件查询, 只涉及到单个表
    ZZ74
        19
    ZZ74  
       2024-08-09 10:12:29 +08:00
    这种东西写成 java 代码 真的..... 不如直接 sql
    pangdundun996
        20
    pangdundun996  
       2024-08-09 10:23:06 +08:00
    @xiaoyureed #15 xml 写 sql 不是更快吗
    fpure
        21
    fpure  
       2024-08-09 10:30:18 +08:00
    真的,很不建议使用这种 mp 的类 queryDSL 的方式进行查询,原因有三:一、污染 service 层;二、毫无可读性;三、代码被 mp 侵入,以后想摘掉 mp 也难弄了
    iszhouyu
        22
    iszhouyu  
       2024-08-09 10:41:17 +08:00
    为啥我用的 mp 没见过.nested()这方法
    marking0614
        23
    marking0614  
       2024-08-09 10:41:28 +08:00
    复杂的 SQL 直接 xml 啊,这不给自己找罪受
    ShuangChenyue
        24
    ShuangChenyue  
       2024-08-09 11:02:05 +08:00
    这不算复杂查询把
    都是 where 条件判断 感觉写 xml 不如这样写
    Iakihsoug
        25
    Iakihsoug  
       2024-08-09 11:15:06 +08:00
    生成 entity 时加上 enableColumnConstant()开启生成字段常量,字符串用常量代替 GpReportEntity.APPROVE_TODO_STAFF
    Asan
        26
    Asan  
       2024-08-09 11:48:48 +08:00
    能不用 mybatis plus 就不用吧
    635925926
        27
    635925926  
       2024-08-09 13:23:36 +08:00
    @pangdundun996 用 orm 不用考虑逻辑删除。手写 sql 每个 sql 都要加上逻辑删除的条件
    zoharSoul
        28
    zoharSoul  
       2024-08-09 13:24:06 +08:00
    这种建议在 xml 里写 sql
    joker8ren
        29
    joker8ren  
       2024-08-09 13:38:49 +08:00
    看到那么长一串 就没有阅读的欲望了
    xiaoyureed
        30
    xiaoyureed  
    OP
       2024-08-09 13:50:16 +08:00
    @pangdundun996 总觉得 xml 更麻烦, 可能心理作用
    SmartTom
        31
    SmartTom  
       2024-08-09 14:56:26 +08:00
    @xiaoyureed #30 没那么麻烦,谨慎一点我都是在 nav 上跑一边手写的 sql ,没啥问题直接扔到 xml 中。
    sagaxu
        32
    sagaxu  
       2024-08-09 15:05:25 +08:00
    @xiaoyureed XML 是更麻烦,但是在 Java 良好支持多行字符串模板前,也只能这样了。不过也快了,2030 年之前应该能用上。
    vansiit
        33
    vansiit  
       2024-08-09 15:20:53 +08:00
    我一直在推荐用 xml 写 sql ,这个问题简直是一个活生生的例子。而且如果是多人团队,我是旗帜鲜明发反对引入 mybatis plus 和 jpa ,原因就是控制不了有人这么玩
    SmartTom
        34
    SmartTom  
       2024-08-09 15:35:25 +08:00
    @sagaxu 多行字符串? JDK17 不就有类似于 python 中的'''了吗。。。汗颜
    caixiaomao
        35
    caixiaomao  
       2024-08-09 15:53:20 +08:00
    我去,看都不想看,还是用 xml 写吧😀
    Mandelo
        36
    Mandelo  
       2024-08-09 16:05:58 +08:00
    没法考出来测试和优化吧
    sagaxu
        37
    sagaxu  
       2024-08-09 16:57:38 +08:00
    @SmartTom String Templates Java 21 才有预览版,Java 22 是 Second Preview ,到 Java 23 时放弃了。

    https://mail.openjdk.org/pipermail/amber-spec-experts/2024-April/004106.html
    burymme11
        38
    burymme11  
       2024-08-09 18:03:36 +08:00
    Mybatis plus 只用来做单表的简单 CURD ,复杂 SQL 一律走 XML 。
    别说多人团队了,哪怕就自己写的,两个月后再回头看看,都想扇自己嘴巴。
    winlans
        39
    winlans  
       2024-08-09 18:09:25 +08:00   ❤️ 1
    lombok 有个注解,@FieldNameConstants ,可以生成属性的字符串
    Surechun
        40
    Surechun  
       2024-08-09 19:42:30 +08:00
    简单直接写,复杂的用 sql ,方便后期调优。
    luozic
        41
    luozic  
       2024-08-10 19:26:12 +08:00
    复杂的,请上 xml
    Tenlearn
        42
    Tenlearn  
       2024-08-11 00:39:31 +08:00
    简单的 crud 和几个条件的查询用代码实现,像你这种,直接写 xml 更直观
    lingalonely
        43
    lingalonely  
       2024-08-11 23:34:43 +08:00
    直接写 SQL 吧
    diagnostics
        44
    diagnostics  
       2024-08-14 16:39:46 +08:00
    Mybatis Plus 作者那个态度,我是不敢用,出问题不好沟通来修复
    fkdog
        45
    fkdog  
       355 天前
    mybatisplus 是针对国产 crud 宝宝体质特别开发的猪食。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:24 · PVG 05:24 · LAX 14:24 · JFK 17:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.