你是否还在为复杂的SQL条件判断烦恼?
String sql = "SELECT * FROM game where 1=1 ";
if (name != null && name != "") {
sql += " and game_name = ?";
params.add(name);
}
if (type != null && type != "") {
sql += " and game_type = ?";
params.add(type);
}
if (com != null && com != "") {
sql += " and game_company = ?";
params.add(com);
}
if (year != null && year != "") {
sql += " and game_year = ?";
params.add(year);
}
甚至有时你还需要更多的判断才能使你的代码尽量完善。让我们来了解一波MyBatis的动态SQL语句
当你需要进行判断时,我们有if元素
<if test="name != '' and name != null">
and name like CONCAT("%",#{name },"%")
</if>`
多个需求就多个if,是不是很方便?但这里我们需要注意的是函数尽量大写(具体视数据库而定)如此处的:CONCAT();同时我们还可以使用where元素与if元素一起完成SQL语句的定义
<select id="getLoginUser" resultType="User">
select * from smbms_user
<where>
<if test="userRole != null">
and userRole = #{userRole}
</if>
</where>
</select>
看,代码是不是瞬间感觉简洁了很多?下面我们‘升级’一下--------使用trim元素
<select id="getLoginUser" resultType="User">
select * from smbms_user
<trim prefix="where" prefixOverrides="and | or">
<if test="userRole != null">
and userRole = #{userRole}
</if>
</trim>
</select>
对于trim元素我们需要掌握几个属性prefix‘前缀’,prefixOverrides‘指定去除多余的前缀内容’,suffix‘后缀’,suffixOverrides‘指定去除多余的后缀内容’。举个小栗子,可能你不得不通过多个参数来对你的结果进行筛选
<select id="getUserList" resultType="User">
select * from smbms_user where userRole in ('1','2','3')
</select>
但有时你因为各种原因不得不对你的SQL语句的传值进行修改,来自某些经理的压迫 我们可以来一个foreach简答的解决值的问题
<select id="getUserList" resultType="User">
select * from smbms_user where userRole in
<foreach collection="list" item="roleList" open="(" separator=","
close=")">
#{roleList}
</foreach>
</select>
需要注意的是collection属性值有三个:array,list,Map集合的名字。array很显然传进来的就是一个数组,list则是一个集合对象,Map集合在这里以键来获取值
List<User> userList = new ArrayList<User>();
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(2);
roleList.add(3);
Map<String, Object>roleMap = new HashMap<String, Object>();
roleMap.put("rKey", roleList);
<foreach collection="rKey" item="roleMap" open="(" separator="," close=")">
#{roleMap}
</foreach>
确保item迭代部分与#{}这里相同就好了。
还有和update一起使用的set元素,这里就不赘述了直接上代码
<update id="updatePwd">
UPDATE `smbms_user`
<set>
`userPassword`=#{userPassword}
</set>
WHERE (`id`=#{id})
</update>
个人感觉这个真心没意义。。。