SQL映射文件的几个顶级元素:
cache
– 该命名空间的缓存配置cache-ref
– 引用其他命名空间的缓存配置resultMap
– 描述如何从数据库结果集中加载对象sql
– 可被其他语句引用的可重用语句块insert
– 增update
– 改delete
– 删select
– 查
select属性
属性 描述
标识符,与Mapper中对应方法的方法名一致
传入这条语句的参数的类全限定名或别名
返回结果的类全限定名或别名,如果返回的是集合,应设置为集合包含的类型而不是集合本身的类型。resultType和resultMap之间只能使用一个
对外部resultMap的命名引用,结果映射是Mybatis的最强大的特性
sql
sql元素可以用来定义可重用的SQL代码片段,以便在其他语句中使用。参数可以静态地(加载的时候)确定下来并且可以在不同的include元素中定义不同的参数值
常用在include元素的refid属性或内部语句中使用属性值
${preifx}Table
FROM
SELECT
field1,field2,field3
ResultMap
1)改造实体类:
2)编写resultMap:
...
...
3)调用实例:
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
FROM
order
o
LEFT JOIN user
u ON o.user_id = u.id
1)改造实体类:
添加订单集合属性,如:List< Order > orders
2)编写resultMap:
3)调用实例:
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM
user
u
LEFT JOIN order
o ON u.id = o.user_id
主要介绍Mybatis提供的几种用于实现动态SQL的标签的基本使用方式:
- if
- choose、when、otherwise
- trim、where、set
- foreach
if 语句提供了可选的查找文本功能
若 if 中条件成立,则执行 if 标签中的语句,拼接至SQL语句中
若 if 中条件不成立,则忽略,举个栗子:
SELECT * FROM BLOG
WHERE state = 'ACTIVE'
AND title like #{title}
AND author_name like #{author.name}
choose、when、otherwise
Mybatis提供的choose元素,类似Java的switch语句,可从多个条件中选择一个使用
举个栗子:传入了”title”就按”title”查找,传入了”author”就按”author”查找的情形。
若两者都没有传入,就返回标记为featured=1的BLOG(若多个条件满足则遵循就近原则)
SELECT * FROM BLOG
WHERE state = 'ACTIVE'
AND title like #{title}
AND author_name like #{author.name}
AND featured = 1
trim、where、set
如何将上例中的”state=’ACTIVE'”条件设置为动态条件,即WHERE标签
SELECT * FROM BLOG
WHERE
state = #{state}
AND title like #{title}
AND author_name like #{author.name}
按上面所写,如果没有匹配的条件,SQL会变成:
SELECT * FROM BLOG
WHERE
导致查询失败。如果匹配的只是第二/三个条件,SQL会变成:
SELECT * FROM BLOG
WHERE
AND title like 'title'
从上例可看出 WHERE 语句后的第一个条件想要实现动态SQL不能简单使用条件元素来解决,对此可以使用Mybatis提供的where元素
SELECT * FROM BLOG
state = #{state}
AND title like #{title}
AND author_name like #{author.name}
where元素只会在子元素返回任何内容的情况下才插入”WHERE”子句。并且若子句的开头为”AND”或”OR”,where元素也会将它们去除
用于动态更新语句的类似解决方案叫set。set元素可以用于动态包含需要更新的列,忽略其他不更新的列,比如:
UPDATE Author
username=#{username},
password=#{password},
email=#{email},
bio=#{bio}
where id = #{id}
如果选择的元素与你期望的不大一样,可以通过自定义trim元素来制定元素的功能,比如:
where标签:
...
set标签:
...
prefix:前缀
prefixOverrides:前缀覆盖,忽略通过管道符分隔的文本序列
suffixOverrides:后缀覆盖,覆盖了后缀值的设置
foreach
动态SQL的另一个常见使用场景是对集合进行遍历(尤其是在构建IN条件语句的时候)
SELECT *
FROM POST P
WHERE ID in
#{item}
可以将任何可迭代对象(List, Set)、Map或数组对象作为集合参数传递给foreach。当使用可迭代对象或者数组时,index是当前迭代的序号,item的值是本次迭代获取到的元素。使用Map对象时,index是key,item是value
Original: https://www.cnblogs.com/torima/p/15151210.html
Author: Tttori
Title: Java-Mybatis动态SQL整理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588961/
转载文章受原作者版权保护。转载请注明原作者出处!