目錄
前言
一. 準備數據
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;