触发器小记
触发器在我认识当中是通过数据库直接建立的,最近接到一个开发任务,需要动态创建触发器建立在代码中;大写的一脸懵逼啊~~~~ 现在对这次开发做一次记录。好记心不如烂笔头,每天进步一点点。
在其中涉及到查询数据库表信息,其中涉及到两条关于数据库的语句:
- 查询数据库的表名
SELECT table_name FROM information_schema.TABLES WHERE table_schema = 'db'
- 查询某个表的所有字段
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = #{tableName}
这两条语句也走了小弯路,查询技术还是不是很精准,对症下药---------
下面到本章的重点-------------------------动态创建触发器
模板:
DROP TRIGGER IF EXISTS userTriger; CREATE TRIGGER userTriger AFTER INSERT ON `user` FOR EACH ROW BEGIN DECLARE dataJson text; SET dataJson = ( SELECT GROUP_CONCAT( CONCAT( '{' ), CONCAT( '"id":"', new.id, '",' ), CONCAT( '"code":"', new.CODE, '",' ), CONCAT( '"name":"', new.NAME ), CONCAT( '}' ) ) ); INSERT INTO user_test ( CODE, NAME ) VALUES ( new.CODE, dataJson ); END;
首先调研了能否在mybatis中创建触发器,厉害了我的哥,还真可以...于是看到了希望。那就继续撸吧,按照模板进行动态创建吧,开始kakaka.....的撸代码了。写的还算顺利...
动态遍历List<Map<String,String>>
<foreach item="items" collection="list" separator="," index="index"> <foreach item="value" index="key" collection="items" separator="," > CONCAT('"${value}":"',new.${key},'",') </foreach> </foreach>
拼接还算顺利想想还可以的写完工呀。自己测试了一把,--------------SUCCESS------------,创建成功了Yean.触发一下生成数据瞅瞅,哎呀我去,,,多了个逗号。沉思.................. 未完待续...
接下来讲一下我去掉多余的逗号之路,,,最传统的截取字符串在拼接。
于是乎就搜索了mysql中如何截取字符串。
LEFT(dataJson,CHAR_LENGTH(CAST(dataJson AS CHAR))-1)
CHAR_LENGTH 一定要用这个因为当字符串中有汉字是长度就不是想象的样子了。之后就是在拼接起来了。
补存一点:更新,新增用new.field 而删除是old.field