mybatis 中动态 sql 标签的学习
在mybatis中,进行数据库操作时,不仅仅根据单一的标准来进行的增删改查,有时候,可能需要根据一个复杂的条件来操作,比如:根据一个用户的部分信息,查找一个用户;根据一个用户的id集合,查找该集合中的所有用户。这时候,可以使用一些动态的 sql 标签来辅助操作数据库,可以更加灵活、方便。
if 标签
假设一个用户类的属性有 username,id,sex,address 四个属性,我们需要根据其中某些属性来查找该用户的信息,比如:根据单一的属性 username,id ,sex ,address,又或者根据组合属性 username 和 id,username 和 address等等,使得 sql 语句用起来特别不方便,还要书写多条语句。这时候,if 标签就可以排上用场了。如:
<!--根据用户部分属性查询用户-->
<select id="findUserByCondition" parameterType="***.User" resultType="***.User">
select * from user where 1=1
<if test="username!=null"> 添加查找的条件
and username=#{username}
</if>
<if test="id!=null">
and id=#{id}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
<if test="address!=null">
and address=#{address}
</if>
</select>
select标签中的属性:
id:调用 sql 语句的函数
parameterType:传进来的参数类型,上例是 user
resultType:结果集的返回类型
这里不作详细解释。主要讲解 sql 标签。
if 标签中的 test 属性表示判断,首先判断传进来的用户存不存在 username 属性,存在则判断是否匹配,不存在则判断下一个属性,依次类推。
where 标签
where 标签可以表示 sql 语句中的 where 的条件限制,将条件限制语句包裹在 where 标签中,使得代码更整洁、易懂。如,上例也可以写成:
<!--根据用户部分属性查询用户-->
<select id="findUserByCondition" parameterType="***.User" resultType="***.User">
select * from user
<where>
<if test="username!=null">
username=#{username}
</if>
<if test="id!=null">
and id=#{id}
</if>
<if test="sex!=null">
and sex=#{sex}
</if>
<if test="address!=null">
address=#{address}
</if>
</where>
</select>
foreach 标签
当需要根据一个用户的 id 集合来查找用户时,foreach 标签可以遍历每一个 id,再根据相应的 sql 语句来查询。如:
<!--根据一个的ids集合查询用户-->
<select id="***" parameterType="***" resultType="***">
select * from user
<where>
<if test="ids!=null">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
foreach 标签中的 collection 属性表示传入的集合参数,open 和 close 表示的语句为 “and id in (ids)",and 表示一个逻辑与的条件判断,id in (ids) 表示 ids 集合中的每一个 id。item 表示从 ids 集合中取出来的每一个元素的名称为 uid,separator 表示分隔符。
sql 标签
在 sql 的操作中,我们发现有一些 sql 语句经常重复着写,这时候,可以采用 sql 标签将该语句包裹成为一个模板,需要使用时,直接用 include 标签引入即可。
配置模板:
<sql id="defaultSelect">
select * from user
</sql>
将 select * from user 包裹起来,也可以包裹多条 sql 语句。
使用模板:
<include refid="defaultSelect"></include>
注意模板的结尾有没有分号了。如果有分号,在与其他 sql 语句拼接时,会出现错误。在数据库的使用中,sql 语句没有分号结尾,并不会影响。
如,上例中采用模板也可以写成:
<!--根据一个的ids集合查询用户-->
<select id="***" parameterType="***" resultType="***">
<include refid="defaultSelect"></include>
<where>
<if test="ids!=null">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>