Java中MyBatis的动态语句详解
一、 概述
动态 SQL 是 MyBatis 的强大特性之一,通过不同参数生成不同的 SQL,可以动态地对数据持久层进行操作,而不需要每个数据访问操作都要进行手动地拼接 SQL 语句。
二、动态语句
1. if
<if> 语句可以根据条件指定 SQL 部分,例如 where 条件。
查询数据接口如下:
public interface UserSqlMapper {
List<User> selectByUsername(@Param("username") String username, @Param("status") Integer status);
}对应映射语句如下:
<select id="selectByUsername" resultType="User">
SELECT * FROM t_user WHERE 1 = 1
<if test="status != null">
AND status = #{status}
</if>
<if test="username != null and username != ''">
AND username = #{username}
</if>
</select>上面语句当 status 不为 null 时,以及 username 不为空字符串时,对应的查询条件才会生效。
2. choose、when、otherwise
<choose> 语句类似于 Java 的 switch 语句,可以从多个条件中选择一个使用。
<select id="selectByUsername" resultType="User">
SELECT * FROM t_user WHERE 1 = 1
<choose>
<when test="status != null">
AND status = #{status}
</when>
<otherwise>
AND username = #{username}
</otherwise>
</choose>
</select>上面语句根据 status 是否为 null 而执行不同的查询条件,每次查询只存在一个查询条件。
3. trim、where、set
在前面的例子中,where 后面都会加上 1=1 这个条件,为了解决当所有条件都没生效时,where 条件为空而产生异常的问题。
在更新语句 set 后面也会出现同样的问题,可以使用 <trim> 语句通过指定前缀和后缀的方式来解决。
MyBatis 也提供更简单的 <where> 语句和 <set> 语句来解决这个问题。
例如下面两个接口:
public interface UserSqlMapper {
List<User> selectByUsername(@Param("username") String username, @Param("status") Integer status);
void updateById(User user);
}对应的 <trim> 映射 where 语句如下:
<select id="selectByUsername" resultType="User">
SELECT * FROM t_user
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="status != null">
AND status = #{status}
</if>
<if test="username != null and username != ''">
AND username = #{username}
</if>
</trim>
</select>对应的 <where> 映射语句如下:
<select id="selectByUsername" resultType="User">
SELECT * FROM t_user
<where>
<if test="status != null">
AND status = #{status}
</if>
<if test="username != null and username != ''">
AND username = #{username}
</if>
</where>
</select>对应的 <trim> 映射 update 语句如下:
<update id="updateById">
UPDATE t_user
<trim prefix="SET" suffixOverrides=",">
<if test="status != null">
status = #{status},
</if>
<if test="username != null and username != ''">
username = #{username},
</if>
</trim>
</update>对应的 <set> 映射语句如下:
<update id="updateById">
UPDATE t_user
<set>
<if test="status != null">
status = #{status},
</if>
<if test="username != null and username != ''">
username = #{username},
</if>
</set>
</update>4. foreach
<foreach> 可以对集合进行遍历,例如使用 IN 条件语句的时候。
查询数据接口如下:
public interface UserSqlMapper {
List<User> selectInIdList(@Param("idList") List<Long> idList);
}对应映射语句如下:
<select id="selectInIdList" resultType="User">
SELECT * FROM t_user
<where>
<foreach item="item" index="index" collection="idList" open="id IN (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>item 指定元素,index 指定索引。
5. script
<script> 可以在接口上的注解中使用动态SQL。
例如查询数据接口如下:
public interface UserSqlMapper {
@Select("<script>" +
"SELECT * FROM t_user" +
"<where>" +
" <if test='status != null'>AND status = #{status}</if>" +
" <if test='username != null'>AND username = #{username}</if>" +
"</where>" +
"</script>")
List<User> selectByUser(User user);
}<script> 标签里面的内容和在 XML 文件中的动态 SQL 语法一致。
到此这篇关于Java中MyBatis的动态语句详解的文章就介绍到这了,更多相关MyBatis的动态语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring中@RabbitHandler和@RabbitListener的区别详析
@RabbitHandler是用于处理消息的方法注解,它与@RabbitListener注解一起使用,这篇文章主要给大家介绍了关于Spring中@RabbitHandler和@RabbitListener区别的相关资料,需要的朋友可以参考下2024-02-02
springboot 启动如何修改application.properties的参数
这篇文章主要介绍了springboot 启动如何修改application.properties的参数方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
浅谈HttpClient、okhttp和RestTemplate的区别
这篇文章主要介绍了HttpClient、okhttp和RestTemplate的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法
本文主要介绍了SpringBoot项目改为SpringCloud项目使用nacos作为注册中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-04-04
Java中字符数组、String类、StringBuffer三者之间相互转换
这篇文章主要介绍了Java中字符数组、String类、StringBuffer三者之间相互转换,需要的朋友可以参考下2018-05-05


最新评论