SpringBoot的数据处理
- 在数据访问层,无论SQL还是NOSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理.添加大量自动配置,屏蔽很多设置.
- 引入xxxTemplate,xxxRepository来简化我们对数据的访问操作
JDBC
-
引入starter
spring-boot-starter-jdbc
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置application.yml
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.32.251:3306/jdbc
driver-class-name: com.mysql.cj.jdbc.Driver
- 默认使用org.apache.tomcat.jdbc.pool.DataSource作为数据源
- 数据源的相关配置都在DataSourceProperties里面
-
自动配置原理
org.springframework.boot.autoconfigure.jdbc
1.DataSourceConfiguration,根据配置创建数据源,默认使用tomcat连接池,可以使用spring.datasource.type指定自定义的数据源类型
2.SpringBoot默认支持:org.apache.tomcat.jdbc.pool.DataSource,HikaraDataSource,org.apache.commons.dbcp.BasicDataSource,org.apache.commons.dbcp2.BasicDataSource
3.自定义数据源类型
@Configuration
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"}
)
static class Generic {
Generic() {
}
@Bean
public DataSource dataSource(DataSourceProperties properties) {
// 使用DataSourceBuilder创建数据源,利用反射创建相应type的数据源,并且绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
4.DataSourceInitializerInvoker继承自ApplicationListener :
作用:
4.1:创建建表语句
4.2:运行插入数据的语句sql语句
默认只需要将文件命名为:
schema-*.sql data-*.sql
建表语句默认规则:schema.sql, schema-all.sql
可以指定位置,这样就不需要使用文件命名规则也可以运行
schema:
- classpath:department.sql
5.操作数据库
SpringBoot自动配置了JdbcTemplate操作数据库
-
高级配置:使用druid数据源
1.引入druid依赖
2.配置属性 - 配置druid数据源监控
/**
* @Description :Druid配置类,整合Druid数据源
* @Author :Chova
* @Date :Created 10:21 2019/8/9
*/
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
// 配置druid监控
// 1.配置后台管理Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initParameters=new HashMap<>();
initParameters.put("loginUsername","admin");
initParameters.put("loginPassword","123456");
initParameters.put("allow",""); //默认允许所有访问
bean.setInitParameters(initParameters);
return bean;
}
// 2.配置一个filter
@Bean
public RegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams=new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
MyBatis
- 引入mybatis-starter
mybatis-spring-boot-starter
1.配置MyBatis数据源相关属性
2.给数据库建表
3.创建Java Bean - 注解模式
@Mapper
@Select
@Delete
@Insert
@Update
- 自定义MyBatis配置规则,给容器中添加一个ConfigurationCustomer
- 使用MapperScan批量扫描包下所有Mappper接口:
@MapperScan(value="com.web.springbootmybatis.mapper")
- 配置文件模式
mybatis
config-location: classpath:mybatis/mybatis-config.xml 指定全局配置文件位置
mapper-locations: classpath:mybatis/mapper.xml 指定sql映射文件位置
JPA(Java Persistence API)
- 引入spring-boot-starter-data-jpa
- 配置文件打印SQL语句
- 创建Entity标注JPA注解
- 创建Repository接口继承JpaRepository
Spring Data
- Spring Data是为了简化构建基于Spring框架应用的数据访问技术,包括非关系数据库,Map-Reduce框架,云数据服务;也包含对关系数据库的访问支持
-
特点:
1.Spring Data提供使用统一的API来对数据访问层进行操作,主要是通过Spring Data Commons项目来实现的.
2.Spring Data Commons使得在使用关系型数据库或非关系型数据库访问技术时都基于Spring提供的统一标准,包含CRUD,查询,排序和分页的相关操作 -
统一的Repository接口
1.Repository<T,ID extends Serializable>:统一接口
2.RevisionRepository<T,ID extends Serializable,N extends Number & Comparable<N>>:基于乐观锁机制
3.CrudRepository<T,ID extends Serializable>:基本CRUD操作
4.PagingAndSortingRepository<T,ID extends Serializable>:基本CRUD及分页 - 提供数据访问模板类 XXXTemplate:MongoTemplate,RedisTemplate
JPA与Spring Data
- JpaRepository基本功能:编写接口继承JpaRepository既有crud及分页基本功能
- 定义符合规范的方法命名:在接口中只需要声明符合规范的方法,即拥有对应的功能
- @Query 自定义查询,定制SQL
- Specification查询(Spring Data JPA支持JPA2.0得Criteria查询)
整合JPA
JPA 基于ORM(Object Relational Mapping)
1.编写一个实体类(bean)和数据表进行映射,并且配置好映射关系
// 使用JPA注解配置映射关系
@Entity // 标注类是一个实体类,即是和数据表映射类
@Table(name="tb_user") // @Table用来定义表的名称和index规则用来指定和哪个数据表对应.如果省略,则默认的表名就是user,即类名小写
public class User {
@Id // 表示这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //表示这是一个自增主键
private Integer id;
@Column(name="lastName",length = 100) // 表示这是对应数据表中的列,可以指定名称,字段长度
private String lastName;
@Column // 省略默认列名就是属性名
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2.编写一个Dao接口来操作实体类对应的数据表(Repository)
// 继承JpaRespository来完成对数据库的操作
public interface UserRepository extends JpaRepository<User,Integer> {
}
3.在application.yml中对JPA进行配置JpaRepository
spring:
datasource:
url: jdbc:mysql://192.168.32.228/jpa
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
# 更新或者创建数据表结构
ddl-auto: update
# 在控制台显示sql
show-sql: true