标签: Mybatis
SpringBoot MyBatis 批量
开发过程中经常会出现批量写入数据库的操作,特别是后台系统,在导入数据的场景下会对表性能造成一定影响。
Mybatis-ONE-SQL
SQL插入主要使用INSERT语句,有两种常见的用法。
逐条插入
- 如果插入的记录过多,比如大于20条记录,性能损耗非常严重。
INSERT INTO `table_data` ('field1','field2') VALUES ('data1','data2');
SpringBoot MyBatis
数据审计
部分业务需要记录用户对操作行为,如果给每张表都做一个记录表,感觉冗余数据太多了。所以采用审计表存储相关日志信息。
实现方案
基于Spring Aop 织入方式对关键方法进行拦截,也可以通过方法进行拦截。
- 基于注解,在方法上织入。
- 基于普通方法,在业务逻辑中进行调用。
- 批量写入、延时写入数据库可能会出现短时间部分数据的丢失,但是频繁写入会导致Mysql资源占用过多。
- 使用java.util.concurrent.ConcurrentLinkedQueue 作为消费列队。每次最多消费消费10条日志记录批量写入数据库。
- 在审计信息中添加业务执行链路标识、执行用户标识。方便排查问题。
- 基于MDC记录链路标识。
SpringBoot MyBatis 雪花算法
Mybatis使用Snowflake生成主键


- 在某些业务中为了安全已经扩展性需要弃用mysql自增id。采用Snowflake生成方式。
- 全局唯一性,不能出现重复的id。
- 趋势递增,MysqlInnoDB引擎使用的是是聚集索引,使用B-tree的数据结构来存储索引数据。尽量使用有序的主键保证写入性能。
- 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、排序等特殊需求。
- id是无序的,连续的id容易被社会工程。
SpringBoot MyBatis 分析
日常开发中,需要对sql进行。为了提高效率,曾经使用mybatis扩展输出查询计划。
慢SQL
从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时间的语句,它带来的影响也比较恶劣,首先是执行时间过长影响数据的返回速度,其次,慢sql的长时间执行也会消耗和占用mysql的系统资源,影响其他的sql语句执行,过多的慢sql极其影响性能,如果系统流量或者并发量较大的情况下,过多的执行慢sql很有可能造成mysql的死锁以致于mysql服务无法正常使用。
SpringBoot 动态数据源
在对老系统进行saas改造的时候,在项目初期使用了动态数据源的方式处理业务。
- 本文内容仅针对数据存储方案。
动态数据源
**SaaS是Software-as-a-service(软件即服务)**它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器
①独立性:每个租户的系统相互独立。
②平台性:所有租户归平台统一管理。
③隔离性:每个租户的数据相互隔离。
Java MyBatis JUnit4
mybatis小试牛刀 在此基础上添加log日志。
-
官方文档 : http://www.mybatis.org/mybatis-3/zh/logging.html
-
项目地址 : mybatis-learning-02
MyBatis 源码环境搭建
mybatis学习笔记。
0x00 阅读源代码
下载源代码
- 代码仓库地址 https://github.com/mybatis/mybatis-3.git
- 阅读版本号
myabtis-3.5.0 - 下载版本
git clone -b mybatis-3.5.0 https://github.com/mybatis/mybatis-3.git- 由于github下载速度是在太慢了,这里用gitee克隆一个镜像。
- 下载版本
git clone -b mybatis-3.5.0 https://gitee.com/Z201/mybatis-3.git
Java MyBatis H2 JUnit4
Java MyBatis
本章是整理知识内容,为强化知识长期更新。
整体架构

基础层
处理层
接口层
Mybatis执行流程
- 获取sqlSessionFactory对象:解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;注意:MappedStatement:代表一个增删改查的详细信息。
- 获取sqlSession对象,返回一个DefaultSQlSession对象,包含Executor和Configuration;这一步会创建Executor对象;
- 获取接口的代理对象(MapperProxy),getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象。