数据访问
SQL
1、自动配置数据库连接池
(1)带 data 的启动器,都与数据访问相关
(2)导入 JDBC 场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
(3)导入 MySQL 驱动,Spring Boot 有版本仲裁
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2、自动配置类
(1)DataSourceAutoConfiguration:数据库连接池的自动配置类
(2)修改数据库连接池相关的配置:spring.datasource
@EnableConfigurationProperties(DataSourceProperties.class)
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean
(3)容器中没有 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 {
}
(4)若导入 JDBC 启动器,配置的数据库连接池为:HikariDataSource
(5)根据 spring.datasource.type,动态判断,并创建数据库连接池
(6)DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置类
(7)JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置类,可对数据库进行 CRUD
(8)修改 JdbcTemplate 相关配置:spring.jdbc
@EnableConfigurationProperties(JdbcProperties.class)
@ConfigurationProperties(prefix = "spring.jdbc")
使用 Druid 数据库连接池
1、StatViewServlet
(1)用于展示 Druid 的统计信息
(2)提供监控信息展示的 html 页面
(3)提供监控信息的 JSON API
2、StatFilter
(1)用于统计监控信息
(2)如:SQL 监控、URI 监控
3、WebStatFilter:用于采集 web-jdbc 关联监控的数据
4、WallFilter:基于 SQL 语义分析,实现防御 SQL 注入攻击
5、自定义方式
(1)引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
(2)数据库连接池配置类
@Configuration
public class MyDataSourceConfig {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控、防火墙功能
druidDataSource.setFilters("stat, wall");
//省略其他配置
return druidDataSource;
}
//配置Druid监控页功能
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
//配置监控页面访问的用户名、密码
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","123456");
return registrationBean;
}
//配置WebStatFilter
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
6、启动器方式
(1)引入第三方依赖 Druid 启动器
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
(2)自动配置类:DruidDataSourceAutoConfigure
@Configuration
//所需要的类
@ConditionalOnClass(DruidDataSource.class)
//在DataSourceAutoConfiguration之前配置
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
//拓展配置项:spring.datasource.druid;原生配置项:spring.datasource
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({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配置
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
@Bean(initMethod = "init")
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
(3)application.ymal 配置示例
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_account
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: #监控指定包路径下的Spring组件
#开启功能,stat(SQL监控),wall(防火墙)
filters: stat,wall
#配置监控页功能
stat-view-servlet:
enabled: true
#访问用户名
login-username: admin
#访问密码
login-password: admin
#是否允许重置
resetEnable: false
#监控Web
web-stat-filter:
enabled: true
#监控路径
urlPattern: /*
#排除路径
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
#详细配置filters的stat、wall
filter:
stat:
#慢查询时间(毫秒)
slow-sql-millis: 1000
#是否记录慢查询
logSlowSql: true
enabled: true
wall:
enabled: true
config:
#拦截删除表的SQL
drop-table-allow: false
整合 MyBatis
1、引入第三方依赖 MyBatis 启动器
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
2、自动配置类:MybatisAutoConfiguration
(1)所需要的类
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
(2)容器有且只有一个 DataSource 实例时,才装配
@ConditionalOnSingleCandidate(DataSource.class)
(3)MyBatis 配置项绑定类:MybatisProperties
@EnableConfigurationProperties(MybatisProperties.class)
(4)配置项前缀:mybatis
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public static final String MYBATIS_PREFIX = "mybatis";
(5)自动配置 SqlSessionFactory
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
(6)自动配置 SqlSessionTemplate,组合 SqlSession
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
public class SqlSessionTemplate implements SqlSession, DisposableBean {
private final SqlSession sqlSessionProxy;
}
(7)Mapper 接口标注 @Mapper,该接口交给 Spring 进行管理,不需要创建 xml 映射文件
@Import(AutoConfiguredMapperScannerRegistrar.class)
3、application.yaml
(1)配置 MyBatis 规则(示例)
mybatis:
#全局配置文件位置
config-location: classpath:mybatis/mybatis-config.xml
#SQL映射文件位置
mapper-locations: classpath:mybatis/mapper/*.xml
(2)建议:使用配置项 mybatis:configuration: 修改全局配置文件的值,不需要额外创建 xml 文件,与 mybatis:config-location: 不能共存
4、编写 Mapper 接口,并标注 @Mapper
5、实现 SQL
(1)方法上标注 SQL 注解(建议)
(2)编写 mapper.xml,对方法进行绑定映射
(3)@MapperScan("指定包路径"),扫描指定包路径下的接口,可以不用标注 @Mapper
整合 MyBatis-Plus
1、引入第三方依赖 MyBatis-Plus 启动器
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
2、自动配置类:MybatisPlusAutoConfiguration
(1)MyBatis-Plus 配置项绑定类:MybatisPlusProperties
@EnableConfigurationProperties(MybatisPlusProperties.class)
(2)配置项前缀:mybatis-plus
@ConfigurationProperties(prefix = Constants.MYBATIS_PLUS)
String MYBATIS_PLUS = "mybatis-plus";
(3)自动配置 mapperLocations,任意包的类路径下,所有 mapper 文件夹下,任意路径下,所有 xml 都是 SQL 映射文件(建议:SQL 映射文件放在 mapper)
private String[] mapperLocations = new String[]{"classpath*:/mapper/**/*.xml"};
(4)自动配置 SqlSessionFactory,使用容器中的数据源
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
(5)自动配置 SqlSessionTemplate
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
(6)自动扫描标注 @Mapper 的接口,建议使用 @MapperScan
@Import(AutoConfiguredMapperScannerRegistrar.class)
NoSQL
1、引入 Redis 场景启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、自动配置类:RedisAutoConfiguration
(1)Redis 配置项绑定类:RedisProperties
@EnableConfigurationProperties(RedisProperties.class)
(2)配置项前缀:spring.redis
@ConfigurationProperties(prefix = "spring.redis")
(3)自动配置连接工厂:LettuceConnectionConfiguration、JedisConnectionConfiguration
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
LettuceConnectionFactory redisConnectionFactory(
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
ClientResources clientResources) {
LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,
getProperties().getLettuce().getPool());
return createLettuceConnectionFactory(clientConfig);
}
@Bean
JedisConnectionFactory redisConnectionFactory(
ObjectProvider<JedisClientConfigurationBuilderCustomizer> builderCustomizers) {
return createJedisConnectionFactory(builderCustomizers);
}
(4)自动注入 RedisTemplate<Object, Object>
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
(5)自动注入 StringRedisTemplate<String, String>
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战