1. 数据源的自动配置
1、导入 JDBC 场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
2、分析自动配置类
DataSourceAutoConfiguration
:数据源的自动配置- 修改数据源相关的配置:
spring.datasource
- 数据库连接池的配置,是自己容器中没有 DataSource 才自动配置的
- 底层配置好的连接池是:HikariDataSource
- 修改数据源相关的配置:
DataSourceTransactionManagerAutoConfiguration
:事务管理器的自动配置JdbcTemplateAutoConfiguration
:JdbcTemplate 的自动配置,可以对数据库进行 CRUD- 可以修改配置项
spring.jdbc
来修改 JdbcTemplate
- 可以修改配置项
JndiDataSourceAutoConfiguration
:jndi 的自动配置XADataSourceAutoConfiguration
:分布式事务相关的
3、修改配置项
spring:
datasource:
url: jdbc:mysql://localhost:3306/jdbc
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource # 默认就是这个数据源
driver-class-name: com.mysql.cj.jdbc.Driver # 驱动
jdbc:
template:
query-timeout: 3 # 单位:秒
4、测试
@SpringBootTest
class SpringbootWebAdminApplicationTests {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from users", Long.class);
System.out.println(aLong);
}
}
2. 使用 Druid 数据源
1、druid 官方 github 地址
整合第三方技术的两种方式
- 自定义
- 找 starter
2、自定义方式
-
引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.17</version> </dependency>
-
编写配置类
@Configuration public class DruidConfig { @Bean @ConfigurationProperties("spring.datasource") // 和配置文件中的属性绑定,避免重复写 setXXX() public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } }
-
测试
@SpringBootTest @Slf4j class SpringbootWebAdminApplicationTests { @Autowired DataSource dataSource; @Test void contextLoads() { log.info("数据源类型:{}",dataSource.getClass()); } }
-
结果
数据源类型:class com.alibaba.druid.pool.DruidDataSource
官方文档还介绍了其它功能如何配置
3、使用官方 starter 方式
-
引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
-
分析自动配置
扩展配置项:spring.datasource.druid
-
DruidSpringAopConfiguration
:监控 Spring Bean配置项:spring.datasource.druid.aop-patterns
-
DruidStatViewServletConfiguration
:监控页的配置配置项:spring.datasource.druid.stat-view-servlet,默认开启
-
DruidWebStatFilterConfiguration
:web 监控配置配置项:spring.datasource.druid.web-stat-filter,默认开启
-
DruidFilterConfiguration
:所有 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";
-
-
配置示例
spring: datasource: url: jdbc:mysql://localhost:3306/jdbc username: root password: root type: com.zaxxer.hikari.HikariDataSource # 默认就是这个数据源 driver-class-name: com.mysql.cj.jdbc.Driver # 驱动 druid: aop-patterns: com.ice.admin.* # 监控 Spring Bean 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
SpringBoot 配置示例:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
3. 整合 MyBatis
引入依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
-
全局配置文件
-
SqlSessionFactory
: 自动配置好了 -
SqlSession
:自动配置了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规则
mybatis:
config-location: classpath:mybatis/mybatis-config.xml # 全局配置文件位置
mapper-locations: classpath:mybatis/mapper/*.xml # sql映射文件位置
【Mapper.xml】
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.admin.mapper.AccountMapper">
<select id="getAcct" resultType="com.ice.admin.bean.User">
select * from users where id=#{id}
</select>
</mapper>
我们也可以不写全局配置文件,直接在用 SpringBoot 配置文件中配置
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
// ...
@NestedConfigurationProperty
private Configuration configuration;
// ....
}
可以看到,MyBatis 的配置都在 mybatis.configuration.xxx
,可以直接去 org.apache.ibatis.session.Configuration.java
中寻找属性名,在配置文件里设置覆盖.
# 配置mybatis规则
mybatis:
# 此时就不需要编写全局配置文件,也就不用配置 config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
简单的可以注解实现,复杂 SQL 用 mapper.xml
如果嫌每个接口标注
@Mapper
注解麻烦,可以在主启动类上标注@MapperScan("com.ice.admin.mapper")
4. 整合 MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生
建议安装 MybatisX 插件
引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
自动配置:
-
MybatisPlusAutoConfiguration
配置类,MybatisPlusProperties
配置项绑定.mybatis-plus:xxx 就是对 mybatis-plus 的定制
-
SqlSessionFactory
自动配置好,底层是容器中默认的数据源 -
mapperLocations
自动配置好的,有默认值classpath*:/mapper/**/*.xml
,任意包的类路径下的所有 mapper 文件夹下任意路径下的所有 xml 都是 sql 映射文件建议以后 sql 映射文件,放在 mapper 下
-
容器中也自动配置好了
SqlSessionTemplate
-
@Mapper
标注的接口也会被自动扫描,建议直接@MapperScan("com.atguigu.admin.mapper")
批量扫描就行