mybatis教程4(動態SQL)
動態SQL語句
MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。
雖然在以前使用動態 SQL 並非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射語句中的強大的動態 SQL 語言得以改進這種情形。
動態 SQL 元素和 JSTL 或基於類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基於 OGNL 的表達式來淘汰其它大部分元素。
if語句
動態 SQL 通常要做的事情是根據條件包含 where 子句的一部分。比如:
<select id="queryUser" resultMap="baseMap" resultType="com.sxt.bean.User" parameterType="user"> select id ,name ,age from t_user where 1 =1 <if test="username!=null"> and name = #{username} </if> </select>
// 接口
public List<User> queryUser(User user);
測試
choose, when, otherwise
有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <choose> <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> </select>
where語句
在使用if語句做動態條件處理的時候如果所有條件都不滿足,那麽得到的SQL語句如下:
select * from t_user where
在這種情況下,我們一般會加一個1=1來匹配語法規則
<select id="queryUser" resultMap="baseMap"
resultType="com.sxt.bean.User" parameterType="user">
select id ,name ,age from t_user
where 1 =1
<if test="username!=null">
and name = #{username}
</if>
</select>
此時可以使用
<select id="queryUser" resultMap="baseMap"
resultType="com.sxt.bean.User" parameterType="user">
select id ,name ,age from t_user
<where>
<if test="username!=null">
and name = #{username}
</if>
</where>
</select>
set語句
set主要也是用來解決更新問題的。
<update id="updateBookById">
update t_book
<set>
<if test="author!=null"> author=#{author},</if>
<if test="name!=null"> b_name=#{name},</if>
<if test="price!=null"> price=#{price},</if>
</set>
where id=#{id};
</update>
trim
trim標記是一個格式化的標記,可以完成set或者是where標記的功能
屬性 | 說明 |
---|---|
prefix | 前綴 |
prefixOverrides | 去掉第一個指定內容 |
suffix | 後綴 |
suffixoverride | 去掉最後一個指定內容 |
替代<where>的用法
<select id="queryUser" resultMap="baseMap" resultType="com.sxt.bean.User"
parameterType="user">
select id ,name ,age from t_user
<!-- <where>
<if test="username!=null">
and name = #{username}
</if>
</where> -->
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="username!=null">
and name = #{username}
</if>
<if test="age != 0">
and age = #{age}
</if>
</trim>
</select>
替代<set>的用法
<update id="updateUser" parameterType="User">
update t_user
<trim prefix="set" suffixOverrides=",">
<if test="username!=null">
name = #{username},
</if>
<if test="age != 0">
age = #{age}
</if>
</trim>
where id=#{id}
</update>
或者
<update id="updateUser" parameterType="User">
update t_user
set
<trim suffixOverrides=",">
<if test="username!=null">
name = #{username},
</if>
<if test="age != 0">
age = #{age}
</if>
</trim>
where id=#{id}
</update>
foreach語句
foreach用來遍歷,遍歷的對象可以是數組,也可以是集合。
屬性|說明
-----|:------
collection|collection屬性的值有三個分別是list、array、map三種
open|前綴
close|後綴
separator|分隔符,表示叠代時每個元素之間以什麽分隔
item|表示在叠代過程中每一個元素的別名
index|用一個變量名表示當前循環的索引位置
==接口中方法==
public interface UserMapper {
// 如果不指定@Param 默認是array
public List<User> queryUserByIds(@Param("ids")List<Integer> ids);
public int insertUser(@Param("users")List<User> users);
}
<select id="queryUserByIds" resultType="user">
select * from t_user where id in
<foreach collection="ids" open="(" close=")" separator="," item="id" >
#{id}
</foreach>
</select>
<insert id="insertUser">
insert into t_user(name,age)values
<foreach collection="users" item="user" separator=",">
(#{user.name},#{user.age})
</foreach>
</insert>
bind
bind 元素可以從 OGNL 表達式中創建一個變量並將其綁定到上下文。
<select id="getUserById" resultMap="baseMap" resultType="com.sxt.bean.User">
<!-- 聲明了一個參數aaa 在後面就可以使用了 -->
<bind name="aaa" value="12"/>
select
id ,name ,age from t_user where id=${aaa}
</select>
sql塊
sql片段一般用來定義sql中的列
mybatis教程4(動態SQL)