Spring全家桶学习笔记

JDBC 必知必会

SpringBoot 单数据源配置

SpringBoot 多数据源配置

数据库连接池 HikariCP 官网

  1. SpringBoot 2.x 默认的数据库连接池
  2. SpringBoot 1.x 默认数据库连接池使用 Tomcat 连接池
    • 使用需要移除 tomcat-jdbc 依赖
    • 配置 spirng.datasource.type=com.zaxxer.hikari.HikariDataSource
  3. 特点
    • 代码量少(很多方法通过 JavaAssist 生成)
    • 速度快 (大量小的改进,如用 FastStatementList 代替 ArrayList, 无锁集合 ConcurrentBag, 代理类的优化)
    • 口碑好
    • 稳定性好
    • 可靠性好

数据库连接池 Alibaba Druid

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强⼤的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置 Logging能诊断Hack应⽤行为。

  1. 经过阿里巴巴各大系统的考验,值得信赖
  2. 实用的功能
    • 详细的监控(真的是全面)
    • ExceptionSorter,针对主流据库的返回码都有支持
    • SQL 防注⼊
    • 内置加密配置
    • 众多扩展点,⽅便进行定制
  3. 通过 druid-spring-boot-starter 引入

Spring JDBC 访问数据库

  1. spring-jdbc
    • core,JdbcTemplate 等相关核⼼接⼝和类
    • datasource,数据源相关的辅助类
    • object,将基本的 JDBC 操作封装成对象
    • support,错误码等其他辅助工具
  2. 使用 JdbcTemplate 简单操作
    • query
    • queryForObject
    • queryForList
    • update
    • execute

Spring 的事务抽象

  1. 优点
    • 一致的事务模型,为不同的事务API提供一致的事务模型,如:Hibernate, JDBC, Mybatis, JTA
    • 提供比大多数事务API更简单的,易于使用的编程式事务管理API
    • 支持Spring声明式事务管理
    • 整合Spring数据访问抽象
  2. 事务抽象的核心接口

    • 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
  3. 事务传播特性
传播性 描述
PROPAGATION_REQUIRED 0 当前有事务就用当前的,没有就用新的
PROPAGATION_SUPPORTS 1 事务可有可无,不是必须的
PROPAGATION_MANDATORY 2 当前⼀定要有事务,不然就抛异常
PROPAGATION_REQUIRES_NEW 3 ⽆论是否有事务,都起个新的事务
PROPAGATION_NOT_SUPPORTED 4 不⽀持事务,按非事务⽅式运行
PROPAGATION_NEVER 5 不支持事务,如果有事务则抛异常
PROPAGATION_NESTED 6 当前有事务就在当前事务里再起一个事务
  1. 事务隔离特性
隔离性 脏读 不可重复读 幻读
ISOLATION_READ_UNCOMMITTED 1
ISOLATION_READ_COMMITTED 2
ISOLATION_REPEATABLE_READ 3
ISOLATION_SERIALIZABLE 4

编程式事务

  1. 使用 TransactionTemplate
    • public T execute(TransactionCallback action) throws TransactionException;
    • 有返回值传入 TransactionCallback
    • 无返回值传入 TransactionCallbackWithoutResult
    • 可通过 PlatformTransactionManager 和 TransactionDefinition 进行定义

声明式事务

  1. 开启事务注解的方式
    • @EnableTransactionManagement
    • <tx:annotation-driven/>
  2. 通过 @Transactional 添加事务
    • transactionManager
    • propagation
    • isolation
    • timeout
    • readOnly
    • 怎么判断回滚

JDBC 异常抽象

  1. Spring 会将数据操作的异常转换为 DataAccessException,无论使⽤何种数据访问方式,都能使⽤⼀样的异常
  2. 通过 SQLErrorCodeSQLExceptionTranslator 解析错误码
  3. ErrorCode 定义
    • org/springframework/jdbc/support/sql-error-codes.xml
    • Classpath 下的 sql-error-codes.xml 可定制错误码解析逻辑

O/R Mapping 实践

Java Persistence API

JPA 为对象关系映射提供了一种基于 POJO 的持久化模型

  1. 简化数据持久化代码的开发⼯作
  2. 为 Java 社区屏蔽不同持久化 API 的差异

Spring Data

  1. 在保留留底层存储特性的同时,提供相对⼀一致的、基于 Spring 的编程模型
  2. 主要模块
    • Spring Data Commons
    • Spring Data JDBC
    • Spring Data JPA
    • Sprng Data Redis

Hiberate

  1. ⼀款开源的对象关系映射(Object / Relational Mapping)框架
  2. 将开发者从 95% 的常⻅数据持久化工作中解放出来
  3. 屏蔽了底层数据库的各种细节

Mybatis

  1. ⼀款优秀的持久层框架
  2. 支持定制化 SQL、存储过程和高级映射
  3. 让 Mybatis 更好用的工具
    • MyBatis Generator 代码生成器
    • MyBatis PageHelper 分页工具,支持多种数据库,多种分页方式

Spring 缓存抽象

为不同的缓存提供⼀层抽象

  1. 为 Java ⽅法增加缓存,缓存执行结果
  2. 支持ConcurrentMap、EhCache、Caffeine、Redis 等
  3. 接⼝
    • org.springframework.cache.Cache
    • org.springframework.cache.CacheManager
  4. 基于注解缓存
    • @EnableCaching 开启缓存支持
    • @Cacheable 执行前判断是否存在缓存,不存在执行方法,缓存该方法返回值;存在直接返回缓存中的数据
    • @CacheEvict 清空缓存
    • @CachePut 执行前不判断是否存在缓存,每次都执行方法,缓存该方法返回值;
    • @Caching 组合
    • @CacheConfig 设置缓存名称