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

请教 Mybatis plus 用法

  •  
  •   xiaoyureed ·
    xiaoyureed · 104 天前 · 6361 次点击
    这是一个创建于 104 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    gp=report.png

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

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

    第 1 条附言  ·  104 天前
    决定改成 xml 写法
    第 2 条附言  ·  103 天前
    对开始的问题还是找到了解决方法, 给有心人参考

    可以利用 `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  
       104 天前   ❤️ 2
    可以通过 lambda 表达式获取字段名,然后驼峰转下划线获取
    ```java
    LambdaMeta meta = LambdaUtils.extract(Project::getResearchType);
    String fieldName = PropertyNamer.methodToProperty(meta.getImplMethodName());
    fieldName = StrUtil.toUnderlineCase(fieldName);

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

    像你写的这种就应该用 mybatis 自带的,直接在 xml 中写 SQL
    shuqin2333
        12
    shuqin2333  
       104 天前   ❤️ 2
    写个自定义的方法支持下就好了 ColumnUtil.getColumnName(Approve::getApproveTodoStaff)


    感觉还是直接写 sql 更直观,好维护点
    laikick
        13
    laikick  
       104 天前
    多表的时候还是喜欢写 sql.
    angenin
        14
    angenin  
       104 天前
    简单的查询用 plus ,复杂的还是写 sql 吧
    xiaoyureed
        15
    xiaoyureed  
    OP
       104 天前
    @SmartTom 哈哈可读性好不好不确定, 反正写起来挺快的;
    fangxisama
        16
    fangxisama  
       104 天前
    折腾来折腾去,最后还是只用 mybatis 和生成工具。
    xiaoyureed
        18
    xiaoyureed  
    OP
       104 天前
    @hyqCrystal 只是看起来查询条件很多, 其实都是简单的条件查询, 只涉及到单个表
    ZZ74
        19
    ZZ74  
       104 天前
    这种东西写成 java 代码 真的..... 不如直接 sql
    pangdundun996
        20
    pangdundun996  
       104 天前
    @xiaoyureed #15 xml 写 sql 不是更快吗
    fpure
        21
    fpure  
       104 天前
    真的,很不建议使用这种 mp 的类 queryDSL 的方式进行查询,原因有三:一、污染 service 层;二、毫无可读性;三、代码被 mp 侵入,以后想摘掉 mp 也难弄了
    iszhouyu
        22
    iszhouyu  
       104 天前
    为啥我用的 mp 没见过.nested()这方法
    marking0614
        23
    marking0614  
       104 天前
    复杂的 SQL 直接 xml 啊,这不给自己找罪受
    ShuangChenyue
        24
    ShuangChenyue  
       104 天前
    这不算复杂查询把
    都是 where 条件判断 感觉写 xml 不如这样写
    Iakihsoug
        25
    Iakihsoug  
       104 天前
    生成 entity 时加上 enableColumnConstant()开启生成字段常量,字符串用常量代替 GpReportEntity.APPROVE_TODO_STAFF
    Asan
        26
    Asan  
       104 天前
    能不用 mybatis plus 就不用吧
    635925926
        27
    635925926  
       104 天前
    @pangdundun996 用 orm 不用考虑逻辑删除。手写 sql 每个 sql 都要加上逻辑删除的条件
    zoharSoul
        28
    zoharSoul  
       104 天前
    这种建议在 xml 里写 sql
    joker8ren
        29
    joker8ren  
       104 天前
    看到那么长一串 就没有阅读的欲望了
    xiaoyureed
        30
    xiaoyureed  
    OP
       104 天前
    @pangdundun996 总觉得 xml 更麻烦, 可能心理作用
    SmartTom
        31
    SmartTom  
       104 天前
    @xiaoyureed #30 没那么麻烦,谨慎一点我都是在 nav 上跑一边手写的 sql ,没啥问题直接扔到 xml 中。
    sagaxu
        32
    sagaxu  
       104 天前
    @xiaoyureed XML 是更麻烦,但是在 Java 良好支持多行字符串模板前,也只能这样了。不过也快了,2030 年之前应该能用上。
    vansiit
        33
    vansiit  
       104 天前
    我一直在推荐用 xml 写 sql ,这个问题简直是一个活生生的例子。而且如果是多人团队,我是旗帜鲜明发反对引入 mybatis plus 和 jpa ,原因就是控制不了有人这么玩
    SmartTom
        34
    SmartTom  
       104 天前
    @sagaxu 多行字符串? JDK17 不就有类似于 python 中的'''了吗。。。汗颜
    caixiaomao
        35
    caixiaomao  
       104 天前
    我去,看都不想看,还是用 xml 写吧😀
    Mandelo
        36
    Mandelo  
       104 天前
    没法考出来测试和优化吧
    sagaxu
        37
    sagaxu  
       104 天前
    @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  
       104 天前
    Mybatis plus 只用来做单表的简单 CURD ,复杂 SQL 一律走 XML 。
    别说多人团队了,哪怕就自己写的,两个月后再回头看看,都想扇自己嘴巴。
    winlans
        39
    winlans  
       104 天前   ❤️ 1
    lombok 有个注解,@FieldNameConstants ,可以生成属性的字符串
    Surechun
        40
    Surechun  
       104 天前
    简单直接写,复杂的用 sql ,方便后期调优。
    luozic
        41
    luozic  
       103 天前
    复杂的,请上 xml
    Tenlearn
        42
    Tenlearn  
       102 天前
    简单的 crud 和几个条件的查询用代码实现,像你这种,直接写 xml 更直观
    lingalonely
        43
    lingalonely  
       101 天前
    直接写 SQL 吧
    diagnostics
        44
    diagnostics  
       99 天前
    Mybatis Plus 作者那个态度,我是不敢用,出问题不好沟通来修复
    fkdog
        45
    fkdog  
       68 天前
    mybatisplus 是针对国产 crud 宝宝体质特别开发的猪食。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.