目录
前言
一. 准备数据
1. 传输过来的json条件数据
2. mybatis 配置的动态sql
3. 想要的最终会执行的sql并返回给页面展示
二. 实现方式
三. 最终代码
前言
1.在平常开发过程中,MyBatis使用时非常多的,一般情况下我们只需要在控制台看看MyBatis输出的日志,要不就是实现 MyBatis 提供的接口 Interceptor 来拦截,对执行前进行一些操作。
2.但是有这么一种需求,将 MyBatis 的 sql 都配置到数据库里,相当于一个字符串,通过传输的 json 参数获取 MyBatis 解析 动态sql 获取最终sql,并返回给页面展示,是不是很小众的需求。
MappedStatement ms = configuration.getMappedStatement("com.路径.类名.方法名");
BoundSql boundSql = ms.getBoundSql(map);
String sql = boundSql.getSql();
System.out.println(sql);
3.网上也没有太多案例,大部分都是此类只能解析静态sql的案例,很少有解析动态sql的案例,今天就遇到了,所以今天记录下是怎么实现的。
一. 准备数据
比方说我们有这么一组数据
1. 传输过来的json条件数据
{"id": "17484150668118547d7bd2c539749a378d8a69dfa26d","serialNum": 1,"courseId": "2024-2025-2-D571061023-075212","orderNum": 2,"list1": ["362D8FD7F24DABACE065020C29BC0833"],"name": "啦啦","way": "1","list2": [{"orderNum": 3,"id": "1748415080498a2142926e7e22c483e1f6e7a84b48387","name": "3哈3"},{"orderNum": 4,"id": "17484150985463b22fcccb983ead6a6bc8e4f11fdadcd6","name": "4哈4"}]
}
2. mybatis 配置的动态sql
BEGINinsert into t_aaaaaaa (id, course_id, name, serial_num, way, order_num, create_date, update_date) values(#{id}, #{courseId}, #{name} , #{serialNum} , #{way} , #{orderNum}, sysdate, sysdate);<foreach collection="list1" item="item" index="index" >insert into t_bbbbbbbb (id, host_id, ass_id)values (sys_guid(), #{id}, #{item});</foreach><if test="list2 != null and list2.size > 0"><foreach collection="list2" item="item" index="index" >insert into t_cccccccc (id, course_id, host_id, order_num, create_date, update_date, name)values (sys_guid(), #{courseId}, #{id}, #{item.orderNum}, sysdate, sysdate, #{item.name});</foreach></if>
END;