MyBatis 作为一款优秀的持久层框架,极大地简化了数据库操作。
然而,在实际开发中,XML 配置的编写仍然可能显得繁琐。
本文将分享一些 MyBatis 动态 SQL 的优质写法,帮助开发者提升效率并减少错误。
forEach 标签的使用forEach 标签常用于循环遍历集合,生成动态 SQL。
其核心属性包括:
item:集合中元素的别名。index:集合中元素的索引。collection:集合对象,必须指定。open:循环开始时的符号,如 (。separator:元素间的分隔符,如 ,。close:循环结束时的符号,如 )。示例:
public List<Entity> queryById(List<String> userIds);
对应的 XML 配置:
<select id="queryById" resultMap="BaseResultMap"> SELECT * FROM entity WHERE id IN <foreach collection="userIds" item="userId" index="index" open="(" separator="," close=")"> #{userId} </foreach></select>
注意:collection 属性的值取决于传入参数的类型。
如果传入的是 List,则值为 list;如果是数组,则为 array;如果是多个参数,则需封装为 Map。
模糊查询与 concat 函数模糊查询时,可以使用 concat 函数动态拼接 SQL 语句。
示例:
<select id="queryByName" resultMap="BaseResultMap" parameterType="Entity"> SELECT * FROM entity <where> <if test="name != null"> name LIKE concat('%', #{name}, '%') </if> </where></select>
choose 标签的多条件判断choose 标签类似于 Java 中的 switch 语句,用于多条件判断。
示例:
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="User"> SELECT * FROM User u <where> <choose> <when test="username != null"> u.username LIKE CONCAT('%', #{username}, '%') </when> <when test="sex != null"> AND u.sex = #{sex} </when> <otherwise> AND u.status = 'ACTIVE' </otherwise> </choose> </where></select>
selectKey 标签的主键生成在插入数据时,selectKey 标签可用于生成主键。
示例:
<insert id="createStudentAutoKey" parameterType="StudentEntity" keyProperty="studentId"> <selectKey keyProperty="studentId" resultType="String" order="BEFORE"> SELECT nextval('student') </selectKey> INSERT INTO STUDENT_TBL (student_id, student_name, student_sex, student_birthday) VALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday})</insert>
if 标签的动态条件if 标签用于动态生成 SQL 条件。
示例:
<select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="StudentEntity"> SELECT * FROM STUDENT_TBL ST <where> <if test="studentName != null"> ST.STUDENT_NAME LIKE CONCAT('%', #{studentName}, '%') </if> <if test="studentSex != null"> AND ST.STUDENT_SEX = #{studentSex} </if> </where></select>
总结通过合理使用 MyBatis 的动态 SQL 标签,开发者可以显著提升代码的可读性和维护性,同时减少错误的发生。
本文介绍的几种常见用法,涵盖了从条件判断到批量操作的多种场景,希望能为你的开发工作带来帮助。
– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。