在MyBatis中,<when>
标签用于在动态 SQL 语句中指定条件。它通常与 <choose>
, <otherwise>
, 和 <if>
标签一起使用,来实现不同的 SQL 逻辑分支。你可以在 <where>
, <set>
, 或 <trim>
标签内使用 <when>
来根据不同的条件生成不同的 SQL 片段。例如:
<select id="findUser" parameterType="map" resultType="User">
SELECT * FROM users
WHERE 1=1
<choose>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND username IS NOT NULL
</otherwise>
</choose>
</select>
这里,<when>
用于根据 username
参数的存在与否动态生成不同的 SQL 片段。
在 MyBatis 中,<choose>
标签用于在动态 SQL 中进行条件选择,它类似于 Java 的 switch
语句。<choose>
标签内包含 <when>
和可选的 <otherwise>
标签。<when>
标签用于指定条件,并在条件为 true
时插入相应的 SQL 片段,而 <otherwise>
标签则作为默认选项,如果没有 <when>
条件匹配,则插入 <otherwise>
中的 SQL 片段。示例:
<select id="findUser" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="username != null">
AND username = #{username}
</when>
<when test="email != null">
AND email = #{email}
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
在这个例子中,<choose>
根据是否提供 username
或 email
动态生成 SQL 语句。
在 MyBatis 中,使用 <where>
标签可以简化动态 SQL 的构建。这个标签会自动处理 SQL 语句中的 “AND” 和 “OR” 逻辑运算符,以确保生成的 SQL 语句在添加或删除条件时保持正确。你可以在 <where>
标签中嵌套 <if>
标签来定义动态条件。比如:
<select id="findUser" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">AND username = #{username}</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>
这里,<where>
标签会自动去除开头的 “AND”,只在有条件时才添加它们。
在MyBatis中,同时插入多条记录通常可以通过两种方式来实现:一种是使用<foreach>
标签来动态构建SQL语句,另一种则是利用数据库的批量插入功能(如果数据库支持)。这里主要介绍使用<foreach>
标签的方式,因为它更灵活,可以适用于多种数据库。
<foreach>
标签假设我们有一个用户表user
,包含字段id
, name
, age
等,我们想要一次性插入多条用户记录。
首先,在Mapper接口中定义一个方法,比如:
int insertMultipleUsers(List<User> users);
然后,在Mapper XML文件中,使用<foreach>
标签来动态构建插入语句。<foreach>
标签会遍历传入的集合,并为集合中的每个元素生成一段SQL片段。
<insert id="insertMultipleUsers" parameterType="java.util.List">
INSERT INTO user (name, age)
VALUES
<foreach collection="list" item="user" index="index" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
注意几点:
<foreach>
标签要遍历的集合。当参数是List或数组时,默认使用“list”或“array”作为集合的名称。如果你传递的是一个Map,并且Map中包含了一个List或数组,那么你需要将这里的“list”改为Map中对应的key。<foreach>
标签体内可以通过这个别名来访问集合中的元素。INSERT ALL
语法与上述示例有所不同。使用<foreach>
标签进行批量插入是一种灵活且强大的方式,可以很好地适应不同的需求和数据库环境。