Spring Boot与数据
SpringBoot 着眼于JavaEE! 不仅仅局限于 Mybatis 、JDBC、 Spring Data JPA
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问技术,包括非关系数据库、 Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持
对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种XXXTemplate, xxRespository来简化我们队数据库访问层的操作。对于我们来说只需要进行简单的设置即可。
• Spring Data 包含多个子项目:
– Spring Data Commons
– Spring Data JPA – Spring Data KeyValue
– Spring Data LDAP – Spring Data MongoDB
– Spring Data Gemfire – Spring Data REST
– Spring Data Redis
– Spring Data for Apache Cassandra
– Spring Data for Apache Solr
– Spring Data Couchbase (community module)
– Spring Data Elasticsearch (community module)
– Spring Data Neo4j (community module)
Spring Data是spring的一个子项目。
Spring Data里面又包含很多子项目
不仅仅可以访问关系型数据库,还有非关系型数据库
SpringData为我们提供使用统一的API来对数据访问层进行操作;这主要是Spring Data Commons项目来实现的。Spring Data Commons让我们在使用关系型或者非关系型数据访问 技术时都基于Spring提供的统一标准,标准包含了CRUD(创建、获取、更新、删除)、查询、 排序和分页的相关操作。
特点:
1)统一的Repository接口
Repository<T, ID extends Serializable>:统一接口
RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>>:基于乐观
锁机制
CrudRepository<T, ID extends Serializable>:基本CRUD操作
PagingAndSortingRepository<T, ID extends Serializable>:基本CRUD及分页
2)提供数据访问模板类xxTemplate
如 MongoTemplate RedisTemplate
3) JPA 与 Spring Data
1)、JpaRepository基本功能 编写接口继承JpaRepository既有crud及分页等基本功能
2)、定义符合规范的方法命名 在接口中只需要声明符合规范的方法,即拥有对应的功能
Spring Boot底层就是利用Spring Data进行数据库访问的默认处理方式。
导入场景的starters
整合基本JDBC与数据源
为了方便展示,同时引入了web模块
此时的项目pom文件:
<dependencies> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
如何配置才能跟数据库交互呢?
配置好yml:
spring:
datasource:
username: root
password: root
##配置好时区 MySQL默认的时区是UTC时区
url: jdbc:mysql://127.0.0.1:3306/book?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
测试类:
@RunWith(SpringRunner.class) @SpringBootTest public class DataApplicationTests { //注入数据源 @Autowired DataSource dataSource; @Test public void contextLoads() throws SQLException { System.out.println(dataSource.getClass()); //获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); } }
运行结果:
效果:
默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源;
数据源的相关配置都在DataSourceProperties里面;
自动配置原理:
org.springframework.boot.autoconfigure.jdbc:
1、参考DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以使用spring.datasource.type指定自定义的数据源类型; 比如经常用的C3P0
2、SpringBoot默认可以支持: org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、
3、自定义数据源类型 可以自定义数据源类型
/** * Generic DataSource configuration. */ @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type") static class Generic { @Bean public DataSource dataSource(DataSourceProperties properties) { //使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性 return properties.initializeDataSourceBuilder().build(); } }
4、DataSourceInitializer:ApplicationListener(就是个监听器)并且实现了InitializingBean接口
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
默认只需要将文件命名为:
schema‐*.sql、data‐*.sql
默认规则:schema.sql,schema‐all.sql;
可以使用
schema:
‐ classpath:department.sql
指定位置
5、操作数据库:自动配置了JdbcTemplate操作数据库
具体用法我就不冗余了,大家可以自行学习下。平时开发也基本用不到这个。
我们可以点开看下:
从自动配置的类中,找到jdbc
这里都是与数据源有关的配置:
包括数据源的配置
实际开发过程中一般使用阿里的druid数据源,包括了监控、安全等方案。开发一般用 比较多
整合步骤:
pom:
引入数据源
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency>
修改下配置就OK了:
spring:
datasource:
username: root
password: root
##配置好市区 MySQL默认的时区是UTC时区
url: jdbc:mysql://127.0.0.1:3306/book?serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
测试:
@RunWith(SpringRunner.class) @SpringBootTest public class DataApplicationTests { //注入数据源 @Autowired DataSource dataSource; @Test public void contextLoads() throws SQLException { System.out.println(dataSource.getClass()); //获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); } }
结果:
数据源除了基本配置还有各种属性配置的,可以参考官网
这个需要配置类的 (包含web监控)
@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> initParams = new HashMap<>(); initParams.put("loginUsername","admin"); initParams.put("loginPassword","123456"); initParams.put("allow","");//默认就是允许所有访问 initParams.put("deny","192.168.15.21"); bean.setInitParameters(initParams) return bean; } //2、配置一个web监控的filter @Bean public FilterRegistrationBean 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; } }
配置Druid的监控
配置一个管理后台的Servlet config里面配置,没有web.xml
配置一个监控的filter
详情请参考官网。
Spring Boot 整合 Mybatis
1、xml的MyBatis
2、注解的MyBatis
SpringBoot yml指定全局配置文件 和 sql映射配置文件位置就OK了
SpringBoot 整合JPA
Spring data的理想就是同意数据访问的API
JPA是操作关系型数据库的,Java持久层api