MyBatis几种SQL写法

devtools/2024/11/14 8:18:46/

目录

1. 批量操作:通过标签支持批量插入

2. 批量操作:通过标签支持批量更新

3. 批量操作:通过标签支持批量删除

4. 动态SQL

3. 多条件分支查询

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

5. 注解方式使用MyBatis

6. 一对多

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

8. MyBatis-Plus集成


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

<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>标签支持批量更新

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

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

<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

<select id="findUsers" resultType="User">SELECT * FROM userWHERE 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. 多条件分支查询

<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关键字。

<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

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. 一对多

<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_timeFROM user uLEFT JOIN orders o ON u.id = o.user_idWHERE u.id = #{userId}
</select>

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

<?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_timeFROM article aLEFT JOIN comment c ON a.id = c.article_idWHERE a.id = #{articleId}</select></mapper>

8. 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));}
}


http://www.ppmy.cn/devtools/132915.html

相关文章

Chrome与火狐哪个浏览器的隐私追踪功能更好

当今数字化时代&#xff0c;互联网用户越来越关注在线隐私保护。浏览器作为我们探索网络世界的重要工具&#xff0c;其隐私追踪功能的强弱直接影响到个人信息的安全。本文将对比Chrome和Firefox这两款流行的浏览器&#xff0c;在隐私追踪防护方面的表现&#xff0c;并探讨相关优…

水库汛限水位是什么?如何进行安全监测

汛限水位是指水库在汛期允许兴利蓄水的上限水位&#xff0c;也是水库汛期防洪调度时的起调水位。在汛期&#xff0c;为了确保水库大坝安全&#xff0c;防止洪水漫坝造成灾害&#xff0c;需要将水库水位控制在汛限水位以下。当水库水位超过汛限水位时&#xff0c;需要根据防洪调…

微信小程序配置

1.进入微信小程序公众平台&#xff0c;进入后注册域名 2.项目接口代理 UniApp H5 跨域代理配置并使用&#xff08;配置manifest.json、vue.config.js&#xff09;_uniapp 代理-CSDN博客 我用了方法一 3.测试接口

Oracle 第24章:云数据库服务

在《Oracle 第24章&#xff1a;云数据库服务》中&#xff0c;我们将探讨Oracle提供的云数据库服务&#xff0c;包括如何在云端部署与管理Oracle数据库。这部分内容将涵盖Oracle Cloud服务的概览&#xff0c;并通过具体的案例来说明如何利用这些服务进行高效的数据库管理和开发。…

测绘程序设计|C#字符串及其操作|分割|取子串|格式化数值|StringBuilder类

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 简单介绍了C#字符串分割、取子串、拼接、格式化数值以及StringBuilder类&#xff0c;拿捏测绘程序设计大赛~ &#x1f33f;前言 字…

若依管理系统部署

jdk、maven、node、mysql、redis准备 mysql准备 #安装mysql apt install mysql-server修改mysql配置 vim /etc/mysql/mysql.conf.d/mysqld.cnf #注释这两条 #bind-address x.x.x.x #mysqlx-bind-address x.x.x.x启动mysql systemctl start mysql.servicemys…

软件工程3.0和软件工程2.0的区别

一、软件工程3.0和软件工程2.0的区别 软件工程3.0与软件工程2.0的主要区别体现在以下几个方面&#xff1a; 1. 技术基础和应用范围&#xff1a; - 软件工程2.0&#xff1a;在软件工程2.0阶段&#xff0c;软件工程逐渐从结构化编程转向面向对象编程&#xff0c;AI for SE&…

CTF —— 网络安全大赛

前言 &#x1f4bb;随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff…