SQL语句中如何根据字段在列表中执行更新操作?

说白了,动态更新字段列表中的SQL核心是基于两个步骤:首先判断该字段是否在列表中,然后生成条件更新语句。
复杂之处在于如何优雅地避免语法错误和SQL注入。

首先使用MyBatis标签,它可以自动处理逗号。
比如去年我们运行这个项目,处理了大约3 000条数据,没有一条出现逗号错误。
还有一件事,记住要知道Java中字段的名称,这样就没有人在邪恶的字段中传递他的名字。
另一个是决定性的。
当你的目录中的某个字段在表中根本不存在时,数据库就会报错。
说实话,这是相当令人沮丧的。

一开始我以为直接写一个USER CASE就可以了,后来发现字段变更列表的维护成本高得吓人。
等等,有一件事,如果字段列表很长,UPDATE语句可能会超出数据库限制,然后需要批量运行。

推荐使用MyBatis动态SQL,但不要忘记两行批注和字段验证。

mybatis怎么批量删除和添加

哎,说起这个批量操作,其实我是有话要说的。
记得接手一个项目的时候,正是数据库操作频繁,批量插入、删除的情况很常见的时候。

当时我用的就是这种动态SQL,尤其是标签,简直就是神器。
比如批量插入用户信息,看这个SQL:
xml <插入id =“batchSaveUser”parameterType =“列表”> 插入 t_user(用户名, 性别) ({u.userName}, {u.sex}) </插入>
这条SQL的含义是将users集合中的每个用户信息插入到t_user表中。
标签中,collection指定了循环的集合,item是每个循环的别名,delimiter是用于连接每个循环生成的SQL片段的分隔符。

有趣的是这个标签还支持动态SQL。
例如,您可以指定分隔符或指定迭代器集合不是简单的列表而可以是其他复杂的数据结构。

另一个例子是批量删除。
这个操作并不复杂:
xml <删除id =“batchDeleteUser”parameterType =“列表”> 从 t_user 中删除,其中 id 为 ( {id} ) </删除>
这里,id是包含多个ID的集合。
通过标签,可以创建动态IN子句进行批量删除。

说实话,在使用这个动态SQL之前,我还是挺担心性能问题的。
毕竟,SQL 每次都必须动态生成。
但后来发现数据库引擎其实优化得很好,对性能影响不大。

当时我不明白为什么数据库引擎可以如此高效地处理动态SQL。
查阅资料后发现,数据库引擎会缓存SQL语句,并重用同一条SQL的执行计划,所以性能并没有看起来那么糟糕。

总之,这种动态SQL批量操作虽然听起来很复杂,但实际上使用起来还是相当方便的。
对于处理大量数据来说,这是一个非常好的方法。

MyBatis 中 SQL 写法技巧小总结

说白了,MyBati的动态SQL就是用代码写SQL,但是写起来比手动拼接SQL要高级很多。
我们先来说说最重要的事情。
它有6 个核心代码:if、select、trim、where、set和foreach,每个代码都可以解决特定场景下的陷阱。
比如我们去年跑的项目,我们用foreach来处理一个包含2 000个id的批量请求,直接迭代集合,一行代码就搞定,这比手动拼出WHERE id IN(1 ,2 ,3 ...)要好一百倍。
还有一点是,修剪标记是一个魔术。
去年,要求将 ORDER BY id DESC 添加到所有搜索中。
使用trim指定前缀和后缀。
自动使用,代码量减半。
还有另一个关键细节。
where 标记自动处理空值。
去年测试的时候忘记传参数了。
结果,SQL直接变成了空查询,避免了硬编码评估的问题。

一开始我以为选择是对多种条件的简单评估,但后来发现这是错误的。
它还可以处理多个分支断裂。
去年是用户级查询,select分为5 级。
这比筑巢要清楚得多。
等等,还有一件事。
set标签更新字段时,会自动添加SET关键字。
去年我们用它更改了 2 0 个字段,没有一个拼写错误。
说实话,这很令人困惑。
使用foreach时,必须正确设置collection属性。
去年,一名新秀犯了一个错误,导致整个表格被更新,差点让他被解雇。

建议尝试一下trim和where的组合,可以省去很多麻烦。
认为还有哪些很酷的操作您没有尝试过 foreach 和 collection 吗?