常见的动态标签
if
choose, when, otherwise
trim,where,set
foreach
bind
sql
mybatis通过OGNL表达式来进行取值操作;比如:#{username}
Mybatis两个内置参数
_parameter: 如果接口传入多个参数,这些参数都包含在这一个参数中,如果传入一个,那该参数就代表传来的参数
_databaseId: 如果在mybatis核心配置文件中配置了databaseIdProvider(数据库厂商)标签,则该参数代表当前数据库厂商别名
这两个参数可以搭配if标签来使用,<if text="_databaseId == 'mysql'"> SELECT * FROM user <if text="_parameter != null"> WHERE username = #{_parameter.属性名} </if> </if>
1. if使用
<!-- if -->
<if test="title != null">
AND title like #{title}
</if>
2. choose使用
<!-- choose,when,otherwise -->
<choose>
<!-- 相当于if,else if,else-->
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
3. trim使用
<!-- trim -->
<!--
prefix: 给trim括起来的最前面添加指定的字符串,本例中添加WHERE;
prefixOverrides: 如果trim括起来的最前面出现指定的字符串,则将其删掉,本例中删掉AND或OR
suffix: 同prefix道理一样,只是变成了末尾
suffixOverrides: 同prefixOverrides道理一样,只是变成了末尾
这四个属性可以选用
-->
<trim prefix="WHERE" prefixOverrides="AND | OR" suffix="" suffixOverrides="">
...
</trim>
4. set使用
<!-- set可以帮我们去掉多余的逗号 -->
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
5. foreach使用
<!-- foreach -->
<!--
collection: 可以是list,也可以是map,这些是对应集合默认的别名,可以通同@Param指定其他别名
index: collection是list是该字段代表list的索引,collection是map是该字段代表key
separator: 表示元素的间隔符
foreach标签中出现的属性可以选用,再批量插入时就可以不用open和close属性
-->
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
<!-- 批量插入 -->
<insert id="insertTest">
INSERT INTO user_tbl(id,name)
VALUES
<foreach collection="userList" item="user" separator=",">
(#{user.id}, #{user.name})
</foreach>
</insert>
6. bind使用
<!-- bind 适合给固定值前后拼接字符串 -->
<select id="selectBlogsLike" resultType="Blog">
<bind name="likename" value="'%' + #{username} + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{likename}
</select>
7. sql使用
<!-- sql -->
<!-- 这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值 -->
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>