高效 MyBatis SQL 写法一

高效 MyBatis SQL 写法一

前言

MyBatis 作为一款优秀的持久层框架,极大地简化了数据库操作。

然而,在实际开发中,XML 配置的编写仍然可能显得繁琐。

本文将分享一些 MyBatis 动态 SQL 的优质写法,帮助开发者提升效率并减少错误。

forEach 标签的使用

forEach 标签常用于循环遍历集合,生成动态 SQL

其核心属性包括:

  • item:集合中元素的别名。
  • index:集合中元素的索引。
  • collection:集合对象,必须指定。
  • open :循环开始时的符号,如 (
  • separator :元素间的分隔符,如 ,
  • close :循环结束时的符号,如 )

示例:

java 复制代码
public List<Entity> queryById(List<String> userIds);

对应的 XML 配置:

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 语句。

示例:

xml 复制代码
<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 语句,用于多条件判断。

示例:

xml 复制代码
<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 标签可用于生成主键。

示例:

xml 复制代码
<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 条件。

示例:

xml 复制代码
<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 标签,开发者可以显著提升代码的可读性和维护性,同时减少错误的发生。

本文介绍的几种常见用法,涵盖了从条件判断到批量操作的多种场景,希望能为你的开发工作带来帮助。

-- 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

相关推荐
tangweiguo0305198714 分钟前
基于 Django 与 Bootstrap 构建的现代化设备管理平台
后端·django·bootstrap
IT果果日记23 分钟前
详解DataX开发达梦数据库插件
大数据·数据库·后端
dazhong201231 分钟前
Spring Boot 项目新增 Module 完整指南
java·spring boot·后端
bobz96537 分钟前
Cilium + Kubevirt 与 Kube-OVN + Kubevirt 在公有云场景下的对比与选择
后端
naumy1 小时前
sqlalchemy
sql
superlls1 小时前
(设计模式)区分建造者、 规格模式(MyBatis Example+Criteria )
java·tomcat
David爱编程2 小时前
深度解析:synchronized 性能演进史,从 JDK1.6 到 JDK17
java·后端
chimchim662 小时前
StarRocks导入数据-使用 Broker Load 进行异步导入
大数据·sql
脑子慢且灵2 小时前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
Lris-KK2 小时前
【Leetcode】高频SQL基础题--1341.电影评分
sql·leetcode