Mybatis学习(下)
目录
1. 动态sql的应用
1. 动态sql的应用
使用Mybatis框架时, 对于sql数据的操作量比较大的时候, 看着会觉得很乱, 可能写着写着就乱了, 或者说回过头来发现sql语句写错了, 很麻烦, 所以动态sql就可以让我们用Java代码, 替换部分sql语句
1.2 <if>
<select id="findUserByNameAndAge" resultType="User">SELECT * FROM usersWHERE 1 = 1<if test="name != null and name != ''">AND name = #{name}</if><if test="age != null">AND age = #{age}</if>
</select>
当 name 不为空字符串且不为 null 时,会在 SQL 语句中添加 AND name = #{name};当 age 不为 null 时,会添加 AND age = #{age}
所以当第一个if语句成立时, 完整的sql语句是这样的:
SELECT * FROM users
WHERE 1 = 1 AND name = #{name}
当两个if语句都成立时, 完整的sql语句是这样的:
SELECT * FROM users
WHERE 1 = 1 AND name = #{name} AND age = #{age}
那么为什么要加一个 1 = 1 并且每一个if语句后面要加一个AND吗?思考一下
如果两个if语句同时成立,那么第一个一个if语句就不需要AND,第二个if语句需要AND连接, 如果第一个if语句不成立,第二个if语句成立呢, 那就意味着不需要AND, 这就与前者相矛盾
既然如此, 当sql语句涉及到多个判断条件时, 可以在where后面, 加一个永远正确的判断, 这样就可以很好的解决矛盾
1.2 <where>
既然前面说到了if语句和where关键词有冲突, 那么当然会有一个where语句解决冲突, where语句会自动处理第一个AND,OR, 这很好的解决了前面的问题, 使得代码完全和不使用动态sql一致.
<select id="findUserByNameAndAge" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
可以看到, 第一个判断语句没有了AND, 并且省去了1=1 恒正确式
1.3 <choose>、<when>、<otherwise> 标签
这三个标签组合使用,类似于 Java 中的 switch - case - default 语句,会从多个条件中选择一个满足的条件执行。
<select id="findUserByCondition" resultType="User">SELECT * FROM usersWHERE 1 = 1<choose><when test="name != null and name != ''">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 'active'</otherwise></choose>
</select>
otherwise可以当作default, 这些标签了解即可,尽量用简单的方式表达
无论是大厂还是小厂,都力求简洁, 完美主义不可取, 在你看来花了很多时间完善的一些业务的bug, 觉得甲方的功能, 页面不好看, 就自己改, 在别人看来就是无用功, 而且还会影响项目进度
1.4 <set>
<set> 标签用于动态更新 SQL 语句中的 SET 子句,会自动处理多余的逗号。
<update id="updateUser" parameterType="User">UPDATE users<set><if test="name != null and name != ''">name = #{name},</if><if test="age != null">age = #{age}</if></set>WHERE id = #{id}
</update>
如果 <if> 标签中的条件都不满足,<set> 标签不会添加 SET 关键字;如果有条件满足,<set> 标签会自动添加 SET 关键字,并去掉最后一个条件后的逗号。
这些都是常用的标签, 简单的sql语句可以直接写, 切记不要把简单复杂化