MyBatis 的動態 SQL 是一種強大的特性,它可以讓你在 XML 映射文件內,根據不同的條件編寫不同的 SQL 語句。MyBatis 動態 SQL 主要元素有:
<if>
: 根據提供的條件來動態拼接 SQL。
接口定義
Integer insertUserByCondition(UserInfo userInfo);
Mapper.xml實現?
<insert id="insertUserByCondition">INSERT INTO userinfo (username,`password`,age,<if test="gender != null">gender,</if>phone)VALUES (#{username},#{age},<if test="gender != null">#{gender},</if>#{phone})
</insert>
<trim>標簽
標簽中有如下屬性:
? prefix:表?整個語句塊,以prefix的值作為前綴
? suffix:表?整個語句塊,以suffix的值作為后綴
? prefixOverrides:表?整個語句塊要去除掉的前綴
? suffixOverrides:表?整個語句塊要去除掉的后綴
?
<insert id="insertUserByCondition">INSERT INTO userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">username,</if><if test="password !=null">`password`,</if><if test="age != null">age,</if><if test="gender != null">gender,</if><if test="phone != null">phone,</if></trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">#{username},</if><if test="password !=null">#{password},</if><if test="age != null">#{age},</if><if test="gender != null">#{gender},</if><if test="phone != null">#{phone}</if></trim>
</insert>
在以上sql動態解析時,會將第?個部分做如下處理:
? 基于?prefix 配置,開始部分加上(?
? 基于suffix 配置,結束部分加上)?
? 多個組織的語句都以, 結尾,在最后拼接好的字符串還會以?, 結尾,會基于suffixOverrides 配置去掉最后?個?
? 注意<if test="username !=null"> 中的username 是傳?對象的屬性
?
<where>
: 自動處理前導的?AND
?或?OR
?語句。
接口定義
List<UserInfo> queryByCondition();
?Mapper.xml實現
<select id="queryByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time,
update_timefrom userinfo<where><if test="age != null">and age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if></where>
</select>
<where> 只會在?元素有內容的情況下才插?where?句,?且會?動去除?句的開頭的AND或
OR
以上標簽也可以使??<trim prefix="where" prefixOverrides="and"> 替換,但是此種情況下,當?元素都沒有內容時,where關鍵字也會保留
<set>
: 自動處理后面的逗號問題。
接?定義:根據傳?的??id屬性,修改其他不為null的屬性
?
Integer updateUserByCondition(UserInfo userInfo);
?Mapper.xml
<update id="updateUserByCondition">update userinfo<set><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="deleteFlag != null">delete_flag = #{deleteFlag},</if></set>where id = #{id}
</update>
<set> :動態的在SQL語句中插?set關鍵字,并會刪掉額外的逗號.(?于update語句中)
?
<foreach>
: 主要用于處理數組、集合的元素。
對集合進?遍歷時可以使?該標簽。標簽有如下屬性:
? collection:綁定?法參數中的集合,如List,Set,Map或數組對象
? item:遍歷時的每?個對象
? open:語句塊開頭的字符串
? close:語句塊結束的字符串
? separator:每次遍歷之間間隔的字符串
需求:根據多個userid,刪除??數據
接??法:
void deleteByIds(List<Integer> ids);
ArticleMapper.xml中新增刪除sql:
<delete id="deleteByIds">delete from userinfowhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
<include> :通過屬性refid,指定包含的SQL?段
我們可以對重復的代碼?段進?抽取,將其通過 <sql> 標簽封裝到?個SQL?段,然后再通過
<include> 標簽進?引?。
? <sql> :定義可重?的SQL?段
? <include> :通過屬性refid,指定包含的SQL?段
?
<sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>
通過 <include> 標簽在原來抽取的地?進?引?。操作如下:
<select id="queryAllUser" resultMap="BaseMap">select<include refid="allColumn"></include>from userinfo
</select>
<select id="queryById" resultType="com.example.demo.model.UserInfo">select<include refid="allColumn"></include>from userinfo where id= #{id}
</select>