当前位置: 首页 > news >正文

动态 SQL 标签对比表

动态 SQL 标签对比表

标签用途关键属性默认行为
<if>条件判断test条件成立则拼接
<where>处理 WHERE去除 AND/OR 开头,加 WHERE
<set>处理 SET去除末尾逗号,加 SET
<foreach>遍历集合collection, item, separator无默认,必须指定
<choose>/<when>/<otherwise>多路选择test只执行第一个匹配
<trim>自定义修剪prefix, suffix, prefixOverrides灵活控制前后缀
<bind>创建变量name, value执行 OGNL 表达式
<sql> + <include>代码复用id, refid抽取公共 SQL

✅ 最佳实践建议

  1. 优先使用 <where><set>:避免手动处理 AND 和逗号。

  2. <foreach> 必须注意 collection 命名:单参数 Listlist,数组是 array,多参数用 @Param

  3. 复杂逻辑用 <trim>:比 <where><set> 更灵活。

  4. 避免过度嵌套:动态 SQL 层级不要太深,否则难以维护。

  5. 使用 <sql> 复用字段列表:避免重复写 SELECT * 或字段名。

  6. <bind> 用于模糊查询:避免在 Java 层拼接 %


🛠️ 常见错误排查

问题原因解决方案
Mapped Statements collection does not contain...方法名与 XML id 不匹配检查命名、namespace
A different statement with this id already exists多个 Mapper 有相同 id确保 namespace + id 唯一
Collection 'xxx' not foundcollection 写错检查 list/array/@Param
SQL 报 AND ... 错误<where> 未正确使用<where><trim>
批量插入报错<foreach> separator 缺失separator=","

一.select

1.select的属性

id 用来引入这条语句,例如和接口名相同,用于实现接口

parameterType 传来参数的类型

resultMap:适合使用返回值是自定义实体类的情况(用于多表)

resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型(用于单表)

2.select——传递单个参数

User getUserById(Integer id);
<select id="getUserById"  parameterType="int" resultType="com.fzy.entity.User">
select * from user where id=#{id}</select>

单个参数不需要@parm

2.select——传递list、数组、map

用foreach遍历,foreach的属性有

  • tem表示集合中每一个元素进行迭代时的别名,

  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,

  • open表示该语句以什么开始,

  • separator表示在每次进行迭代之间以什么符号作为分隔符,

  • close表示以什么结束,

  • collection属性

1、如果传入的是单参数且参数类型是一个List的时候,collection属性值为list。

List<User> getUserList(List<Integer> ids);
<select id="getUserList" resultType="com.fzy.entity.User">select * from user where id in<foreach collection="list" item="uid" index="1" separator="," open="(" close=")">#{uid}</foreach>
</select>

2、如果传入的是单参数且参数类型是一个Array数组的时候,collection的属性值为array 。

List<User> getUserArray(int[] array);
<select id="getUserArray" resultType="com.fzy.entity.User">select * from user where id in<foreach collection="array" item="uid" index="1" separator="," open="(" close=")">#{uid}</foreach>
</select>

3、如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或Array对象在自己封装的map里面的key。

List<User> getUserMap(Map<String,String> map);
<select id="getUserMap" resultType="com.fzy.entity.User">select * from user where username=#{username} and password= #{password}
</select>

3.select——模糊查询

SELECT * FROM table WHERE name LIKE CONCAT('%', #{text},'%');

SELECT * FROM tableName WHERE name LIKE '%${_parameter}%';

#{}和${}

在之前的默认情况下,使用#{}格式的语法会通知MyBatis创建预处理语句属性并安全地设置值(比如通过?占位符)。这样做更安全,更迅速,通常也是首选做法,不过有时只是想直接在 SQL语句中插入一个不改变的字符串。

比如,像 ORDER BY,可以这样来使用: ORDER BY ${columnName}

#{}通过占位符的方式在sql执行前进行预编译,给占位符赋值,安全性更高;

${}通过拼接的方式给sql赋值,可能会一起sql注入的问题,安全性降低;

sql注入

Select * from user where name=”zhansgan “ or ” and pwd=”123456”

4.select——resultMap

esultMap的设计目标就是为复杂语句通过配置文件描述数据库表结果和Java实体类的关系(OR映射)


文章转载自:

http://HiFf9j5J.jgmdr.cn
http://Lm9E5qdh.jgmdr.cn
http://LJRhc97P.jgmdr.cn
http://7Aa220jX.jgmdr.cn
http://Tthfh0Ak.jgmdr.cn
http://yX44MFAv.jgmdr.cn
http://RCWFGKak.jgmdr.cn
http://6D2VPZNb.jgmdr.cn
http://90HkuETP.jgmdr.cn
http://71N9Idwr.jgmdr.cn
http://PBsBJCXz.jgmdr.cn
http://i639wW4Z.jgmdr.cn
http://fgyoLBhC.jgmdr.cn
http://49KOUEUe.jgmdr.cn
http://yZeAyhu1.jgmdr.cn
http://z6TPDwEN.jgmdr.cn
http://P6TqzZYP.jgmdr.cn
http://5b9ZvX68.jgmdr.cn
http://5Y4QRiTw.jgmdr.cn
http://OpsizhD1.jgmdr.cn
http://kJsbSAtW.jgmdr.cn
http://zYUatptX.jgmdr.cn
http://xdD8n2gN.jgmdr.cn
http://fH0xety4.jgmdr.cn
http://mdB2O187.jgmdr.cn
http://hiarxwiD.jgmdr.cn
http://y5AgNmco.jgmdr.cn
http://7ArLX0qz.jgmdr.cn
http://nUjTF015.jgmdr.cn
http://eOVvkSv8.jgmdr.cn
http://www.dtcms.com/a/376544.html

相关文章:

  • OpenObserve Ubuntu部署
  • 如何解决“You have an error in your SQL syntax“
  • PostgreSQL大表同步优化:如何避免网络和内存瓶颈?
  • vue3 的痛点
  • 在 Ubuntu 22.04 系统(CUDA 12.9)中,通过本地DEB 包安装 cuDNN 9.13.0 的方法步骤
  • MySQL整理【03】事务隔离级别和MVCC
  • 信息检索2
  • Unity2019用vscode的问题
  • iOS 文件管理与能耗调试结合实战 如何查看缓存文件、优化电池消耗、分析App使用记录(uni-app开发与性能优化必备指南)
  • 【华为OD】完美走位
  • Linux下运行芙蕾雅天堂2【俄文简译L2FATER】
  • 消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka
  • win11安装GnuWin32支持执行Makefile命令
  • 从原理到实践:LVS+Keepalived构建高可用负载均衡集群
  • 多脚本大批量训练
  • java与node.js对比
  • tailwindcss 究竟比 unocss 快多少?
  • 排序---希尔排序(Shell Sort)
  • Windows系统下,配置VScode的git以及git终端
  • 机器学习实战(一): 什么是机器学习
  • Google SEO 优化里,AWS 的隐藏优势
  • 微信推客小程序系统开发技术实践
  • git下载、安装、使用
  • Transformer实战(17)——微调Transformer语言模型进行多标签文本分类
  • 单例模式(C++)详解(3)
  • Eyeshot 2025.3 3D 图形工具包
  • 【Linux手册】信号量与建造者模式:以 PV 操作保证并发安全,分步组装构建复杂对象
  • 【展厅多媒体】VR虚拟现实,构建展厅沉浸体验的重要技术
  • 京东京造K2 蓝牙/有线双模键盘键盘快捷键
  • Figma Make 输入指令浏览器无响应