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

  • 相关阅读:
    网页设计期末作业,基于HTML+CSS+JavaScript超酷超炫的汽车类企业网站(6页)
    绘图系统三:支持散点图、极坐标和子图绘制
    空域变换-直方图局部处理(CLAHE)
    Seata AT模式下的源码解析(三)
    Linux常用命令
    数据结构(二)顺序表和链表
    公开IP属地信息如何保护用户的隐私?
    C#线程发展历史
    天气、气象相关API汇总分享
    React入门
  • 原文地址:https://blog.csdn.net/maybe_fly/article/details/125594241