MyBatis几种SQL写法

目录

[1. 批量操作:通过标签支持批量插入](#1. 批量操作:通过标签支持批量插入)

[2. 批量操作:通过标签支持批量更新](#2. 批量操作:通过标签支持批量更新)

[3. 批量操作:通过标签支持批量删除](#3. 批量操作:通过标签支持批量删除)

[4. 动态SQL](#4. 动态SQL)

[3. 多条件分支查询](#3. 多条件分支查询)

[4. SQL语句优化:使用标签避免多余的AND或OR关键字。](#4. SQL语句优化:使用标签避免多余的AND或OR关键字。)

[5. 注解方式使用MyBatis](#5. 注解方式使用MyBatis)

[6. 一对多](#6. 一对多)

[7. 多对一:每个评论(Comment)都属于一篇文章(Article),并且每篇文章可以有多个评论。](#7. 多对一:每个评论(Comment)都属于一篇文章(Article),并且每篇文章可以有多个评论。)

[8. MyBatis-Plus集成](#8. MyBatis-Plus集成)


1. 批量操作:++通过<foreach>标签支持批量插入++

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

2. 批量操作:++通过<foreach>标签支持批量更新++

java 复制代码
<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>

3. 批量操作:++通过<foreach>标签支持批量删除++

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

4. 动态SQL

java 复制代码
<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>

3. 多条件分支查询

java 复制代码
<select id="findUsersByCondition" resultType="User">
    SELECT * FROM user
    <where>
        <choose>
            <when test="searchType == 'username'">
                username LIKE CONCAT('%', #{keyword}, '%')
            </when>
            <when test="searchType == 'email'">
                email LIKE CONCAT('%', #{keyword}, '%')
            </when>
            <otherwise>
                (username LIKE CONCAT('%', #{keyword}, '%') OR email LIKE CONCAT('%', #{keyword}, '%'))
            </otherwise>
        </choose>
    </where>
</select>

4. SQL语句优化:使用<trim>标签避免多余的ANDOR关键字。

java 复制代码
<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>

5. 注解方式使用MyBatis

java 复制代码
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);
}

6. 一对多

java 复制代码
<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>

7. 多对一:每个评论(Comment)都属于一篇文章(Article),并且每篇文章可以有多个评论。

java 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.ArticleMapper">

    <!-- 定义 Comment 的 resultMap -->
    <resultMap id="commentWithArticleMap" type="Comment">
        <id property="id" column="comment_id"/>
        <result property="content" column="comment_content"/>
        <result property="createTime" column="comment_create_time"/>
        <association property="article" javaType="Article">
            <id property="id" column="article_id"/>
            <result property="title" column="article_title"/>
            <result property="content" column="article_content"/>
        </association>
    </resultMap>

    <!-- 定义 Article 的 resultMap -->
    <resultMap id="articleWithCommentsMap" type="Article">
        <id property="id" column="article_id"/>
        <result property="title" column="article_title"/>
        <result property="content" column="article_content"/>
        <collection property="comments" ofType="Comment" resultMap="commentWithArticleMap"/>
    </resultMap>

    <!-- 查询文章及其评论列表 -->
    <select id="getArticleWithComments" resultMap="articleWithCommentsMap">
        SELECT 
            a.id as article_id,
            a.title as article_title,
            a.content as article_content,
            c.id as comment_id,
            c.content as comment_content,
            c.create_time as comment_create_time
        FROM article a
        LEFT JOIN comment c ON a.id = c.article_id
        WHERE a.id = #{articleId}
    </select>

</mapper>

8. MyBatis-Plus集成

java 复制代码
@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));
    }
}
相关推荐
老王的笔记v20 分钟前
38期 Windows系统性能监控工具,CPU显卡温度网络数据实时查看
windows
程序员老陆1 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
经典19923 小时前
解析pdf表格内容
windows·pdf
倒流时光三十年4 小时前
第六阶段 57 · ES|QL 与 SQL API(用 SQL 查 ES)
数据库·sql·elasticsearch
csdn2015_4 小时前
springboot +mybatis 查询myql开启程序级别缓存
spring boot·缓存·mybatis
BIBI20495 小时前
Windows 下 Maven 安装与 VSCode 配置
java·windows·vscode·maven·环境搭建·安装教程
vHelios5 小时前
SQL不会写?不会找关联表?复杂SQL语句编写逻辑实现思路请查收✉
数据库·sql
Chief_fly5 小时前
【Windows 下载 ARM64 deb 包 麒麟 ARM 离线安装】
arm开发·windows
阿昭L6 小时前
ZwQuerySystemInformation通过PsLoadedModuleList枚举内核模块
windows·逆向工程·windows内核
xiancai_xianyu6 小时前
企业智能问数怎么落地,从自然语言到SQL那道坎有多难
数据库·人工智能·sql·text2sql·企业智能问数·agentrag·ai推理可视化