mybais 的动态sql 可以说是mybatis 的核心, 可以通过表达式进行判断,动态修改sql ,下面着重说一下mybatis的动态sql
- if语句
- foreach
1.if语句 ,if 用于判断 是否满足条件
<select id="selectOrderList" resultMap="BaseResultMap" parameterType="map">
SELECT * FROM t_smaug_order WHERE 1=1
<if test="userId!=null && userId !=0">
AND UserID = #{userId}
</if>
</select>
上面的例子 如果传入的 userId 不为空 并且userId != 0 才行userId的匹配
2.foreach
向sql传递list然后循环操作 比如查询多个状态的订单 我们可以这样
select * from t_smaug_order where state = 2 or state = 3 and state = 4
也可以这样
select * from t_smaug_order where state in(2,3,4)
上面两个语句, 一个用了or 一个 用了in ,很明显, 大部分程序猿喜欢in 但是我们怎么写sql呢? mybatis 的foreach很好的解决了这个问题 在参数中传入 List
SELECT * FROM t_smaug_shop WHERE ShopID IN
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
- collection 指输入的参数
- item 指遍历list的时候生成的对象
- open 开始遍历的时候拼接的串 “(“
- close 结束遍历的时候 “)”
- separator 分隔符 特指 “,”
3.choose 和代码中的switch 一个意思 代码如下
<select id="selectShopEntity" resultMap="BaseResultMap" parameterType="map">
SELECT * FROM t_smaug_shop WHERE State = 3
<choose>
<when test="shopId != null">
AND ShopID = #{shopId}
</when>
<when test="shopName != null">
AND ShopName = #{shopName}
</when>
</choose>
<otherwise>
AND featured = 1
</otherwise>
</select>
当 shopId 和 shopName 都不为null 的时候 则otherwise要发挥作用了