if
choose (when, otherwise)
trim (where, set)
foreach
if
动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如:
<selectid="findActive" resultType="Blog"> 对应到Mapper接口中的同名方法上
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null"> test属性中是一个OGNL逻辑表达式,如果返回结果为true则执行标签体,否则不执行标签体
AND title like #{title} 参数中的title属性如果不为空,则 SELECT * FROM BLOG WHERE state = ‘ACTIVE’ and AND title like #{title}
</if>
</select>
test属性中的OGNL表达式可以是多个逻辑判断组成的,例如
<if test="author != null and author.name != null">
ANDauthor_name like #{author.name} </if>
insertSelective定义中有很多的if判断,根据对应的属性生成不同的SQL语句
动态插入获取的优势是default设置生效
updateByPrimaryKeySelective同样处理
choose, when, otherwise可以实现开关分支判断
<selectid="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>这个标签体中只要一个条件判断成立,则立即退出标签.可以使用这个标签模拟出if/else结构
<when test="title != null">AND title like#{title}</when>
<when test="author != null and author.name != null">如果上面的判读成立,执行标签体后立即退出choose结构;只有不成立时才会判断这个条件
AND author_name like#{author.name}
</when>
<otherwise>AND featured = 1</otherwise>当多有的when不成立时执行这个标签体
</choose>
</select>
注意:其中的语法格式为元素类型为 "choose" 的内容必须匹配 "(when*,otherwise?)"
where用于生成对应的where关键字
<select id="selectCondition" parameterType="map" resultType="UserBean">
select * fromt_users where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
<if test="birth!=null">
and birth=#{birth}
</if>
</select>
<where>标签体中没有生成任何查询条件,则不会生成where关键字;如果生成了SQL语句,同时SQL语句以and/or开头,则自动剔除多余的and/or关键字
<select id="selectCondition" parameterType="map" resultType="UserBean">
select * fromt_users
<where>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
<if test="birth!=null">
and birth=#{birth}
</if>
</where>
</select>
set和where类似,用于生成update语句中的set关键字,如果标签体为空,则不会生成set关键;如果标签体不为空,则会自动剔除所生成SQL语句末尾的多余的逗号
<update id="updateByPrimaryKeySelective" parameterType="com.yan.entity.User">
update t_users
<set>
<if test="username != null">
username= #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
password= #{password,jdbcType=VARCHAR},
</if>
</set>
where id =#{id,jdbcType=BIGINT}
</update>
trim和where/set类似
<trim prefix="WHERE自动添加的标签体生成的SQL语句的前缀" prefixOverrides="AND |OR 需要自动剔除的SQL语句的前缀,不会区分大小写"
suffix=",,,,自动添加的后缀" suffixOverrides=",自动去除的后缀">
...
</trim>
1. 替代<where>
<trimprefix="where" prefixOverrides="AND | OR">
<if test="username!=null">
andusername=#{username}
</if>
<if test="password!=null">
andpassword=#{password}
</if>
</trim>
2. 替代<set>
<trimprefix="set" suffixOverrides=",">
<if test="username != null">
username= #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
password= #{password,jdbcType=VARCHAR},
</if>
</trim>
foreach
对一个集合进行遍历,通常是在构建 IN 条件语句的时候
<if test="ids!=null">
and id in
<foreachcollection="ids在map中的集合值的key,这是一个OGNL表达式,用于按照key从map中获取对应的集合"
index="kk序号,从0开始" item="pp循环控制变量,每次迭代访问一个元素,就会临时赋值给它" open="(生成内容的开头,只添加一次"
close=")生成内容的结束,只添加一次" separator=",每个元素之间的分隔符,末尾处不会添加">
${pp}
</foreach>
</if>
你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的 次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值
bind
bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern可以理解为变量名" value="'%' + _parameter.getTitle() + '%'对应的值" />
SELECT * FROM BLOG WHERE titleLIKE #{pattern通过名称引用上面指定的值value}
</select>
sql
这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。它可以被静态地(在加载参数) 参数化. 不同的属性值通过包含的实例变化
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password</sql>
如果那个SQL需要使用 ${alias}.id,${alias}.username,${alias}.password内容,可以直接通过
<include refid="userColumns">引用上面<sql>块中定义的内容
<property name="alias" value="t1"/>用于给sql块中的${alias}进行赋值
</include>,
进行引用,并支持给${alias}变量进行赋值
<sql id="Base_Column_List">
id,username, password, birth, sex, salary
</sql>
如果使用select *执行查询,效率很低,执行查询之前需要访问数据字典获取所有的列名。在开发中不建议;
select <include refid="Base_Column_List"/> from t_users