Mybatis如何改写带标签的SQL

Mybatis如何改写带标签的SQL

最近想动态改变mybatis执行的SQL,看了一些博客好像都是说的自定义拦截器实现Interceptor,然后获取

metaObject.getValue("delegate.boundSql.sql")

这样的。但是我看这里的sql语句已经是把

<if><where>

这些标签给替换过后的拿去数据库执行的SQL了。那么应该如何把自己重新写的带标签的语句重写进去呢?

绝大部分的改写sql,都是在原有sql上变更,所以插件就行了,而你的需求是不通过xml,自己定义便签内的sql片段,插件那就不合适了,而mybatis 3引入注解以后,提供了SelectProvider,可以自己定义类和方法,运行时通过反射动态决定具体的sql片段,

img


img


img


完美解决你的需求(PS:如果是自己yy的话,动态sql完全都可以满足你)

没听懂,

img


这样?

<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标签)