动态SQL
所谓动态sql,就是加了一些逻辑判断的SQL语句。
主要有以下:
- where-if :where标签下写if标签。如果if判断成立,则执行if下的sql,多个if可叠加执行。如where标签下判断无内容,where标签不被执行。需要在if标签下sql语句前写and。默认执行时第一个and会被删掉。
- set-if:set标签下写if标签。如果if判断成立,则执行if下的sql,多个if可叠加执行。如set标签下判断无内容,则set标签不执行。需在if标签下的sql语句后写逗号。默认最后一个逗号在执行时被删掉。
- choose-when:choose标签下写when,当when中条件成立,则执行when下的sql语句。但多个when成立只执行第一个when下的sql。
- trim:trim下面写sql,四个属性,分别表示:在sql前后添加(带空格),删除执行字符串。
- bind:对传入的参数的前后添加字符串,例如 name="money" value="'$'+money" 当传入100,实际在sql命令中为 $100
- foreach:该标签下写sql,一般要求传入一个集合或是数组。主要有四个参数,open(指定遍历开始时添加的字符) close(指定遍历完成后最后的添加的字符) seprator(指定每个值之间的分隔符) item(参数对应的临时变量) cellection(指定传入的集合参数名)。
- include与sql联用:sql标签写一段sql数据,数值id要赋值。在增删改查中通过使用include标签的ref引用sql标签的内容
示例
mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.xiaohei.mapper.UserMapper">
<select id="selAll" resultType="user">
select * from User
</select>
<!-- where和if测试 -->
<select id="selByIf" resultType="User">
select * from User
<!-- OGNL表达式,直接写key或对象的属性 -->
<where>
<if test="name!=null and name!=''">
and name=#{name}
</if>
<if test="gender!=null and gender!=''">
and gender=#{gender}
</if>
</where>
</select>
<!-- choose和when测试 -->
<select id="selChooseWhen" resultType="user">
select * from User
<where>
<choose>
<!-- 当多个when成立,只生效第一个 -->
<when test="name!=null and name!=''">
name=#{name}
</when>
<when test="gender!=null and gender!=''">
gender=#{gender}
</when>
</choose>
</where>
</select>
<!-- set测试 -->
<update id="updNameGender">
update user
<set>
id=#{id}
<if test="gender!=null and gender!=''">
gender=#{gender},
</if>
<if test="name!=null and name!=''">
name=#{name},
</if>
</set>
where id=#{id}
</update>
<!-- trim -->
<select id="selTrim" resultType="user">
select * from user
<trim prefix="where" prefixOverrides="and">
and name=#{name}
</trim>
</select>
<!-- trim模拟set -->
<update id="trimset">
update user
<trim prefix="set" suffixOverrides=",">
name=#{name},
</trim>
<trim prefix="," suffixOverrides=",">
gender=#{gender},
</trim>
where id =1
</update>
<!-- bind:前后添加数据,可用来实现模糊查询-->
<select id="selBind" resultType="user">
<bind name="name" value="'%'+name"/>
select * from user where name like #{name}
</select>
<!-- foreach: 实现查询语句中配合in关键字的使用 -->
<select id="selForeach" resultType="user" parameterType="list">
select * from user where id in
<foreach collection="list" item="a" open="(" close=")" separator=",">
#{a}
</foreach>
</select>
<!-- include 与 sql标签 -->
<select id="selIncludeSql" resultType="user">
select * from user where id in
<trim prefix="(" suffix=")">
<!-- 引用sql标签s1 -->
<include refid="s1"></include>
</trim>
</select>
<sql id="s1">
1,2
</sql>
</mapper>