目录
前言
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
BEGIN
insert 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;