文章目录
参考资料
SPOC
还有一些参考的文章,都有在相应部分标注。
运行环境
- windows10
- IDEA 2021.6 专业版
- MyBatis3.5.0
获取Demo
Gitee:https://gitee.com/ccuni/mybatis-learn-quick-get-start
一、MyBatis 动态 SQL
实现动态SQL的标签主要有 if、 trim 、 where 、 set 、 choose (when 、 otherwise)、foreach
1.1 if 标签
基本语法:
<if test="表达式">若表达式成立则返回的字符串</if>
功能描述: 可根据参数的值选择SQL语句执行的参数,是实现动态SQL的关键标签。
使用案例: 在实现修改功能时,若缺少参数,比如只修改一部分信息的情况,此时的SQL语句需要根据实体类对象的值进行判断,若为NULL则不进行修改,以供应商信息修改为例:
<!-- 修改供应商信息 -->
<update id="modifyProvider" parameterType="Provider">
UPDATE smbms_provider
<set>
<if test="proCode!=null">proCode=#{proCode},</if>
<if test="proName!=null">proName=#{proName},</if>
<if test="proDesc!=null">proDesc=#{proDesc},</if>
<if test="proContact!=null">proContact=#{proContact},</if>
<if test="proPhone!=null">proPhone=#{proPhone},</if>
<if test="proAddress!=null">proAddress=#{proAddress},</if>
<if test="proFax!=null">proFax=#{proFax},</if>
<if test="modifyDate!=null">modifyDate=#{modifyDate}</if>
</set>
WHERE id=#{id}
</update>
1.2 where 标签
基本语法:
<where>
<!--...sql语句-->
</where>
功能描述: 简化SQL语句中的where条件判断、只能处理and和or
使用案例: 以实现根据用户名称和用户角色的查询为例,有可能缺少一个参数
<select id="queryUserByDSQL" resultType="User" parameterType="User">
SELECT * FROM smbms_user
<where>
<if test="userName != null and userName != ''">
userName like CONCAT('%', #{userName}, '%')
</if>
<if test="userRole != null">
AND userRole = # {userRole}
</if>
</where>
</select>
注:若不使用 where标签,当 userName为空时,SQL语句为 SELECT * FROM smbms_user WHERE AND ...
则为不合法SQL语句
1.3 set 标签
基本语法:
<set>
<!-- SQL语句 -->
</set>
功能描述: 可以搭配 IF 标签,过滤实体类变量为 NULL的情况。
使用案例可参考IF标签的案例。
1.4 trim 标签
基本语法:
<trim prefix="..." suffix="..." prefixOverrides="..." suffixOverrides="...">
</trim>
功能描述: 更灵活的去除多余的关键字,可以替代 where
和 set
属性说明:
属性值 | 描述 |
---|---|
prefix | 前缀,作用是通过自动识别是否有返回值后,在 trim 包含的内容上加上前缀,如此处的where |
suffix | 后缀,作用是在trim包含的内容加上后缀 |
prefixOverrides | 对于 trim 包含内容的首部进行指定内容的忽略 |
suffixOverrides | 对于 trim 包含内容的尾部进行指定内容的忽略 |
使用案例:
- 更新用户表数据
<update id="..." parameterType="User">
UPDATE smbms_user
<trim prefix ="set" suffixOverrides="," suffix="WHERE id = #{id}">
<if test="userCode != null">userCode=#{userCode},</if>
<if test="userName != null">userName=#{userName},</if>
<if test="userPassword != null">userPassword=#{userPassword},</if>
</trim>
</update>
- 根据用户名、用户角色查询,其中用户名为模糊查询
<trim prefix="WHERE" prefixOverrides="AND|OR">