Mybatis内容汇总

简介: 本文介绍了MyBatis的核心配置与使用技巧,涵盖属性优先级、多环境配置、事务管理、映射关系(一对一、一对多等)、分页实现方式(逻辑与物理分页)及缓存机制。同时讲解了执行器类型与批量操作优化策略,助力高效开发。

1.前言
mybatis官网Java-api地址:https://mybatis.org/mybatis-3/zh/java-api.html

2.常见配置
如果一个属性不止在一个地方进行配置,那么mybatis将按照下面顺序进行加载
首先读取properties元素体内的属性
然后根据properties元素中的resource属性读取类路径下属性文件,或根据url属性指定的路径读取属性文件,并覆盖之前读取过的同名属性
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性
因此,优先级顺序:方法参数传递的属性>resource/url属性中配置>properties元素中指定属性
2.1 几个常见配置属性

设置名

描述

有效值

默认值

cacheEnabled

全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。

true | false

true

lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。

true | false

false

useGeneratedKeys

允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。

true | false

False

defaultExecutorType

配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。

SIMPLE REUSE
BATCH

SIMPLE

localCacheScope

MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。

SESSION STATEMENT

SESSION

proxyFactory

指定 Mybatis 创建可延迟加载对象所用到的代理工具。

CGLIB | JAVASSIST

JAVASSIST (3.3 以上)

2.2 多环境配置

多个数据源,就创建多个SqlSessionFactory,每个对应一个数据库

为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:


如果忽略了环境参数,那么将会加载默认环境,如下所示:


environments 元素定义了如何配置环境:
几个关键点:
默认使用的环境 ID(比如:default="development")。
每个 environment 元素定义的环境 ID(比如:id="development")。
事务管理器的配置(比如:type="JDBC")。
数据源的配置(比如:type="POOLED")。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。
2.3 事务管理
2.3.1 JDBC
这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域
2.3.2 MANAGED
它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
注意:
如果用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。这两种事务管理器类型都不需要设置任何属性。

3.XML(mapper)
3.1 一对一
定义一个一对一的Result,进行属性-字段之间的一对一关联映射即可,如果属性和字段是一致的,resultType实际也是可以的,resultMap更多是解决字段-属性不一致(满足驼峰命名就是一致),如id(属性)-USER_ID(字段)
3.2 一对多
设:一个用户对应多个角色
User类中添加List<Role>
一的mapper.xml中,resultMap添加<collection>标签.
如:
会得到类似这样的数据
3.3 多对一
设:一个作者可以有多个博客
Author类中添加Blog
一的mapper.xml中添加<association>
如:
或:
3.4 多对多
设:多个部门对应多个用户
定义一个第三方类,假设为UserForDept.java,属性private User user; private Dept dept;
User类中添加Set<Dept>(针对不同场合这里也可以List),mapper.xml中添加<collection>添加UsersForDept
Dept类中添加Set<User>(针对不同场合这里也可以List),mapper.xml中添加<collection>添加UsersForDept
4.分页
4.1 自带rowbound分页
先将所有的结果集查询出来ResultSet,再进行内存分页(limit)
4.2 第三方插件pagehelper
会将一个查询SQL变成两部分执行,假设SQL是:select name from user;
①自动识别数据库类型,添加对应的分页关键字,如MySQL则limit,Oracle则rownum,DB2则fetch,查找出上面SQL的结果
②查找出上面结果,查询结果的总条数count
4.3 SQL分页
依赖limit进行实现,或者rownum等自身的SQL实现
4.4 数组分页

简而言之:查全部再subList

首先在dao层,创建StudentMapper接口,用于对数据库的操作。在接口中定义通过数组分页的查询方法,如下所示:

方法很简单,就是获取所有的数据,通过list接收后进行分页操作。创建StudentMapper.xml文件,编写查询的sql语句:

可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。接下来在service层获取数据并且进行分页实现:
定义IStuService接口,并且定义分页方法:

通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。
创建IStuService接口实现类StuServiceIml对方法实现,对获取到的数组通过currPage和pageSize进行分页:


通过subList方法,获取到两个索引间的所有数据。
最后在controller中创建测试方法:

@ResponseBody    

@RequestMapping("/student/array/{currPage}/{pageSize}")

public List<Student> getStudentByArray(@PathVariable("currPage") int currPage, @PathVariable("pageSize") int pageSize) {

List<Student> student = StuServiceIml.queryStudentsByArray(currPage, pageSize);

return student;

}



通过用户传入的currPage和pageSize获取指定数据。
4.5 拦截器分页
自定义拦截器实现了拦截所有以ByPage【或自己约束的都是可以的】结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句。
4.6 总结
逻辑分页:即内存分页,就是mybatis自带的rowbounds,内存开销大,数据量小效率比物理分页快,但大数据量,易内存溢出
物理分页:上述2345,小数据量效率比逻辑分页慢,但是大数据量推荐用物理分页。
物理分页总是优先于逻辑分页。
5.缓存
5.1 一级缓存
5.2 二级缓存
6.执行器
6.1 SimpleExecutor
每执行一次update/select,就开启一个Statement对象,用完立刻关闭Statement对象
6.2 ReuseExecutor
执行update/select,以SQL为key查找Statement对象,存在就使用,不存在则创建,用完后不关闭Satementer而是放置在Map中,以便下次使用。简而言之就是重复使用Statement对象。
6.3 BatchExecutor
执行update(没有select,JDBC批处理不支持select),将所有的SQL添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()后等待注意执行executeBatch()批处理,与JDBC批处理一样。


7.insert/update实现源码
8.批量操作源码
9.优化


相关文章
|
22小时前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,提升日志分析效率与治理能力。
如何做好SQL质量监控
|
1天前
|
Java 数据库连接 调度
xxljob执行源码分析
本文深入解析XXL-JOB源码,涵盖架构设计、核心执行流程与关键线程机制。包括任务调度、快慢线程池分离、注册与心跳检测、失败重试告警、日志清理及时间轮原理,结合图文详解各组件实现逻辑,助你全面掌握分布式任务调度底层机制。
 xxljob执行源码分析
|
1天前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的部署与使用,涵盖源码获取、服务端数据库初始化、配置启动、客户端注册及定时任务测试全过程,助您快速搭建并运行调度系统。
6.Watcher机制(三)之ZooKeeper
本文深入分析ZooKeeper类的源码,重点解析其内部类结构、核心属性与构造函数,并详细探讨create、delete、multi、exists等核心方法的同步与异步实现机制,揭示其基于Watcher机制的事件注册与客户端通信原理。
 6.Watcher机制(三)之ZooKeeper
4.Watcher机制(一)
本文深入分析Zookeeper的Watcher机制,涵盖核心类与源码实现。重点解析Watcher、Event、KeeperState、EventType等接口与枚举,梳理ZKWatchManager对事件的管理及通知流程,帮助理解Zookeeper的监听机制工作原理。
|
1天前
|
存储 算法 API
2.持久化FileTxnLog
本文深入分析Zookeeper持久化核心源码,重点解析TxnLog与FileTxnLog实现机制,涵盖事务日志追加、校验、读取、提交及截断等关键流程,揭示其数据存储与一致性保障原理。
 2.持久化FileTxnLog
|
1天前
|
存储
1.序列化
该文章内容丰富且详细
 1.序列化
|
1天前
|
存储 关系型数据库 调度
|
1天前
|
缓存 NoSQL 关系型数据库
微服务原理篇(Canal-Redis)
该文章内容详细且实用
 微服务原理篇(Canal-Redis)
|
1天前
|
负载均衡 Java Nacos
微服务网关与配置中心
本文介绍了基于Spring Cloud Gateway实现微服务网关的完整流程,涵盖路由转发、负载均衡、全局过滤器与身份校验、用户信息传递及配置中心Nacos的集成。通过自定义GlobalFilter实现JWT鉴权,并利用ThreadLocal在微服务间透传用户信息;针对Feign调用场景,设计无状态内部接口以提升通用性;最后通过Nacos统一管理各服务配置文件,支持热更新,实现配置集中化与动态化管理。
 微服务网关与配置中心