MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。
动态 SQL 是 MyBatis 中的一个重要特性,它允许在 SQL 语句中嵌入条件判断、循环等逻辑,从而根据不同的输入生成不同的 SQL 语句。动态 SQL 的使用可以大大提高 SQL 语句的复用性和灵活性。
MyBatis 的动态 SQL 主要通过 <if>
、<choose>
、<where>
、<trim>
、<set>
等标签来实现。下面是一些常用的动态 SQL 标签及其用法:
-
<if>
:用于判断条件是否为真。如果条件为真,则包含该语句;如果条件为假,则不包含该语句。例如:<select id="findUser" parameterType="map" resultType="User"> SELECT * FROM user WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select>
-
<choose>
、<when>
、<otherwise>
:用于多条件判断。根据条件的值选择执行不同的语句块。例如:<select id="findUsers" parameterType="map" 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=0 </otherwise> </choose> </where> </select>
-
<where>
:用于包装所有的条件,默认情况下,<where>
标签内的条件会添加 AND 连接符。你可以通过设置prefix
属性来改变连接符。例如:<select id="findUsers" parameterType="map" resultType="User"> SELECT * FROM user <where prefix="AND"> <if test="name != null"> name = #{name} </if> <if test="age != null"> age = #{age} </if> </where> </select>
-
<trim>
:用于修剪 SQL 语句中的多余空格。你可以通过设置prefix
、suffix
和expression
属性来指定修剪的位置和表达式。例如:<select id="findUsers" parameterType="map" resultType="User"> SELECT DISTINCT * FROM user <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age},</if> </trim> </select>
-
<set>
:用于设置更新语句中的字段和值。你可以通过设置prefix
属性来改变连接符。例如:<update id="updateUser" parameterType="map"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age}</if> </set> WHERE id = #{id} </update>
通过组合这些动态 SQL 标签,你可以根据需要生成各种复杂的 SQL 语句,从而满足不同的业务需求。