请教 Mybatis plus 用法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
xiaoyureed
V2EX    Java

请教 Mybatis plus 用法

  •  
  •   xiaoyureed
    xiaoyureed Aug 9, 2024 9261 views
    This topic created in 634 days ago, the information mentioned may be changed or developed.

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

    gp=report.png

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

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

    Supplement 1    Aug 9, 2024
    决定改成 xml 写法
    Supplement 2    Aug 10, 2024
    对开始的问题还是找到了解决方法, 给有心人参考

    可以利用 `AbstractLambdaWrpper`

    ```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 replies    2024-09-14 11:15:32 +08:00
    montaro2017
        1
    montaro2017  
       Aug 9, 2024   2
    可以通过 lambda 表达式获取字段名,然后驼峰转下划线获取
    ```java
    LambdaMeta meta = LambdaUtils.extract(Project::getResearchType);
    String fieldName = PropertyNamer.methodToProperty(meta.getImplMethodName());
    fieldName = StrUtil.toUnderlineCase(fieldName);

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

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


    感觉还是直接写 sql 更直观,好维护点
    laikicka
        13
    laikicka  
       Aug 9, 2024
    多表的时候还是喜欢写 sql.
    angenin
        14
    angenin  
       Aug 9, 2024
    简单的查询用 plus ,复杂的还是写 sql 吧
    xiaoyureed
        15
    xiaoyureed  
    OP
       Aug 9, 2024
    @SmartTom 哈哈可读性好不好不确定, 反正写起来挺快的;
    reavid
        16
    reavid  
       Aug 9, 2024
    折腾来折腾去,最后还是只用 mybatis 和生成工具。
    xiaoyureed
        18
    xiaoyureed  
    OP
       Aug 9, 2024
    @hyqCrystal 只是看起来查询条件很多, 其实都是简单的条件查询, 只涉及到单个表
    ZZ74
        19
    ZZ74  
       Aug 9, 2024
    这种东西写成 java 代码 真的..... 不如直接 sql
    pangdundun996
        20
    pangdundun996  
       Aug 9, 2024
    @xiaoyureed #15 xml 写 sql 不是更快吗
    fpure
        21
    fpure  
       Aug 9, 2024
    真的,很不建议使用这种 mp 的类 queryDSL 的方式进行查询,原因有三:一、污染 service 层;二、毫无可读性;三、代码被 mp 侵入,以后想摘掉 mp 也难弄了
    iszhouyu
        22
    iszhouyu  
       Aug 9, 2024
    为啥我用的 mp 没见过.nested()这方法
    marking0614
        23
    marking0614  
       Aug 9, 2024
    复杂的 SQL 直接 xml 啊,这不给自己找罪受
    ShuangChenyue
        24
    ShuangChenyue  
       Aug 9, 2024
    这不算复杂查询把
    都是 where 条件判断 感觉写 xml 不如这样写
    Iakihsoug
        25
    Iakihsoug  
       Aug 9, 2024
    生成 entity 时加上 enableColumnConstant()开启生成字段常量,字符串用常量代替 GpReportEntity.APPROVE_TODO_STAFF
    elepant
        26
    elepant  
       Aug 9, 2024
    能不用 mybatis plus 就不用吧
    635925926
        27
    635925926  
       Aug 9, 2024
    @pangdundun996 用 orm 不用考虑逻辑删除。手写 sql 每个 sql 都要加上逻辑删除的条件
    zoharSoul
        28
    zoharSoul  
       Aug 9, 2024
    这种建议在 xml 里写 sql
    joker8ren
        29
    joker8ren  
       Aug 9, 2024
    看到那么长一串 就没有阅读的欲望了
    xiaoyureed
        30
    xiaoyureed  
    OP
       Aug 9, 2024
    @pangdundun996 总觉得 xml 更麻烦, 可能心理作用
    SmartTom
        31
    SmartTom  
       Aug 9, 2024
    @xiaoyureed #30 没那么麻烦,谨慎一点我都是在 nav 上跑一边手写的 sql ,没啥问题直接扔到 xml 中。
    sagaxu
        32
    sagaxu  
       Aug 9, 2024
    @xiaoyureed XML 是更麻烦,但是在 Java 良好支持多行字符串模板前,也只能这样了。不过也快了,2030 年之前应该能用上。
    vansiit
        33
    vansiit  
       Aug 9, 2024
    我一直在推荐用 xml 写 sql ,这个问题简直是一个活生生的例子。而且如果是多人团队,我是旗帜鲜明发反对引入 mybatis plus 和 jpa ,原因就是控制不了有人这么玩
    SmartTom
        34
    SmartTom  
       Aug 9, 2024
    @sagaxu 多行字符串? JDK17 不就有类似于 python 中的'''了吗。。。汗颜
    caixiaomao
        35
    caixiaomao  
       Aug 9, 2024
    我去,看都不想看,还是用 xml 写吧
    Mandelo
        36
    Mandelo  
       Aug 9, 2024
    没法考出来测试和优化吧
    sagaxu
        37
    sagaxu  
       Aug 9, 2024
    @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  
       Aug 9, 2024
    Mybatis plus 只用来做单表的简单 CURD ,复杂 SQL 一律走 XML 。
    别说多人团队了,哪怕就自己写的,两个月后再回头看看,都想扇自己嘴巴。
    winlans
        39
    winlans  
       Aug 9, 2024   1
    lombok 有个注解,@FieldNameConstants ,可以生成属性的字符串
    Surechun
        40
    Surechun  
       Aug 9, 2024
    简单直接写,复杂的用 sql ,方便后期调优。
    luozic
        41
    luozic  
       Aug 10, 2024
    复杂的,请上 xml
    Tenlearn
        42
    Tenlearn  
       Aug 11, 2024
    简单的 crud 和几个条件的查询用代码实现,像你这种,直接写 xml 更直观
    lingalonely
        43
    lingalonely  
       Aug 11, 2024
    直接写 SQL 吧
    diagnostics
        44
    diagnostics  
       Aug 14, 2024
    Mybatis Plus 作者那个态度,我是不敢用,出问题不好沟通来修复
    fkdog
        45
    fkdog  
       Sep 14, 2024
    mybatisplus 是针对国产 crud 宝宝体质特别开发的猪食。
    About     Help     Advertise     Blog     API     FAQ     Solana     2865 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 125ms UTC 07:35 PVG 15:35 LAX 00:35 JFK 03:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86