• 对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里面也能获取到自己定义的方法名字。

  • 相关阅读:
    机器学习笔记之配分函数(一)对数似然梯度
    Python中什么是多态,Python多态及用法详解
    使用pdf.js实现pdf的预览与打印
    设计模式:组合模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
    MATLAB 机械臂逆运动学进行轨迹控制建模
    跟李沐学AI-深度学习课程05线性代数
    109.firefly-extboot的生成脚本
    小程序虐我千百遍,我还怎么待她如初恋,回忆我五年的小程序开发之路
    基于Vue开发的门户网站展示和后台数据管理系统
    pytest精髓__fixture
  • 原文地址:https://blog.csdn.net/maybe_fly/article/details/125594241