MyBatis知识整理----(第三部分)

MyBatis批量插入的五种方式整理 目录一:预备工作1:pom依赖:2:配置yml文件3:公用的User类:二、不同的实现方法1:MyBatis利用For循环批量插入(1)、编写UserService服务类,测试一万条数据耗时情况(2)、编写UserMapper接口(3)、编写UserMapper.xml文件(4)、进行单元测试(5)、结果输出2:MyBatis的手动批量提交(1)、其他保持不变,Service层作稍微的变化(2)、结果输出3:MyBatis以集合方式批量新增(推荐)(1)、编写UserService服务类(2)、编写User 阅读详情


十、关联查询(多表结果映射)

当查询涉及多张表,查询结果的字段名与 POJO 属性名无法直接对应时,需要使用 <resultMap>来显式定义映射关系。MyBatis 主要通过 <association>和 <collection>标签处理。

1. 一对一关联

例如,一个 Account账户对象关联一个 User用户对象。

POJO 定义:

public class Account {
    private Integer id;
    private Double money;
    // 一对一关联属性
    private User user;
    // ... getter/setter
}

Mapper XML 配置:

<resultMap id="findAccountByIdResultMap" type="com.hg.pojo.Account">
    <!-- 映射 Account 自身的基本属性 -->
    <id column="aid" property="id"/>
    <result column="money" property="money"/>
    
    <!-- 一对一映射:使用 association 标签
         property: Account 类中的关联属性名,这里是 "user"
         javaType: 该属性的全限定类名
    -->
    <association property="user" javaType="com.hg.pojo.User">
        <!-- 映射 User 对象的属性 -->
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
    </association>
</resultMap>
2. 一对多关联

例如,一个 User用户对象拥有多个 Account账户对象。

POJO 定义:

public class User implements Serializable {
    private Integer id;
    private String username;
    // 一对多关联属性
    private List<Account> accountList;
    // ... getter/setter
}

Mapper XML 配置:

<resultMap id="findUserByIdResultMap" type="com.hg.pojo.User">
    <!-- 映射 User 自身的基本属性 -->
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    
    <!-- 一对多映射:使用 collection 标签
         property: User 类中的关联集合属性名,这里是 "accountList"
         ofType: 集合中泛型的全限定类名
    -->
    <collection property="accountList" ofType="com.hg.pojo.Account">
        <id column="aid" property="id"/>
        <result column="money" property="money"/>
    </collection>
</resultMap>
3. 多对多关联

多对多关系通常通过中间表实现。例如,User和 Role角色之间是多对多关系,对应数据库表 user, user_role, role。

POJO 定义(以 Role 为例):

public class Role {
    private Integer id;
    private String roleName;
    // 一对多(本质上是多对多):一个角色对应多个用户
    private List<User> userList;
    // ... getter/setter
}

Mapper XML 配置:

<resultMap id="findRoleByIdResultMap" type="com.hg.pojo.Role">
    <!-- 映射 Role 自身的基本属性 -->
    <id column="rid" property="id"/>
    <result column="role_name" property="roleName"/>
    
    <!-- 多对多映射:同样使用 collection 标签
         配置方式与一对多完全相同
    -->
    <collection property="userList" ofType="com.hg.pojo.User">
        <id column="uid" property="id"/>
        <result column="username" property="username"/>
    </collection>
</resultMap>

十一、MyBatis 延迟加载(懒加载)

延迟加载(Lazy Loading)是指在真正需要使用关联数据时才发起查询,而非在查询主对象时立即加载所有关联数据,以此提升性能。

配置示例:

<resultMap id="findUserByIdResultMap" type="com.hg.pojo.User">
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    
    <!--
        property: 需要延迟加载的集合属性名,如 "accountList"
        ofType: 集合中元素的类型
        select: 触发延迟加载时要执行的 SQL 语句标识(Namespace + ID)
        column: 传递给上述 `select` 语句的参数,通常是主查询结果中的某列(如用户id)
        fetchType: 加载方式。`lazy` 表示延迟加载,`eager` 表示立即加载
    -->
    <collection property="accountList"
                ofType="com.hg.pojo.Account"
                select="com.hg.mapper.AccountMapper.findAccountByUid"
                column="id"
                fetchType="lazy">
    </collection>
</resultMap>

说明:

  • 当调用 findUserById方法时,只会执行查询用户信息的 SQL。

  • 只有当代码中访问 user.getAccountList()时,MyBatis 才会执行 findAccountByUid方法来查询该用户的账户列表。


十二、MyBatis 的动态 SQL

动态 SQL 允许我们根据条件灵活地拼接 SQL 语句,主要使用以下几个标签。

1. <if>标签:条件判断

用于在 SQL 片段中添加条件判断。

<if test="条件表达式">
    AND column_name = #{value}
</if>

示例:

<if test="username != null and username != ''">
    AND username = #{username}
</if>
2. <where>标签:替代 WHERE 关键字
  • 会智能地在子元素有内容时插入 WHERE关键字。

  • 会自动去除子句开头多余的 AND或 OR。

SELECT * FROM user
<where>
    <if test="username != null">AND username = #{username}</if>
    <if test="age != null">AND age = #{age}</if>
</where>
3. <set>标签:用于 UPDATE 语句
  • 会智能地在子元素有内容时插入 SET关键字。

  • 会自动去除末尾多余的逗号 ,。

UPDATE user
<set>
    <if test="username != null">username = #{username},</if>
    <if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
4. <trim>标签:自定义字符串修剪

功能比 <where>和 <set>更强大,可以自定义前缀/后缀的添加和去除。

  • prefix:在整体内容前添加指定字符串。

  • prefixOverrides:去除整体内容开头的指定字符串。

  • suffix:在整体内容后添加指定字符串。

  • suffixOverrides:去除整体内容末尾的指定字符串。

<!-- 模拟 WHERE 标签 -->
<trim prefix="WHERE" prefixOverrides="AND |OR ">
    ...
</trim>

<!-- 模拟 SET 标签 -->
<trim prefix="SET" suffixOverrides=",">
    ...
</trim>
5. <foreach>标签:遍历集合

常用于 IN查询或批量操作。

<!--
    collection: 指定要遍历的集合参数,取值可以是:
        list, array, map, @Param("keyName"), 或 POJO 的属性名
    item: 遍历时每个元素的别名
    open: 遍历开始前添加的字符串
    separator: 元素之间的分隔符
    close: 遍历结束后添加的字符串
    index: (可选) 在 list/array 中是索引,在 map 中是 key
-->
<foreach collection="ids" item="id" open="id IN (" separator="," close=")">
    #{id}
</foreach>
6. <sql>与 <include>标签:SQL 片段复用
  • <sql>:定义可重用的 SQL 片段。

  • <include>:引用定义好的 SQL 片段。

<!-- 定义公共的 where 条件 -->
<sql id="findUserWhere">
    <where>
        <if test="username != null">AND username LIKE CONCAT('%', #{username}, '%')</if>
        <if test="email != null">AND email = #{email}</if>
    </where>
</sql>

<!-- 在查询中引用 -->
SELECT * FROM user
<include refid="findUserWhere"/>

十三、MyBatis 缓存机制

MyBatis 提供了两级缓存来提高查询效率。

1. 一级缓存
  • 范围:SqlSession级别。同一个 SqlSession内部共享。

  • 生命周期:默认开启,无法关闭。与 SqlSession生命周期相同,SqlSession关闭或执行了增、删、改操作后,缓存会被清空。

  • 生效场景:在同一个 SqlSession中,连续执行两次相同的查询,第二次会直接从一级缓存中获取数据。

2. 二级缓存
  • 范围:Mapper级别(namespace级别)。多个 SqlSession可以共享同一个 Mapper 的二级缓存。

  • 生命周期:需要手动在核心配置文件或 Mapper XML 中开启。生命周期与应用同步,数据会序列化保存到硬盘或其它共享存储中。

  • 开启步骤:

    1. 在 mybatis-config.xml中开启全局缓存(默认是开启的):

      <settings>
          <setting name="cacheEnabled" value="true"/>
      </settings>
    2. 在需要开启二级缓存的 Mapper XML 文件中添加 <cache/>标签。

  • 注意事项:

    • 查询结果对应的实体类必须实现 Serializable接口。

    • 只有执行了 sqlSession.commit()或 sqlSession.close()后,查询结果才会被存入二级缓存。

    • 执行任何增、删、改操作都会清空当前 namespace下的所有二级缓存。

缓存执行顺序:当发起查询时,MyBatis 会先查询二级缓存,再查询一级缓存,如果都没有命中,最后才去查询数据库。

OpenVins解析:基于滤波框架的SLAM 这一方式存在的关键问题是匹配耗时很长,对性能影响显著。可以参考ORBSLAM3中的匹配方式来对其优化,比如左右目匹配可以在极线上搜索,前后帧可以利用运动先验投影匹配。理论上加入路标点会提升精度,代价是增加了计算量。着重说下基于描述子的匹配:OpenVins中匹配的方式是robust_match(),里面是调用的opencv的。openvins中不仅仅进行了传统的MSCKF更新(状态向量中不包含路标点),还在。中进行了包含路标点的估计更新。图像帧到来时,利用IMU递推得到的位姿给该图像帧赋初值。 阅读详情

相关推荐

QDMA工程搭建/windows驱动编译与性能测试

请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。

qq_28455081的博客 2287

【笔记】JDBC的使用

0.jdbc的入门使用 1.查询数据库 new Driver()是导包mysql驱动里面的。import com.mysql.jdbc.Driver; 不需要释放资源 Exception in thread "main" java.sql.SQLException: Before start of result set 取数据传入的参数写错了 String url = "jdbc:mysql://localhost:3306/jdbc_demo"; String url = "协议:子

weixin_TB20160103的博客 1840

全面讲解电子齿轮比与脉冲数计算

什么是编码器分辨率。

viixin的博客 1万+

Mybatis基础知识(3)

1、查询缓存       Mybatis提供一级缓存和二级缓存。              一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象。在该对象中有一个数据结构(HashMap)用户存储缓存数据。       不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。       二级缓存是mapper级别的缓存,多个sq

lsq_java_4的博客 482

从接线到组态:手把手教你搞定PROFIBUS-DP与PA的混合网络搭建(基于西门子TIA Portal)

本文详细介绍了PROFIBUS-DP与PA混合网络的搭建方法,基于西门子TIA Portal平台,从硬件选型、网络架构设计到组态配置和现场调试,提供了一套完整的实战指南。重点解析了DP/PA耦合器的使用、地址映射策略及网络诊断技巧,帮助工程师高效构建高可靠性的工业自动化网络。

weixin_32103009的博客 301

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路:1、根据已有的OFD模板,动态替换ofd模板内容;之后将ofd转pdf(局限:单行问题不大)详情可以在此处了解2、根据html模板动态占位:该工程就是这种方式 ,目前效果良好,可看下图。拿去即用的源码!无任何保留,当然也并不是所有票种都支持(时间有限、精力有限、已经连着转了,要冒烟了…)

九七的博客 2030

MyBatis学习笔记(三)

原生Dao方法及其实现类:public interface Dao { //根据id查信息 public User findUserById(int id) throws Exception; //添加信息 public void insertUser(User user)throws Exception; //删除信息 public void delet

Jessieの家 503

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5847

MyBatis学习(一)

概述 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 使用 资源 下载地址:https://github.com/mybatis/mybatis-3 中文学习文档:http://www.mybatis.org/m...

SICAUliuy的博客 354

【Word提效 No.010】使用AI一键复制格式刷应用格式

本文介绍利用AI工具WorkBuddy实现Word文档格式批量复制的自动化解决方案。通过简单指令即可将指定段落的格式一键应用到多个目标段落,解决传统格式刷操作繁琐、易出错的问题。方案包含三步操作:准备文档、输入指令模板、验收效果,并提供多种场景的现成指令示例。该工具支持字体、段落等格式属性的批量复制,且不会覆盖原文件,适用于论文、手册等文档的格式统一需求。

u011186532的专栏 77

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1461

mybatis的总结1

Mybatis笔记 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架。 为什么学Mybatis? 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。 Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何...

赵宪福的博客 286

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2832

Mybatis知识点整理

1、Mybatis概述 1.1 JDBC编程 1.2.说说你对Mybatis的了解 1.Mybatis 基于java的持久层框架,它的内部封装了JDBC,让开发人员只需要关注SQL语句本身,不需要花费精力在驱动的加载、连接的创建、Statement的创建等复杂的过程。 2.Mybatis通过XML或注解的方式将要执行的各种的statement配置起来,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL,并将结果直接

你好啊cbw 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

知识点整理,MyBatis面试题

什么是Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数 据库中的记...

BoCong-Deng的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SSM框架之mybatis部分知识点整理

SSM框架之mybatis部分知识点 基本映射关系: 数据表映射类,表中行映射对象(实例),表中列映射对象的属性 Mybatis的主要思想是: 把程序中大量的SQL语句抽取出来配置在配置文件中 JDBC的操作: 注册驱动→获取连接→获取操作数据库的预处理对象→执行SQL,得到结果集→遍历结果集→释放资源 Mybatis的环境搭建: 创建maven工程并导入坐标→创建实体类和接口→创建Mybatis...

zs_sss的博客 311

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Mybatis框架知识整理

Mybatis简介 学习框架前,先梳理原始JDBC如何操作数据库 原始JDBC操作 查询数据 引入依赖 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version&gt

寻找你的海洋 4861

mybatis知识整理

mybatis知识整理 1、mybatis的xml文件中 的大于小于 不能 直接使用 > < 符号来比较大小 应该是 &gt; 或者 &lt; 2、Mybatis基础知识,更新语句updateSelective和单纯的update语句区别,前者是根据选中要更新的字段进行更新,如果有空的字段,则会保留原有字段值,不会全部更新。后者则是全部更新字段,有空值则字段值为空。 3、mybatis的Mapper.xml案例,下面这个案例不要照抄,有问题,模糊查询的时候 用了 OR

宁不知的博客 421

MyBatis思维导图(知识点总结,含面试题整理)

前言 针对SSM框架,进行知识点+面试问题的汇总。 SSM思维导图目录 框架概念 Spring Spring概述 IOC Beans AOP代理模式 AOP Spring事务管理(AOP最经典的体现) SpringMVC SpringMVC概述 SpringMVC 工作原理了解吗?(面试概括型) 程序运行流程图(理解深入型) @RequestMapping注解 REST(Representational State Transfer)表述性状态传递

Sold Out 2980

【SpringMvc】SpringMvc +MyBatis整理

MyBatis是什么, MyBatis和Hibernate区别, 自己实现MyBatis 底层机制了解MyBatis, 源码的debug, MyBatis注解, 动态SQL, 映射关系, MyBatis执行SQL的两种方式, 执行器随记, 缓存, 两个缓存的事, Ehcache

dandelionl_的博客 6842

MyBatis知识点整理

什么是 MyBatis? MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 MyBatis 的缓存 MyBatis 的缓存分为一级缓存和二级缓存, 一级缓存放在 session 里面,默认就有, 二级缓在它的命名空间里,默认是不打开的, 使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置 Mybatis是如何进行分页的?分页插件的原理是什么? 1)Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 s

weixin_44606594的博客 302

全面整理MyBatis知识点

数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。Mybatis解决:在中配置数据库连接池,使用连接池管理数据库连接。Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。Mybatis解决:将 Sql 语句配置在 xxxxmapper.xml 文件中与 java 代码分离。向 Sql 语句传参数麻烦,因为 Sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。

good___lucky的博客 807

MyBatis从入门到精通、MyBatis知识点整理总结

一.初识MyBatis1、MyBatis是Java轻量级的持久层框架2、常见的持久层框架:hibernate,mybatis3、什么是持久层框架:1》Java当中的对象有两种状态,一种是瞬态,一种是持久态2》所谓瞬态:是指new了一对象,使用完毕后,java自动垃圾回收了,对象中的属性和状态没有保持住,这就是瞬态对象。3》所谓持久态:这个对象的状态和属性保持住了,其中保存的位置有很多种,比如文件或...

qq_41426442的博客 2960

java通俗讲解的知识点整理

1. volatile关键字的讲解:传送门 2. transient关键字的讲解:传送门 3. synchronized关键字的讲解:传送门

l8947943的博客 4443

开源框架专栏-MyBatis知识点整理(1)

1、什么是MyBatis? 2、讲下MyBatis的缓存 3、Mybatis 是如何进行分页的?分页插件的原理是什么? 4、简述Mybatis的插件运行原理,以及如何编写一个插件? 5、Mybatis 动态sq|是做什么的?都有哪些动态sq|?能简述一下动态 sql的执行原理吗? 6、#机和$0的区别是什么? 7、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里? 8、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么? 9、MyBatis与Hibernate有哪些不同?

涛子丶白了你一眼的博客 5404

MyBatis知识整理

一、MyBatis架构 1、 mybatis配置 SqlMapConfig.xml:此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml:即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。 2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂 3、 由会话工厂...

zgfzmj的博客 219
上一篇: MyBatis 知识整理 (第二部分)
下一篇: Maven 核心知识整理
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值