MyBatis提供了以下几种常用的动态SQL语法:
1. If条件判断:使用`<if>`元素在SQL语句中添加条件判断。可以根据条件的结果来决定是否包含某部分SQL语句。示例:
```xml
<select id="getUserById" parameterType="int" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="id != null">
AND id = #{id}
</if>
</select>
```
在上述示例中,当参数id不为null时,才会添加AND id = #{id}这一条件。
2. Choose-When-Otherwise选择语句:使用`<choose>`元素、`<when>`元素和`<otherwise>`元素,实现多个条件选择。示例:
```xml
<select id="getUserByCondition" parameterType="User" resultType="User">
SELECT * FROM user
WHERE 1=1
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
</select>
```
上述示例中,根据User对象的不同属性来决定按照哪个条件进行查询。
3. Where条件判断:使用`<where>`元素来动态生成WHERE子句,自动去除多余的AND或OR关键字。示例:
```xml
<select id="getUserByCondition" parameterType="User" resultType="User">
SELECT * FROM user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="username != null">
AND username = #{username}
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
</select>
```
在上述示例中,根据User对象的不同属性来拼接WHERE条件,并且自动去除多余的AND关键字。
4. Foreach循环:使用`<foreach>`元素来进行循环操作,用于批量操作或者在SQL语句中生成多个条件。示例:
```xml
<insert id="batchInsertUsers" parameterType="java.util.List">
INSERT INTO user (username, age) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.username}, #{item.age})
</foreach>
</insert>
```
上述示例中,通过foreach循环将List中的User对象批量插入到数据库。
使用动态SQL只需在映射文件中的SQL语句中嵌入相应的动态SQL元素即可,根据需要添加相应的条件判断、循环等动态内容。动态SQL非常灵活,可以根据不同的条件生成不同的SQL语句,提供了便捷、灵活的数据库访问方式。