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

主要是在

org.apache.ibatis.plugin.Interceptor

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

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

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

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

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

    @Delete("delete from test ${ew.customSqlSegment}")
    int extDelete(@Param(Constants.WRAPPER) Wrapper wrapper);

    @Select("select * from test ${ew.customSqlSegment}")
    List<Test> extSelectList(@Param(Constants.WRAPPER) Wrapper wrapper);

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

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

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

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

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

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

set ${ew.sqlSet}

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐