MyBatis中通用SQL写法的几种方法实现

 更新时间:2024年12月04日 10:42:27   作者:这孩子叫逆  
本文介绍了MyBatis中常见的几种通用SQL写法,包括批量操作、动态SQL、多条件分支查询、SQL语句优化、自动生成主键、注解方式以及高级映射等,感兴趣的可以了解一下

1. 批量操作优化

批量操作能够显著提升数据库的处理效率,MyBatis通过<foreach>标签支持批量插入、更新和删除。

批量插入

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO user (username, email, create_time) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.username}, #{item.email}, #{item.createTime})
    </foreach>
</insert>

此示例展示了如何批量插入用户数据。通过<foreach>遍历传入的用户列表,将每个用户的信息插入到数据库中。

批量更新

<update id="batchUpdate" parameterType="java.util.List">
    <foreach collection="list" item="item" separator=";">
        UPDATE user
        SET username = #{item.username}, email = #{item.email}
        WHERE id = #{item.id}
    </foreach>
</update>

此示例演示了如何批量更新用户信息。对每个用户,根据其ID更新用户名和邮箱。

批量删除

<delete id="batchDelete" parameterType="java.util.List">
    DELETE FROM user WHERE id IN
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>

此示例展示了如何批量删除用户。通过<foreach>生成一个ID列表,并删除这些ID对应的用户。

2. 动态SQL

动态SQL允许根据条件动态构建SQL语句,MyBatis通过<if>标签实现这一功能。

动态查询

<select id="findUsers" resultType="User">
    SELECT * FROM user
    WHERE 1=1
    <if test="username != null and username != ''">
        AND username LIKE CONCAT('%', #{username}, '%')
    </if>
    <if test="email != null and email != ''">
        AND email = #{email}
    </if>
    <if test="status != null">
        AND status = #{status}
    </if>
</select>

此示例展示了如何根据传入的条件动态构建查询语句。如果某个条件为空,则相应的查询部分不会被添加到SQL中。

3. 多条件分支查询

对于更复杂的查询逻辑,MyBatis提供了<choose><when><otherwise>标签。

多条件分支查询

<select id="findUsersByCondition" resultType="User">
    SELECT * FROM user
    WHERE 1=1
    <choose>
        <when test="searchType == 'username'">
            AND username LIKE CONCAT('%', #{keyword}, '%')
        </when>
        <when test="searchType == 'email'">
            AND email LIKE CONCAT('%', #{keyword}, '%')
        </when>
        <otherwise>
            AND (username LIKE CONCAT('%', #{keyword}, '%') OR email LIKE CONCAT('%', #{keyword}, '%'))
        </otherwise>
    </choose>
</select>

此示例展示了如何根据不同的搜索类型选择不同的查询条件。如果没有指定搜索类型,则默认搜索用户名和邮箱。

4. SQL语句优化

使用<trim>标签可以优化生成的SQL语句,避免多余的ANDOR关键字。

SQL语句优化

<select id="findUsers" resultType="User">
    SELECT * FROM user
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="username != null and username != ''">
            AND username LIKE CONCAT('%', #{username}, '%')
        </if>
        <if test="email != null and email != ''">
            AND email = #{email}
        </if>
        <if test="status != null">
            AND status = #{status}
        </if>
    </trim>
</select>

此示例展示了如何使用<trim>标签去除多余的ANDOR,并在有查询条件时添加WHERE关键字。

5. 自动生成主键

在插入操作中,经常需要获取数据库自动生成的主键。MyBatis提供了<selectKey>标签和useGeneratedKeys属性来实现这一功能。

自动生成主键

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (username, email, create_time)
    VALUES (#{username}, #{email}, #{createTime})
</insert>

(注意:这里的<selectKey>标签通常不是必需的,因为useGeneratedKeys=truekeyProperty已经足够让MyBatis自动处理主键生成。)

此示例展示了如何在插入用户后自动获取生成的主键,并将其赋值给传入的User对象的id属性。

6. 注解方式使用MyBatis

除了XML配置,MyBatis还支持使用注解来定义SQL操作,使代码更简洁。

注解方式示例

public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(Long id);

    @Insert("INSERT INTO user (username, email, create_time) VALUES (#{username}, #{email}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insertUser(User user);

    @Update("UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}")
    int updateUser(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteUser(Long id);
}

此示例展示了如何使用注解来定义简单的CRUD操作。对于复杂的SQL语句,仍然建议使用XML配置。

7. 高级映射

MyBatis提供了强大的对象关系映射功能,可以处理复杂的表关系。

一对多映射

<resultMap id="userWithOrdersMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="orderNumber" column="order_number"/>
        <result property="createTime" column="order_create_time"/>
    </collection>
</resultMap>

<select id="getUserWithOrders" resultMap="userWithOrdersMap">
    SELECT u.id as user_id, u.username, o.id as order_id, o.order_number, o.create_time as order_create_time
    FROM user u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{userId}
</select>

此示例展示了如何将用户和订单信息映射到一个复杂的对象结构中,实现一对多映射。

8. MyBatis-Plus集成

MyBatis-Plus是MyBatis的增强工具,提供了便捷的CRUD操作和强大的条件构造器。

MyBatis-Plus使用示例

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    public List<User> findUsersByCondition(String username, String email) {
        return this.list(new QueryWrapper<User>()
                .like(StringUtils.isNotBlank(username), "username", username)
                .eq(StringUtils.isNotBlank(email), "email", email));
    }
}

到此这篇关于MyBatis中通用SQL写法的几种方法实现的文章就介绍到这了,更多相关MyBatis 通用SQL写法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java泛型<T> T与T的使用方法详解

    Java泛型<T> T与T的使用方法详解

    这篇文章主要介绍了Java泛型<T> T与T的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • mybatis中的test语句失效处理方式

    mybatis中的test语句失效处理方式

    这篇文章主要介绍了mybatis中的test语句失效处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 快速使用IDEA图形化界面连接Phoenix的方法

    快速使用IDEA图形化界面连接Phoenix的方法

    最近很多朋友跟小编留言如何使用IDEA图形化界面连接Phoenix,在这小编就不一一回复大家了,今天抽空给大家整理一篇教程关于idea 图形化界面连接Phoenix的相关知识,需要的朋友快来学习下吧
    2021-05-05
  • Java生成二维码的实现方式汇总

    Java生成二维码的实现方式汇总

    本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现,下面我们将基于Spring Boot,并采用两种方式实现二维码的生成,对于每一种方式还提供两种类型的二维码返回形式,需要的朋友可以参考下
    2023-09-09
  • springboot restTemplate连接池整合方式

    springboot restTemplate连接池整合方式

    这篇文章主要介绍了springboot restTemplate连接池整合方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java留言管理系统中模糊查询实例分享

    java留言管理系统中模糊查询实例分享

    这篇文章主要为大家详细介绍了基于MVC+DAO的留言管理系统中java模糊查询的简单使用方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • SpringBoot 整合WebSocket 前端 uniapp 访问的详细方法

    SpringBoot 整合WebSocket 前端 uniapp 访问的详细方法

    这篇文章主要介绍了SpringBoot 整合WebSocket 前端 uniapp 访问的详细方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • spring boot如何通过自定义注解和AOP拦截指定的请求

    spring boot如何通过自定义注解和AOP拦截指定的请求

    这篇文章主要介绍了spring boot通过自定义注解和AOP拦截指定的请求,本文主要通过切面类和自定注解的方式,拦截指定的接口(代码中已经作了详细的说明),需要的朋友可以参考下
    2024-06-06
  • Java快速排序及求数组中第k小的值解析

    Java快速排序及求数组中第k小的值解析

    这篇文章主要介绍了Java快速排序及求数组中第k小的值解析,选一个中间值,把数组中比它小的元素放到左边,比它大的元素放到右边,这时形成三个子数组,分别是中间值,比它大的数和比它小的数,然后对前后两个数组进行递归,需要的朋友可以参考下
    2023-11-11
  • 解读easyexcel中的常用注解

    解读easyexcel中的常用注解

    这篇文章主要介绍了关于easyexcel中的常用注解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论