第六章 SpringBoot 数据访问
1 SQL
1.1 数据源的自动配置-HikariDataSource
1.1.1 导入JDBC场景
引入了Hikari数据源、jdbc、事务,但是没有导入驱动
org.springframework.boot
spring-boot-starter-data-jdbc
1.1.2 导入驱动
默认版本:8.0.22
修改版本:
1、直接依赖引入具体版本(maven的就近依赖原则)
mysql
mysql-connector-java
5.1.49
2、重新声明版本(maven的属性的就近优先原则)
1.8
5.1.49
1.2 分析自动配置
1.2.1 自动配置类
-
DataSourceAutoConfiguration:数据源的自动配置
-
修改数据源相关的配置:spring.datasource
-
底层配置好的数据库连接池:HikariDataSource
-
容器中没有配置数据库连接池,DataSource才会自动配置
@Configuration(proxyBeanMethods = false) @Conditional(PooledDataSourceCondition.class) @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class }) protected static class PooledDataSourceConfiguration
-
DataSourceTransactionManagerAutoConfiguration:事务管理的自动配置
-
JdbcTemplateAutoConfiguration:JdbcTemplate的自动配置,可以来对数据库进行crud
- 可以修改这个配置项@ConfigurationProperties(prefix = "spring.jdbc") 来修改JdbcTemplate
- 容器中有JdbcTemplate这个组件
-
JndiDataSourceAutoConfiguration:jndi的自动配置
-
XADataSourceAutoConfiguration:分布式事务相关的
-
1.3 修改配置项
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
1.4 测试
@Slf4j
@SpringBootTest
class Boot05WebAdminApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from account_tbl", Long.class);
log.info("记录总数:{}",aLong);
}
}
2 使用Druid数据源
https://github.com/alibaba/druid
整合第三方技术的两种方式
- 自定义
- 找starter
2.1 自定义
? 略过
2.2 使用官方starter
2.2.1 引入druid-starter
com.alibaba
druid-spring-boot-starter
1.1.17
2.2.2 分析自动配置
- 扩展配置项spring.datasource.druid
- DruidSpringAopConfiguration.class:监控SpringBean的,配置项spring.datasource.druid.aop-patterns
- DruidStatViewServletConfiguration.class:监控页的配置,配置项spring.datasource.druid.stat-view-servlet默认开启
- DruidWebStatFilterConfiguration.class:web监控配置,配置项spring.datasource.druid.web-stat-filter默认开启
- DruidFilterConfiguration.class:所有Druid自己filter的配置
private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
2.2.3 配置示例
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.test.admin.* #监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet: # 配置监控页功能
enabled: true
login-username: admin
login-password: admin
resetEnable: false
web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat: # 对上面filters里面的stat的详细配置
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
3 整合Mybatis操作
https://github.com/mybatis
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
3.1 配置模式
- 全局配置文件
- 自动配置SqlSessionFactory
- 自动配置SqlSessionTemplate,组合了SqlSession
- @Import(AutoConfiguredMapperScannerRegistrar.class)
- @Mapper:只要我们写的操作MyBatis的接口标注了@Mapper 就会被自动扫描进来
@EnableConfigurationProperties(MybatisProperties.class) : MyBatis配置项绑定类。
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration{}
@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties
修改mybatis配置
# 配置mybatis规则
mybatis:
config-location: classpath:mybatis/mybatis-config.xml #全局配置文件位置
mapper-locations: classpath:mybatis/mapper/*.xml #sql映射文件位置
Mapper接口--->绑定Xml
<?xml version="1.0" encoding="UTF-8" ?>
总结
-
导入mybatis官方starter
-
编写mapper接口,使用@Mapper注解
-
编写sql映射文件并绑定mapper接口
-
在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息
补充
- 可以在配置类上标注@MapperScan,来代替每个接口文件中标注@Mapper
- 相比使用mybatis.config-location表示全局配置文件,更推荐在yaml中使用mybatis.configuration配置mybatis
3.2 注解模式
@Mapper
public interface CityMapper {
@Select("select * from city where id=#{id}")
public City getById(Long id);
public void insert(City city);
}
3.3 混合模式
简单的语句使用注解,复杂的语句使用mapper.xml
最佳实战
- 引入mybatis-starter
- 配置application.yaml中,指定mapper-location位置即可
- 编写Mapper接口并标注@Mapper注解
- 简单方法直接注解方式
- 复杂方法编写mapper.xml进行绑定映射
- @MapperScan("com.test.admin.mapper") 简化,其他的接口就可以不用标注@Mapper注解
4 整合 MyBatis-Plus操作
4.1 什么是MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
建议安装 MybatisX 插件 。
4.2 整合Mybatis-Plus
com.baomidou
mybatis-plus-boot-starter
3.4.1
4.2.1 自动配置
-
MybatisPlusAutoConfiguration 配置类,MybatisPlusProperties 配置项绑定。
mybatis-plus:xxx 就是对mybatis-plus的定制
-
SqlSessionFactory 自动配置好,底层是容器中默认的数据源
-
mapperLocations 自动配置好的,有默认值,classpath:/mapper/**/.xml。任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。建议以后sql映射文件,放在 mapper下
-
容器中也自动配置好了 SqlSessionTemplate
-
@Mapper 标注的接口也会被自动扫描
-
@MapperScan("com.test.mapper") 批量扫描
4.2.2 优点
只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力。
4.3 CRUD
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
}
public interface UserService extends IService {
}
5 NoSQL
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
5.1 Redis自动配置
org.springframework.boot
spring-boot-starter-data-redis
自动配置
-
RedisAutoConfiguration 自动配置类,RedisProperties 属性类
spring.redis.xxx是对redis的配置
-
连接工厂是准备好的。LettuceConnectionConfiguration、JedisConnectionConfiguration
-
自动注入了RedisTemplate
-
自动注入了StringRedisTemplate;k:v都是String
-
底层只要我们使用 StringRedisTemplate、RedisTemplate就可以操作redis
5.2 RedisTemplate与Lettuce
@Test
void test(){
ValueOperations operations = redisTemplate.opsForValue();
operations.set("hello","world");
String hello = operations.get("hello");
System.out.println(hello);
}
5.3 切换至jedis
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
spring:
redis:
host: r.redis.rds.aliyuncs.com
port: 6379
password: xxx:xxxxxx
client-type: jedis
jedis:
pool:
max-active: 10