SpringBoot——数据访问
对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合
Spring Data的方式进行统一处理,添加了大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。
- JDBC
- MyBatis
- JPA
官方并没有提及Mybatis的stater整合。
一、JDBC
1、引入依赖
spring-boot-starter-jdbc、mysql数据库驱动
2、配置application.yml
数据源的相关配置都在DataSourceProperties
里面,spring.dadasource
spring:
datasource:
username: root
password: mysql
url: jdbc:mysql://127.0.0.1/cash
driver-class-name: com.mysql.cj.jdbc.Driver
SpringBoot 2.4.0默认给我们配置的数据源为: class com.zaxxer.hikari.HikariDataSource,、有了数据源,然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用原生的JDBC 语句来操作数据库;
3、数据源的自动配置原理
org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
默认启用的数据源为:HikariDataSource
。
还支持:Oracle、dbcp2、org.apache.tomcat.jdbc.pool.DataSource
除了以上指定的数据源,如果我们引入了其它数据源,则springboot通过Generic来为指定数据源进行配置:
4、自动加载SQL语句
可以在容器启动的时候自动执行数据操纵语言DML,数据定义语言DDL。
下面介绍以下流程:
DataSourceInitializationConfiguration中整合了DataSourceInitializerInvoker,即将DataSourceInitillizerInvoker导入到容器中了。
运行建表DDL语句:
执行数据操纵语言DML:
Sql文件的命名默认规则:
schema-all.sql
(建表语句) or data-all.sql
(数据插入)
- 我们可以通过
spring.datasource.schema
指定sql建表文件名称。 - 可以通过
spring.datasource.data
指定sqlDML文件名称。 - 在springBoot2.4.0中,要指定初始化模式:
测试:
编写配置文件;
准备好建表语句:
启动程序:
建表成功
5、JdbcTemplate操作数据库
Spring 本身对原生的JDBC 做了轻量级的封装(了解),即 JdbcTemplate ,JdbcTemplate主要提供以下几类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update
方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;query
方法及queryForXXX方法:用于执行查询相关语句;- call方法:用于执行存储过程、函数相关语句。
@RestController
@RequestMapping("/jdbc")
public class JdbcController {
/**
* JdbcTemplate 会自己注入数据源,用于简化JDBC操作
* 还能避免一些常见的错误,使用起来也不用再自己来关闭数据库连接
*/
@Autowired
JdbcTemplate jdbcTemplate;
//List 中的1个Map 对应数据库的1行数据
//Map 中的key 对应数据库的字段名,value 对应数据库的字段值
@GetMapping("/list")
public List<Map<String, Object>> userList(){
String sql = "select * from employee";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
return maps;
}
}
二、整合Druid数据源
Druid 可以很好的 监控DB 池连接和SQL 的执行情况,天生就是针对监控而生的DB 连接池。
可以通过
spring.datasource.type: com.alibaba.druid.pool.DruidDataSource
指定数据源。切换成功,就可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数等设置项.
参考:com.alibaba.druid.pool.DruidDataSource 基本配置参数
1、数据库druid连接池配置
在application.yml
中进行配置。
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot?
serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: false
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
需要添加的依赖:
- 添加上Druid 数据源依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
2、让Druid 配置生效
将自定义的Druid数据源添加到容器中,不再让Spring Boot 自动创建。要让druid 数据源专有配置生效,需要绑定全局配置文件中的druid 数据源属性到
com.alibaba.druid.pool.DruidDataSource
。
注:
@ConfigurationProperties(prefix = "spring.datasource")
:作用就是将全局配置文件中前缀为spring.datasource
的属性值注入到
com.alibaba.druid.pool.DruidDataSource
的同名参数中
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
3、配置Druid监控
配置Druid 监控管理后台的Servlet(内置Servlet 容器时没有web.xml文件,所以使用Spring Boot 的注册Servlet 方式);
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new
StatViewServlet(), "/druid/*");
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
initParams.put("loginPassword", "123456"); //后台管理界面的登录密码
//后台允许谁可以访问
//initParams.put("allow", "localhost"):表示只有本机可以访问
//initParams.put("allow", ""):为空或者为null时,表示允许所有访问
initParams.put("allow", "");
//deny:Druid 后台拒绝谁访问
//initParams.put("kuang", "192.168.1.20");表示禁止此ip访问
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
这些配置参数可以在com.alibaba.druid.support.http.StatViewServlet的父类com.alibaba.druid.support.http.ResourceServlet
中找到:
4、配置Druid web 监控filter 过滤器
指定哪些请求不需要Druid进行监控。
注:
WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
bean.setInitParameters(initParams);
//"/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
配置完后可以访问http://localhost:8080/druid/login.html
查看监控信息
三、整合Mybatis
(1)导入 MyBatis 所需要的依赖
这是MyBatis为了适配SpringBoot而建立的starter.
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
(2)application.yml中配置数据库连接信息
参考上面的数据库配置
(3)创建实体类
(4)创建实体类对应的Mapper接口
- 接口上加入
@Repository
注解,将接口整合到spring中 @Mapper注解
:表明这是mybatis的mapper类- 也可以在启动类中标注
@MapperScan("com.glp.mapper")
来表明这是mybatis的mapper类,这个比较简便一些,不用在每个接口上都注明Mapper
(5)创建接口对应的Mapper映射文件
<?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.kuang.mapper.whatMapper">
<select id="getDepartments" resultType="Department">
select * from department;
</select>
</mapper>
namespace:指定接口全类名
(6)maven配置资源过滤问题
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
(7)SpringBoot中的Mybatis配置
#指定myBatisMapper映射文件所在位置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#指定Mybatis核心配置文件所在位置
mybatis.config-location=classpath:mybatis/mapper-config.xml
# 用对应实体类的路径可以给实体类起别名,别名默认为原名小写
mybatis.type-aliases-package=com.kuang.mybatis.pojo
(8)编写service层
(9)编写controller层
四、SpringData
SpringData的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。
1、SpringData特点
SpringData为我们提供使用统一的API来对数据访问层进行操作;这主要是Spring Data Commons项目来实现的。Spring Data Commons让我们在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准,标准包含了CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。
2、统一的Repository接口
Repository:统一接口(最顶层接口)
CrudRepository:基本CRUD操作
PagingAndSortingRepository:基本CRUD及分页
3、提供数据访问模板类xxxTemplate;
如:MongoTemplate、RedisTemplate等
4、SpringData JPA
JPA:用来简化关系型数据库的操作。
Hibernate、Toplink、OpenJPA都是基于JPA规范的实现。有了SpringData JPA就可以使用统一的接口对它们进行操作了。
操作流程:
(1)编写一个实体类(bean)和数据表进行映射,并且配置好映射关系。
程序启动后,就会根据表映射关系,自动创建数据表。
(2)编写一个Dao接口来操作实体类对应的数据表(Repository)
继承JpaRepository来完成对数据表的操作,其中User对应要操作的实体类,Integer对应自增主键的类型。
(3)基本的配置JpaProperties
ddl-auto:就是用来自动创建表及更新表的。
(4)Controller
测试结果: