if的使用
if可以让sql语句更加灵活,让一个sql语句适应多个查询场景
<select id="queryUsers" parameterType="User" resultType="User">
SELECT id,name,gender,regist_time
FROM t_user
WHERE
<if test="name == null or name=='zhj'">
name=#{name}
</if>
<if test="id>=1">
AND id>#{id}
</if>
<if test="gender == false">
AND gender=#{gender}
</if>
</select>
choose的使用
如果在多个判断中,只会有一个是可以成立的,可以使用Choose标签
<select id="queryUsers" parameterType="User" resultType="User">
SELECT id,name,gender,regist_time
FROM t_user
WHERE
<choose> <!-- 从上到下,有任何一个when标签,判断成功则停止判断 -->
<when test="id != null"> <!-- 判断 -->
id > #{id}
</when>
<when test="name !=null"> <!-- 判断 -->
name = #{name}
</when>
<otherwise> <!-- 以上判断都不成立时,执行 -->
gender = '1'
</otherwise>
</choose>
</select>
注意,在sql中的判断,本意不在于判断,而在于将sql动态的适应不同场景,简化开发。
where的使用
标签中如果没有成立的条件,则不会拼接`where语句
标签中如果以 and 或 or开头,会去将其去除。
<select id="queryUsers" parameterType="User" resultType="User">
SELECT id,name,gender,regist_time
FROM t_user
<where>
<if test="name == null">
name=#{name}
</if>
<if test="id>=1">
AND id>#{id}
</if>
</where>
</select>
set的使用
主要用于update中
<update id="updateUser" parameterType="User">
UPDATE t_user2
<set>
<if test="name != null">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="registTime != null">
regist_time = #{registTime}
</if>
</set>
WHERE id = #{id}
</update>
trim的使用
可以代替where 和 set
<select id="queryUsers" parameterType="User" resultType="User">
SELECT id,name,gender,regist_time
FROM t_user2
<trim prefix="where" prefixOverrides="and|or">
<if test="name != null">
name=#{name}
</if>
<if test="id>=10">
OR id>#{id}
</if>
<if test="gender == false">
AND gender=#{gender}
</if>
</trim>
</select>
<update id="updateUser" parameterType="User">
UPDATE t_user2
<trim prefix="set" suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="gender != null">
gender = #{gender},
</if>
<if test="registTime != null">
regist_time = #{registTime}
</if>
</trim>
WHERE id = #{id}
</update>
foreach的使用
批量查询
//DAO声明为: public List<User> queryUsers2(List<Integer> ids);
<select id="queryUsers2" resultType="User">
SELECT id,name,gender,regist_time
FROM t_user2
WHERE id IN
<foreach collection="list" open="(" separator="," close=")" item="id" index="ind">
#{id}
</foreach>
</select>
<!--
<foreach collection="list" open="(" separator="," close=")" item="id" index="ind">
collection="list" 代表参数是List,如果是数组,要用array
open="(" 以“(” 开头
close=")" 以“)” 结尾
separator="," 值之间用“,”分隔
item="id" 每次遍历的值的临时变量
#{id} 获取每次遍历的值
如上:标签的效果是 (值1,值2,值3)
示例:如果传入 List{1 3 5},则最终的sql:
【SELECT id,name,gender,regist_time
FROM t_user2
WHERE id IN (1,3,5)】
-->
批量添加
<!-- 批量添加 -->
<insert id="insertUsers" parameterType="java.util.List">
insert into t_user2 (name,gender,regist_time) values
<foreach collection="list" item="user" index="ind" close="" open="" separator=",">
(#{user.name},#{user.gender},#{user.registTime})
</foreach>
</insert>
SQL复用
<!-- 定义一段sql -->
<sql id="order">
select id,note,price,create_time as createTime
from t_order
</sql>
<!-- 引用sql -->
<select id="queryOrder" parameterType="int" resultType="Order">
<include refid="order"/>
where id = #{id}
</select>