java直接获取MyBatis将要执行的动态sql命令(不是拦截器方式)

发布于:2025-05-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

前言

一. 准备数据

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

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;

网站公告

今日签到

点亮在社区的每一天
去签到