MyBatis 中常用的 SQL 语句

MyBatis-3写SQL语句的72种技巧 本文列出了MyBatis在编写 SQL 语句时的 72 种技巧,覆盖了从基础的 SQL 查询到高级的动态 SQL、性能优化、批量操作等多个方面。这些技巧将帮助开发者在使用 MyBatis 进行数据库操作时提高代码的灵活性、可维护性和性能。编写更灵活的动态 SQL,减少重复代码;优化查询性能,提高数据库访问效率;更高效地处理复杂的数据库交互,如批量插入、更新和删除操作;更好地使用 MyBatis 提供的缓存机制和事务管理功能。通过实践这些技巧,你将能够更高效地进行数据库操作,并提升应用的性能。 阅读详情

MyBatis 中常用的 SQL 语句与标准 SQL 语句基本一致,但 MyBatis 提供了一些额外的特性和标签来更方便地构建和管理 SQL 语句。以下列出 MyBatis 中常用的 SQL 语句,并结合 MyBatis 的特性进行说明:

1. SELECT (查询)

  • 基本查询:
<select id="selectUserById" parameterType="int" resultType="User">
  SELECT id, username, password, email FROM users WHERE id = #{id}
</select>
  • id: 该 SQL 语句的唯一标识符,用于在 Java 代码中引用。

  • parameterType: 传入参数的类型 (可选,MyBatis 可以自动推断)。

  • resultType: 查询结果映射的 Java 类型 (POJO)。

  • #{id}: 占位符,表示传入的参数,MyBatis 会自动进行参数绑定和类型转换,防止 SQL 注入。

  • 多条件查询 (动态 SQL):

<select id="selectUsers" parameterType="map" resultType="User">
  SELECT id, username, password, email FROM users
  <where>
    <if test="username != null and username != ''">
      AND username LIKE CONCAT('%', #{username}, '%')
    </if>
    <if test="email != null and email != ''">
      AND email = #{email}
    </if>
  </where>
</select>
  • <where>: 自动添加 WHERE 关键字,并处理多余的 AND 或 OR。

  • <if>: 根据条件判断是否包含该 SQL 片段。

  • test: 条件表达式,使用 OGNL 表达式。

  • LIKE: 模糊查询,CONCAT('%', #{username}, '%') 用于构建模糊查询条件。

  • 关联查询 (JOIN):

<select id="selectUserWithOrders" parameterType="int" resultMap="userWithOrdersResultMap">
  SELECT
    u.id AS user_id,
    u.username,
    o.id AS order_id,
    o.order_date
  FROM users u
  LEFT JOIN orders o ON u.id = o.user_id
  WHERE u.id = #{id}
</select>

<resultMap id="userWithOrdersResultMap" 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="orderDate" column="order_date"/>
  </collection>
</resultMap>
  • LEFT JOIN: 左连接,获取用户及其所有订单。

  • resultMap: 自定义结果映射,用于处理复杂的关联关系。

  • <collection>: 映射一对多关系,将订单列表映射到 User 对象的 orders 属性。

  • 分页查询 :

<!-- MySQL -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
  SELECT id, username, password, email FROM users LIMIT #{offset}, #{pageSize}
</select>

<!-- Oracle -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
  SELECT * FROM (
    SELECT t.*, ROWNUM rn FROM (
      SELECT id, username, password, email FROM users
    ) t WHERE ROWNUM <= #{endRow}
  ) WHERE rn > #{startRow}
</select>
  • LIMIT: MySQL 中的分页关键字。
  • ROWNUM: Oracle 中的伪列,用于分页。
  • 需要根据不同的数据库方言使用不同的分页语法。 MyBatis 提供了 Dialect 接口来支持不同的数据库方言。

2. INSERT (插入)

  • 基本插入:
<insert id="insertUser" parameterType="User">
  INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>
  • 获取自增主键:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>
  • useGeneratedKeys="true": 启用获取自增主键。

  • keyProperty="id": 指定将自增主键值设置到 User 对象的哪个属性 (通常是 id)。

  • 批量插入 (foreach):

<insert id="batchInsertUsers" parameterType="java.util.List">
  INSERT INTO users (username, password, email) VALUES
  <foreach collection="list" item="user" separator=",">
    (#{user.username}, #{user.password}, #{user.email})
  </foreach>
</insert>
  • <foreach>: 循环遍历 list 集合,生成多个插入值。
  • collection: 指定要遍历的集合。
  • item: 集合中每个元素的别名。
  • separator: 分隔符,用于分隔每次循环生成的 SQL 片段。

3. UPDATE (更新)

  • 基本更新:
<update id="updateUser" parameterType="User">
  UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
</update>
  • 动态更新 (set + if):
<update id="updateUserSelective" parameterType="User">
  UPDATE users
  <set>
    <if test="username != null and username != ''">
      username = #{username},
    </if>
    <if test="password != null and password != ''">
      password = #{password},
    </if>
    <if test="email != null and email != ''">
      email = #{email},
    </if>
  </set>
  WHERE id = #{id}
</update>
  • <set>: 自动添加 SET 关键字,并处理多余的逗号。
  • 只更新传入的非空字段。

4. DELETE (删除)

  • 基本删除:
<delete id="deleteUserById" parameterType="int">
  DELETE FROM users WHERE id = #{id}
</delete>
  • 批量删除 (foreach):
<delete id="deleteUsersByIds" parameterType="java.util.List">
  DELETE FROM users WHERE id IN
  <foreach collection="list" item="id" open="(" close=")" separator=",">
    #{id}
  </foreach>
</delete>
  • open: 循环开始前添加的字符串。
  • close: 循环结束后添加的字符串。

5. 其他常用标签和特性

  • <sql>: 定义可重用的 SQL 片段。
<sql id="userColumns">
  id, username, password, email
</sql>

<select id="selectUserById" parameterType="int" resultType="User">
  SELECT <include refid="userColumns"/> FROM users WHERE id = #{id}
</select>
  • #{} vs ${}:
    • #{}: 预编译参数,防止 SQL 注入,推荐使用。
    • ${}: 字符串替换,直接将值拼接到 SQL 语句中,有 SQL 注入风险,谨慎使用 (例如,用于动态表名或列名)。
  • typeAliases: 定义类型别名,简化 resultType 和 parameterType 的书写。
  • <cache>: 开启二级缓存,提高查询性能。
  • Result Maps (结果映射): 处理复杂类型和关联关系的映射。

总结:

MyBatis 的核心在于将 SQL 语句与 Java 代码分离,并通过 XML 或注解的方式进行配置。 尽可能使用 #{} 进行参数绑定,以防止 SQL 注入。

MyBatis创建拦截器用于拦截SQL语句进行记录 MyBatis创建拦截器用于拦截SQL语句进行记录前言首先 前言 最近公司有一个对后台管理系统,管理员执行增删改SQL语句的记录保存,刚开始我思考是使用Spring的AOP来制作一个切面来实现,但是后面看到需要保存SQL语句,所以想到了MyBatis的插件系统。废话少说,直接上代码。 首先 需要创建一个拦截器,来继承MyBatis的Interceptor。 import com.alibaba.fastjson.JSONObject; import com.sibility.mybatis.model.Ad 阅读详情

相关推荐

mybatis获取实际执行的sql语句

最近项目中的一个需求:涉及到数据同步,由于环境原因导致只能通过webservice同步执行的sql语句,故需要获取数据库实际执行的增删改sql语句到sql_log表中以同步。 编写mybatis插件拦截sql语句 package net.mshome.twisted.tmall.interceptor; import cn.hutool.core.date.DateUtil; import co...

唯学习方能解忧 1万+

Mybatis常用的sql语句汇总

后端在使用mybatis的时候,与sql语句也是常常打照面的,这里小编经过了一个项目,现在总结一下遇到过的sql语句吧。

wct040923的博客 1579

mybatis调用sql语句

Mybatis调用sql语句过程 如图 根据Configuration配置文件创建创建getmapper方法调用结果SqlSessionFactoryBuilderSqlSessionFactory实例SqlSessionMapper实例ExecutorStatementHandlerResultSetHandler 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的M...

xiegangQN的博客 1315

Mybatis 处理 sql 语句

本文 mybatis 处理 sql 语句主要分为编译期间处理和执行期间处理 另外 sql 语句又分为 静态 sql 语句 和动态 sql 语句,用参数修饰符来区分。 静态 sql 语句:没有参数或者参数修饰符全部是 #{} 这种,并且没有其他标签 动态 sql 语句:参数其中之一被 ${} 修饰,或者有标签 Mybatis 对动态 sql 的定义 mybatis 初始化完成后 所有处理完的 sql 语句都存在 SqlSource Configuration —》 MappedStatement–》 SqlS

@Bean 2211

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4288

带隙基准电路实战:温度补偿与流片调优全解析

带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架

weixin_42628280的博客 254

MyBatis SQL语句详解

1 CRUD标签 1.1 select select中属性说明: id属性:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致。 resultType:将结果集映射为java的对象类型。必须(和 resultMap 二选一) parameterType:传入参数类型。可以省略 标签内部:具体的sql语句。 <select id="接口名称" parameterType="包名.类名" resultType="包名.返回结果集类型"> select

qq_45352099的博客 3642

使用光流进行 Warp 的流程

光流描述了图像帧中每个像素的运动。前向光流:描述了帧中每个像素在帧中的移动位置。后向光流:描述了帧中每个像素在帧​ 中的移动位置。水平方向的位移(x 方向),即每个像素水平移动了多少像素。垂直方向的位移(y 方向),即每个像素垂直移动了多少像素。使用光流进行 Warp 的流程Warp 是通过光流对图像进行变换的操作,旨在将前一帧的像素根据光流场映射到下一帧的对应位置。Step 1: 计算光流我们首先需要通过光流网络(如 RAFT)来估算两帧之间的光流。我们可以获得前向光流(从帧​ 到帧。

qq_44199605的博客 2108

mybatis——sql语句

mybatis中sql语句编写使mybatis开发更加整洁匹配返回的数据名在控制台显示mybatis信息化简类的完全限定名编写mybatis工具类查询数据查询数据复数查询数据模糊查询数据增加或减少限制(不为0)增加或减少限制(chooose-when用法)增加或减少限制(可为0)多表对一bean查询数据添加或更新数据修改数据(有数据对自身的限制)封装前置查询语句(SQL片段) 使mybatis开发更加整洁 匹配返回的数据名 在mapper映射文件中进行配置 <!--描述如何从数据库结果集中加载对

m0_66387193的博客 1072

基于STM32与ESP8266的MQTT协议实现阿里云物联网平台远程LED控制

本文详细介绍了如何利用STM32单片机与ESP8266 Wi-Fi模块,通过MQTT协议连接阿里云物联网平台,实现远程控制LED灯的完整物联网项目。内容涵盖硬件连接、阿里云平台配置、MQTT协议与AT指令解析、STM32代码实战以及数据解析与调试技巧,为嵌入式开发者提供了一个清晰、实用的物联网入门实践指南。

svm4gardener的博客 791

从仿真到实践:两级直接耦合放大电路的静态工作点协同调试指南

本文详细解析了两级直接耦合放大电路的静态工作点协同调试方法,从仿真到实践提供系统指南。重点介绍了Rc2电阻调整技巧、集电极电位测量方法及常见问题排查,帮助工程师解决各级静态工作点相互影响的难题,提升模拟电路设计效率。

weixin_29189373的博客 124

mybatis-SQL语句

Result(column = "entrydate", property = "ed"),//@Result一条映射规则 (column = "数据表中字段名", property = "实体类属性名")where:只会在<where>标签内部有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR。* 引用SQL片段: <include refid="selectUser"></include>* 定义SQL片段: <sql id="selectUser"></sql>

mafangcheng的博客 336

AI辅助发明专利撰写实战:30分钟高效生成高质量技术专利文档

在技术专利撰写领域,尤其是软件、算法或系统架构相关的发明专利,如何将创新的技术构思快速、规范地转化为符合《专利法》要求的申请文件,是许多开发者和技术团队面临的共同挑战。传统的人工撰写方式不仅耗时耗力,对撰写人的法律和技术双重背景要求极高,还容易因格式或术语不规范导致审查意见增多。本文将分享一套利用 AI 辅助工具,系统化、高效率地完成一篇高质量发明专利说明书撰写的实战流程。通过清晰的步骤拆解、可复制的提示词(Prompt)工程以及关键注意事项,即使是首次接触专利撰写的开发者,也能在短时间内掌握从技术方案梳理

子夜轻风 949

Mybatis动态SQL语句大全

Mybatis动态SQL语句大全

小学生波波 2642

SAM3 几行代码支持任意图像分辨率,减少显存占用(针对transformers库)

几行代码让sam3支持任意图像分辨率

qq_41234663的博客 156

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3842

Mybatis如何获取SQL语句

Mybatis如何获取SQL语句 一、获取映射文件xml 在我们的mybatis-config.xml文件里面,有这么一个标签 <mappers> <mapper resource="mybatis/UserMapper.xml"/> </mappers> 众所周知,这个绑定的是写SQL语句的文件,所以说,谁去解析的上面的这个xml文件,谁就能拿到SQL语句 那这个文件将会被哪个标签或者哪个类加载呢?我们知道UserMapper.xml文

qq_45621336的博客 5776

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Mybatis动态sql语句

一、UserMapper.xml <?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"> <map...

L-李俊漩的博客 265

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MyBatis处理SQL语句映射

基础MyBatis问题以去看。

weixin_71219171的博客 996

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MyBatis的SQL语句优化

1.背景介绍 MyBatis是一款流行的Java持久化框架,它可以使用XML配置文件或注解来定义数据库操作,并提供了简单的API来执行这些操作。MyBatis的优点包括简单易用、高性能和灵活性。然而,在实际应用中,MyBatis的性能可能会受到SQL语句的优化影响。因此,了解MyBatis的SQL语句优化技巧和策略是非常重要的。 在本文中,我们将讨论MyBatis的SQL语句优化,包括背景、核...

AI天才研究院 1358

mybatis查看执行的sql语句

mybatis在开发期间需要查看当前mybatis执行的sql语句,有很多种办法,例如使用log4j等方式,最简单的做法是利用mybatis自带功能设置 <setting name="logImpl" value="STDOUT_LOGGING" /> 这样一句话,就可以在执行的时候看到执行的sql语句以及参数情况了 具体做法:在mybatis配置文件中: <?xml ve...

liuyuncd的博客 2万+

mybatis动态sql语句

mybatis动态sql MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 if语句 动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如: <?x...

swop_的博客 321

Mybatis如何获取sql语句

myBatis如何获取多数据源

weixin_36025694的博客 3764

MyBatis的sql常用语句

前言    好久没写了,之前的一些心得都是写在自己的笔记上,但是有交流才有提升嘛,所以决定以后有心得的话还是多写在博客上好一些。本人在公司实习的时候需要使用SSM框架,有时会写一些sql映射语句,之前虽然写过一些,但都是零零散散的,所以决定系统地书写一些常用的语句,留作总结。常用的sql语句写法    sql映射语句的传入参数可以是基本数据类型,也可以是一个对象类型,当然也可以是数组或者容器类型。...

KevinDYZS的博客 909

配置mybatis输出sql语句

场景: spring集成mybatis项目中,配置mybatis输出sql语句配置: 在mybatis全局配置文件mybatis-config.xml如下配即可 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org/...

zhangbeizhen18的博客 3606

Mybatis中常用的动态sql语句

动态 SQL 之<where> 动态添加where关键字和and关键字,满足sql语法 动态 SQL 之<if> 我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。 <select id="findByConditi...

Tang_cancan的博客 480
上一篇: MyBatis SQL 映射文件的作用和结构
下一篇: MyBatis Mapper 接口的作用,以及如何将 Mapper 接口与 SQL 映射文件关联起来
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值