对MybatisPlus的Select和Update实现自定义Sql
mybatisplus实现自定义sql,包含select和update
·
其实大部分的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里面也能获取到自己定义的方法名字。
更多推荐
已为社区贡献2条内容
所有评论(0)