JDBC 必知必会
SpringBoot 单数据源配置
SpringBoot 多数据源配置
数据库连接池 HikariCP 官网
- SpringBoot 2.x 默认的数据库连接池
- SpringBoot 1.x 默认数据库连接池使用 Tomcat 连接池
- 使用需要移除 tomcat-jdbc 依赖
- 配置 spirng.datasource.type=com.zaxxer.hikari.HikariDataSource
- 特点
- 代码量少(很多方法通过 JavaAssist 生成)
- 速度快 (大量小的改进,如用 FastStatementList 代替 ArrayList, 无锁集合 ConcurrentBag, 代理类的优化)
- 口碑好
- 稳定性好
- 可靠性好
数据库连接池 Alibaba Druid
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强⼤的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置 Logging能诊断Hack应⽤行为。
- 经过阿里巴巴各大系统的考验,值得信赖
- 实用的功能
- 详细的监控(真的是全面)
- ExceptionSorter,针对主流据库的返回码都有支持
- SQL 防注⼊
- 内置加密配置
- 众多扩展点,⽅便进行定制
- 通过 druid-spring-boot-starter 引入
Spring JDBC 访问数据库
- spring-jdbc
- core,JdbcTemplate 等相关核⼼接⼝和类
- datasource,数据源相关的辅助类
- object,将基本的 JDBC 操作封装成对象
- support,错误码等其他辅助工具
- 使用 JdbcTemplate 简单操作
- query
- queryForObject
- queryForList
- update
- execute
Spring 的事务抽象
- 优点
- 一致的事务模型,为不同的事务API提供一致的事务模型,如:Hibernate, JDBC, Mybatis, JTA
- 提供比大多数事务API更简单的,易于使用的编程式事务管理API
- 支持Spring声明式事务管理
- 整合Spring数据访问抽象
事务抽象的核心接口
PlatformTransactionManager
1
2
3
4// 核心方法
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;TransactionDefinition
- Propagation
- Isolation
- Timeout
- Read-only status
- 事务传播特性
| 传播性 | 值 | 描述 |
|---|---|---|
| PROPAGATION_REQUIRED | 0 | 当前有事务就用当前的,没有就用新的 |
| PROPAGATION_SUPPORTS | 1 | 事务可有可无,不是必须的 |
| PROPAGATION_MANDATORY | 2 | 当前⼀定要有事务,不然就抛异常 |
| PROPAGATION_REQUIRES_NEW | 3 | ⽆论是否有事务,都起个新的事务 |
| PROPAGATION_NOT_SUPPORTED | 4 | 不⽀持事务,按非事务⽅式运行 |
| PROPAGATION_NEVER | 5 | 不支持事务,如果有事务则抛异常 |
| PROPAGATION_NESTED | 6 | 当前有事务就在当前事务里再起一个事务 |
- 事务隔离特性
| 隔离性 | 值 | 脏读 | 不可重复读 | 幻读 | ||
|---|---|---|---|---|---|---|
| ISOLATION_READ_UNCOMMITTED | 1 | ✅ | ✅ | ✅ | ||
| ISOLATION_READ_COMMITTED | 2 | ❌ | ✅ | ✅ | ||
| ISOLATION_REPEATABLE_READ | 3 | ❌ | ❌ | ✅ | ||
| ISOLATION_SERIALIZABLE | 4 | ❌ | ❌ | ❌ | ||
编程式事务
- 使用 TransactionTemplate
- public
T execute(TransactionCallback action) throws TransactionException; - 有返回值传入 TransactionCallback
- 无返回值传入 TransactionCallbackWithoutResult
- 可通过 PlatformTransactionManager 和 TransactionDefinition 进行定义
- public
声明式事务

- 开启事务注解的方式
- @EnableTransactionManagement
<tx:annotation-driven/>
- 通过 @Transactional 添加事务
- transactionManager
- propagation
- isolation
- timeout
- readOnly
- 怎么判断回滚
JDBC 异常抽象
- Spring 会将数据操作的异常转换为 DataAccessException,无论使⽤何种数据访问方式,都能使⽤⼀样的异常
- 通过 SQLErrorCodeSQLExceptionTranslator 解析错误码
- ErrorCode 定义
- org/springframework/jdbc/support/sql-error-codes.xml
- Classpath 下的 sql-error-codes.xml 可定制错误码解析逻辑
O/R Mapping 实践
Java Persistence API
JPA 为对象关系映射提供了一种基于 POJO 的持久化模型
- 简化数据持久化代码的开发⼯作
- 为 Java 社区屏蔽不同持久化 API 的差异
Spring Data
- 在保留留底层存储特性的同时,提供相对⼀一致的、基于 Spring 的编程模型
- 主要模块
- Spring Data Commons
- Spring Data JDBC
- Spring Data JPA
- Sprng Data Redis
…
Hiberate
- ⼀款开源的对象关系映射(Object / Relational Mapping)框架
- 将开发者从 95% 的常⻅数据持久化工作中解放出来
- 屏蔽了底层数据库的各种细节
Mybatis
- ⼀款优秀的持久层框架
- 支持定制化 SQL、存储过程和高级映射
- 让 Mybatis 更好用的工具
- MyBatis Generator 代码生成器
- MyBatis PageHelper 分页工具,支持多种数据库,多种分页方式
Spring 缓存抽象
为不同的缓存提供⼀层抽象
- 为 Java ⽅法增加缓存,缓存执行结果
- 支持ConcurrentMap、EhCache、Caffeine、Redis 等
- 接⼝
- org.springframework.cache.Cache
- org.springframework.cache.CacheManager
- 基于注解缓存
- @EnableCaching 开启缓存支持
- @Cacheable 执行前判断是否存在缓存,不存在执行方法,缓存该方法返回值;存在直接返回缓存中的数据
- @CacheEvict 清空缓存
- @CachePut 执行前不判断是否存在缓存,每次都执行方法,缓存该方法返回值;
- @Caching 组合
- @CacheConfig 设置缓存名称