最近想动态改变mybatis执行的SQL,看了一些博客好像都是说的自定义拦截器实现Interceptor,然后获取
metaObject.getValue("delegate.boundSql.sql")
这样的。但是我看这里的sql语句已经是把
<if>、<where>
这些标签给替换过后的拿去数据库执行的SQL了。那么应该如何把自己重新写的带标签的语句重写进去呢?
绝大部分的改写sql,都是在原有sql上变更,所以插件就行了,而你的需求是不通过xml,自己定义便签内的sql片段,插件那就不合适了,而mybatis 3引入注解以后,提供了SelectProvider,可以自己定义类和方法,运行时通过反射动态决定具体的sql片段,
没听懂,
<where> + <if>
写全,控制参数
看了上边的评论,大概了解了题主是啥意思,哈哈哈
想的挺多哈,,,能实现,不过我个人觉得这样干确实不规范
比如我下边这样
<select id="test" resultType="java.lang.String">
${str}
</select>
传入的话直接拼接好sql
@GetMapping("/testFeignClientOutTime")
@ApiOperation("client时效时间")
public void testFeignClientOutTime() {
String str = "select jam_date from jam_statistics_event where status = 8 ";
String a = mapper.test(str);
EventListQuery query = new EventListQuery();
query.setPageNum(1);
query.setPageSize(10);
PageResult<List<TrafficEventVO>> all = eventFeignClient.findAll(query);
List<TrafficEventVO> data = all.getData();
System.out.println("123");
}
拦截器中用String声明一个sql,然后将拦截的sql用字符串拼接的方式拼好后赋值给声明的sql,然后去执行(具体拼接方式是给原有的sql中where后的属性添加if标签)