MyBatis提供了丰富的动态SQL功能,可以根据不同的条件和情况,在SQL语句中生成不同的逻辑和参数。这样可以在一条SQL语句中完成多种不同的查询、插入、更新或删除操作。
以下是MyBatis中常用的动态SQL标签:
1. `<if>`标签:用于条件判断,根据条件生成不同的SQL片段。
```xml
<select id="getUserByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
```
2. `<choose>`、`<when>`、`<otherwise>`标签:类似于Java中的switch语句,根据不同的条件选择不同的分支。
```xml
<select id="getUserByCondition" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND 1 = 1
</otherwise>
</choose>
</where>
</select>
```
3. `<trim>`、`<set>`、`<where>`标签:可以根据条件去掉或添加一些SQL语句中的不必要的元素,如在WHERE或SET中添加AND或逗号等。
```xml
<update id="updateUserByCondition" parameterType="User">
UPDATE user
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
```
4. `<foreach>`标签:用于遍历集合或数组,生成多个SQL片段。
```xml
<select id="getUserByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
```
5. `<sql>`、`<include>`标签:可以将一些公用的SQL片段抽取出来,提高SQL的重用性。
```xml
<!-- 定义公共的SQL片段 -->
<sql id="baseColumns">
id, name, age
</sql>
<!-- 在具体的SQL语句中引用公共的SQL片段 -->
<select id="getUserById" resultType="User">
SELECT
<include refid="baseColumns"/>
FROM user
WHERE id = #{id}
</select>
```
这些动态SQL标签可以根据实际的需求和条件,用于生成灵活和动态的SQL语句。它们使得在一个SQL语句中可以根据不同的条件生成不同的查询语句,大大增强了SQL的灵活性和可复用性。通过使用动态SQL,可以减少编写大量的重复SQL语句的工作,提高开发效率和代码可维护性。