• 对MybatisPlus的Select和Update实现自定义Sql


    其实大部分的sql都可以利用mybatisplus提供的,但是在我们这次的需求中,由于需要获取到方法名,以及在改造过程中需要对原来的代码有改动,希望能做到对原来代码的改动尽可能的小以及不改动原来的sql为目的,也就是说,希望能继续利用原来代码的wrapper语法。

    主要是在

    org.apache.ibatis.plugin.Interceptor

    的拦截中,获取到执行改sql的方法,类似用mybatisplus的基本上在

    1. ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
    2. Field boundSqlFiled = parameterHandler.getClass().getDeclaredField("boundSql");
    3. Field mappedStatementField = parameterHandler.getClass().getDeclaredField("mappedStatement");
    4. mappedStatementField.setAccessible(true);
    5. MappedStatement statement = (MappedStatement) mappedStatementField.get(parameterHandler);

    这些代码后拿到的sql方法都是mybatisplus设定的内置方法,就无法跟原来的方法进行区别,比如我在自定义sql的时候,还想入参用wrapper,但是方法名需要我自己的,就无法做到

    那么如何结合入参数还是wrapper,方法名字可以获取到自己设置的方法名字呢?

    查了很多资料后,在查询这块很好解决,例如

    1. @Delete("delete from test ${ew.customSqlSegment}")
    2. int extDelete(@Param(Constants.WRAPPER) Wrapper wrapper);
    3. @Select("select * from test ${ew.customSqlSegment}")
    4. List<Test> extSelectList(@Param(Constants.WRAPPER) Wrapper wrapper);

     查询和删除就可以用这两种特殊的语法解决掉,在组装sql的时候就会把

    ${ew.customSqlSegment}解析为where+你设置的条件,而且也能获取到自己设置的方法名字

    那么update是否也可以这样呢?

    答案是也可以进行这样的自定义sql,只不过有一些区别

    1. @Update("update Test set ${ew.sqlSet} ${ew.customSqlSegment}")
    2. int extUpdate(@Param(Constants.U_WRAPPER_SQL_SET) Wrapper wrapperSet, @Param(Constants.WRAPPER) Wrapper wrapper);

     要多加一个wrapper,两个参数都是同一个wrapper就好,只是在sql的里面需要有不一样,set的时候需要用

    set ${ew.sqlSet}

    这个语法,where后面的依然按照前面的即可,这样在intercepter里面也能获取到自己定义的方法名字。

  • 相关阅读:
    TCP三次握手与四次挥手
    IDEA2021.1默认设置打开方式(JDK版本和Maven版本)
    MySQL分区
    A coredump story about NGINX ctx and error_page
    面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
    【云原生之Docker实战】使用Docker部署siyuan个人笔记系统
    Cleanmymac X2023Mac内存清理功能介绍指南
    利用python的Matplotlib库进行基本绘图
    同样的APP为何在Android 8以后网络感觉变卡?
    马斯克回应OpenAI:"Change your name"
  • 原文地址:https://blog.csdn.net/maybe_fly/article/details/125594241