MyBatis 提供使用 ognl 表達式動態生成 SQL的功能。sql
1. if數組
2. wherespa
where 能夠自動處理掉第一個拼接條件裏的 andcode
<!-- 動態 sql 查詢用戶信息 --> <select id="findUserByDynamicSql" parameterType="user" resultType="user"> select * from users <!-- where 能夠自動處理第一個 and --> <where> <!-- 注意:要作不爲null 和 '' 校驗 --> <if test="userId != null and userId != ''"> and users.userId = #{userId} </if> <if test="username != null and username != ''"> and users.username like '%${username}%' </if> </where> </select>
3. foreachxml
foreach 能夠向 SQL 傳遞數組、List<E> 等,下面介紹一個數組的例子對象
<!-- 動態 sql 查詢用戶信息 --> <select id="findUserByDynamicSql" parameterType="user" resultType="user"> select * from users <!-- where 能夠自動處理第一個 and --> <where> <!-- 解析傳遞過來的多個 userId --> <!-- ids 是結合;item 是集合中的項目變量 --> <foreach collection="ids" item="id" open="userId in(" close=")" separator=","> #{id} </foreach> <!-- 注意:要作不爲null 和 '' 校驗 --> <if test="userId != null and userId != ''"> and users.userId = #{userId} </if> <if test="username != null and username != ''"> and users.username like '%${username}%' </if> </where> </select>
運行結果:it
若是上面傳遞的數組中是 pojo 對象,那麼collection 屬性名稱必須是 array(若是是傳遞 List 對象,io
那麼collection屬性名稱是 list),而傳遞到 sql 當中的參數則是 class
pojo.屬性名。以下:test
index:爲數組的下標, item:數組中每一個元素的名稱,隨便定義
open:循環開始, close:循環結束 separator:中間分隔輸出
<select id="selectUserByArray" parameterType="Object[]" resultType="user"> select * from user <where> <!-- 傳遞數組 --> <if test="array!=null"> <foreach collection="array" index="index" item="item" open="and id in(" separator="," close=")" > #{item.id} </foreach> </if> </where> </select>
4. SQL 片斷
按照上面的 動態SQL 寫法,可能會產生不少重複的 sql。爲了重用這些 sql 減小代碼,能夠將重複的 sql
提取出來,使用時經過 include 引用。
a. 定義 SQL 片斷,將 重複的 sql 抽取出來
<!-- 定義SQL 片斷 --> <sql id="query_user_ByUserName"> <if test="username != null and username != ''"> and users.username like '%${username}%' </if> </sql> <sql id="query_user_ByUserId"> <!-- 注意:要作不爲null 和 '' 校驗 --> <if test="userId != null and userId != ''"> and users.userId = #{userId} </if> </sql> <sql id="query_user_ByIdArray"> <!-- 解析傳遞過來的多個 userId --> <!-- ids 是結合;item 是集合中的項目變量 --> <foreach collection="ids" item="id" open="userId in(" close=")" separator=","> #{id} </foreach> </sql>
b. 在 SQL 中引用 sql 片斷,能夠對比上面所舉得例子中的代碼
<!-- 動態 sql 查詢用戶信息 --> <select id="findUserByDynamicSql" parameterType="user" resultType="user"> select * from users <!-- where 能夠自動處理第一個 and --> <where> <include refid="query_user_ByIdArray"></include> <include refid="query_user_ByUserId"></include> <include refid="query_user_ByUserName"></include> </where> </select>