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
在这里插入图片描述
测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值