SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)

1.SpringBoot整合Druid

  Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0、DBCP、PROXOOL等DB池的优点,整合配置参考地址。Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据库连接池和SQL查询的工作情况(最牛X的地方就在与提供的日志监控功能)。在上一章中(SpringBoot整合JDBC,JPA)讲述到,Spring Boot底层都是采用Spring Data的方式进行统一处理,Spring Data中内置连接池数据源HikariDataSource。SpringBoot整合Druid实现数据源更换,则需要手动配置。

1.新建SpringBoot工程,引入依赖

  基础依赖:新建SpringBoot工程,建议引入以下基础依赖

  spring-boot-starter-parent(SpringBoot父工程)——必选
  spring-boot-starter(SpringBoot启动器)——必选
  spring-boot-devtools(SpringBoot热部署)——可选
  spring-boot-starter-web(SpringBoot整合WEB)——必选
  mysql-connector-java(MySQL驱动)——必选
  druid-spring-boot-starter(SpringBoot整合Druid)——必选
  spring-boot-starter-jdbc(SpringBoot整合JDBC)——必选
  spring-boot-starter-test(SpringBoot整合测试Junit)——默认必选
  spring-boot-maven-plugin(SpringBoot打包插件)——必选

  lombok(整合Lombok简化POJO开发)——可选

  spring-boot-configuration-processor(SpringBoot整合配置文件注入POJO)——可选
 1 <!-- MySQL驱动 -->
2 <dependency>
3 <groupId>mysql</groupId>
4 <artifactId>mysql-connector-java</artifactId>
5 <scope>runtime</scope>
6 </dependency>
7
8 <!-- SpringBoot整合Druid -->
9 <dependency>
10 <groupId>com.alibaba</groupId>
11 <artifactId>druid-spring-boot-starter</artifactId>
12 <version>1.1.22</version>
13 </dependency>

常见问题:整合如果没有引入spring-boot-starter-jdbc,会报错:.....ClassNotFoundException: org....jdbc....embedded.EmbeddedDatabaseType。

问题原因:Spring Boot底层都是采用Spring Data的方式进行统一处理。EmbeddedDatabaseType类在spring-boot-starter-jdbc依赖中。

依赖说明:SpringBoot属于Spring“全家桶”组件,Druid属于阿里巴巴旗下开发产品,所以SpringBoot整合Druid并不是由Spring组件提供依赖,而是由阿里巴巴提供。

2.修改yml配置文件,整合配置Druid

 1 spring:
2 datasource:
3 # 数据库访问配置, 使用druid数据源(默认数据源是HikariDataSource)
4 type: com.alibaba.druid.pool.DruidDataSource
5 #链接池配置
6 druid:
7 driver-class-name: com.mysql.cj.jdbc.Driver
8 url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
9 username: root
10 password: xsge
11
12 # 连接池配置:大小,最小,最大
13 initial-size: 5
14 min-idle: 5
15 max-active: 20
16
17 # 连接等待超时时间
18 max-wait: 30000
19
20 # 配置检测可以关闭的空闲连接,间隔时间
21 time-between-eviction-runs-millis: 60000
22
23 # 配置连接在池中的最小生存时间
24 min-evictable-idle-time-millis: 300000
25 # 检测连接是否有,有效得select语句
26 validation-query: select '1' from dual
27 # 申请连接的时候检测,如果空闲时间大于time-between-eviction-runs-millis,执行validationQuery检测连接是否有效,建议配置为true,不影响性能,并且保证安全性。
28 test-while-idle: true
29 # 申请连接时执行validationQuery检测连接是否有效,建议设置为false,不然会会降低性能
30 test-on-borrow: false
31 # 归还连接时执行validationQuery检测连接是否有效,建议设置为false,不然会会降低性能
32 test-on-return: false
33
34 # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
35 # 打开PSCache,并且指定每个连接上PSCache的大小
36 pool-prepared-statements: true
37 max-open-prepared-statements: 20
38 max-pool-prepared-statement-per-connection-size: 20
39
40 # 配置监控统计拦截的filters, 去掉后监控界面sql无法统计, 'wall'用于防火墙防御sql注入,stat监控统计,logback日志
41 filters: stat,wall
42 # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
43 #aop-patterns: com.springboot.servie.*
44 # lowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢
45 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
46
47 # WebStatFilter监控配置
48 web-stat-filter:
49 enabled: true
50 # 添加过滤规则:那些访问拦截统计
51 url-pattern: /*
52 # 忽略过滤的格式:哪些不拦截,不统计
53 exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
54
55 # StatViewServlet配置(Druid监控后台的Servlet映射配置,因为SpringBoot项目没有web.xml所在在这里使用配置文件设置)
56 stat-view-servlet:
57 enabled: true
58 # 配置Servlet的访问路径:访问路径为/druid/**时,跳转到StatViewServlet,会自动转到Druid监控后台
59 url-pattern: /druid/*
60 # 是否能够重置数据
61 reset-enable: false
62 # 设置监控后台的访问账户及密码
63 login-username: xsge
64 login-password: xsge
65 # IP白名单:允许哪些主机访问,默认为“”任何主机
66 # allow: 127.0.0.1
67 # IP黑名单:禁止IP访问,(共同存在时,deny优先于allow)
68 # deny: 192.168.1.218
69
70 # 配置StatFilter
71 filter:
72 stat:
73 log-slow-sql: true

上述配置不但配置了Druid作为连接池,而且还开启了Druid的监控功能。 其他配置可参考官方网站

3.启动项目运行测试

  启动SpringBoot主程序,启动后访问:http://localhost:8080/druid 会自动跳转至Druid后台监控登录页,输入自定义配置的账户/密码(xsge,xsge)即可登录查看详情。

  更多Druid问题需求说明,请参照Druid官网常见问题

2.SpringBoot整合MyBatis

1.概述

  实际项目中,在对数据库访问层对数据库进行操作时,大部分时候我们都用的MyBatis/Hibernate,所以SpringBoot整合MyBatis怎么说也算是必修课了!!!

2.准备工作

  1. 创建数据库。
  2. 新增对应数据库实体类。
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
    private Integer id;
    private String name;
    private String password;
    }
  3. 修改pom.xml引入依赖。
      以下依赖文件,并非整个项目中所有已包含的依赖,例如:热部署,Lombok等,由于代码长度问题,一些基本引用的依赖,我并没有写入,请另行参考博主其他SpringBoot整合文档,自行参考导入更多所需依赖。

      Spring家族的使命就是为了简化而生,但是随着Spring的发展壮大,有点事与愿违了。为了坚持初心,Spring家族祭出了一大杀器---Spring Boot。Spring Boot的核心理念是:不建议使用xml文件配置。但是,这对MyBatis来说进退两难,因为MyBatis离不开xml,需要xml来配置sql语句。为了迎合Spring Boot的发展理念,MyBatis官方开发了mybatis-spring-boot-starter

     1 <!-- MySQL驱动 -->
    2 <dependency>
    3 <groupId>mysql</groupId>
    4 <artifactId>mysql-connector-java</artifactId>
    5 <scope>runtime</scope>
    6 </dependency>
    7 <!-- SpringBoot整合MyBatis -->
    8 <dependency>
    9 <groupId>org.mybatis.spring.boot</groupId>
    10 <artifactId>mybatis-spring-boot-starter</artifactId>
    11 <version>2.0.1</version>
    12 </dependency>
    13 <!-- SpringBoot整合druid-spring-boot-starter -->
    14 <dependency>
    15 <groupId>com.alibaba</groupId>
    16 <artifactId>druid-spring-boot-starter</artifactId>
    17 <version>1.1.22</version>
    18 </dependency>
    19 <!-- SpringBoot整合JDBC -->
    20 <dependency>
    21 <groupId>org.springframework.boot</groupId>
    22 <artifactId>spring-boot-starter-jdbc</artifactId>
    23 </dependency>

    注意:SpringBoot引入MySQL驱动默认版本为8.x,可以手动配置版本。
    依赖说明:MyBatis属于独立框架,不属于Sprng组件,因此SpringBoot整合MyBatis的依赖由MyBatis提供。

    MyBatis整合SpringBoot的依赖版本,参考mybatis-spring-boot-starter官方说明文档

  4. 创建一个包含基本CRUD的PersonMapper
    1 public interface PersonMapper {
    2 int add(Person person);// 添加
    3 int update(Person person);// 修改
    4 int deleteById(Integer id);// 删除
    5 Person queryPersonById(Integer id);// 查询一个
    6 Person queryListPerson();// 查询所有
    7 }

3.SpringBoot整合MyBatis实现CURD

  整合MyBatis实现CURD,Mapper接口可以基于注解方式或XML方式。注解方式:代码更加精简,方便。XML配置方式:隔离sql和业务代码,清晰表达sql,尤其对于较长的sql而言。(Spring Boot不建议使用XML文件配置)

  1.Mapper接口基于注解方式实现CURD

  1. 修改Mapper接口,添加SQL注解
    此处仅列举两个案例,如需学习更多SQL注解,请关注博主MyBatis文章。

     1 public interface PersonMapper {
    2 @Insert("INSERT INTO person(name,password) values(#{name},#{password})")
    3 int add(Person person);// 添加
    4 @Select("SELECT * FROM person WHERE id=#{id}")
    5 Person queryPersonById(Integer id);// 查询一个
    6
    7 // 下面的两个将用于练习基于XML配置文件方式
    8 int update(Person person);// 修改
    9 List<Person> queryListPerson();// 查询所有
    10 }
  2. 新增Service接口
    1 public interface PersonService {
    2 int add(Person person);// 添加
    3 Person queryPersonById(Integer id);// 查询一个
    4
    5 int update(Person person);// 修改
    6 List<Person> queryListPerson();// 查询所有
    7 }
  3. 新增Service实现
     1 @Service
    2 public class PersonServiceImpl implements PersonService{
    3
    4 @Autowired // 注入DAO层Mapper
    5 private PersonMapper personMapper;
    6
    7 @Override
    8 public int add(Person person) {
    9 return personMapper.add(person);
    10 }
    11
    12 @Override
    13 public Person queryPersonById(Integer id) {
    14 return personMapper.queryPersonById(id);
    15 }
    16
    17 @Override
    18 public int update(Person person) {
    19 return personMapper.update(person);
    20 }
    21
    22 @Override
    23 public List<Person> queryListPerson() {
    24 return personMapper.queryListPerson();
    25 }
    26
    27 }
  4. 新增控制器PersonController
     1 @RestController
    2 public class PersonController {
    3
    4 @Autowired
    5 private PersonService personService;
    6 /**
    7 * 测试接口:http://localhost:8080/queryPersonById/1
    8 * 请求方式:get 入参:查询id 返回值:查询的一行数据Person(JSON格式)
    9 */
    10 @GetMapping("/queryPersonById/{id}")
    11 public Person queryPersonById(@PathVariable Integer id) {
    12 return personService.queryPersonById(id);
    13 }
    14
    15 /**
    16 * 测试接口:http://localhost:8080/addPerson
    17 * 请求方式:put 入参:JSON数据 返回值:添加成功影响行数
    18 */
    19 @RequestMapping(value = "/addPerson",method = RequestMethod.PUT)
    20 public int addPerson(@RequestBody Person person) {
    21 return personService.add(person);
    22 }
    23
    24 }
  5. 建议修改yml文件,添加别名和驼峰命名配置
  6. 在启动类上添加注解@MapperScan(...)

      默认情况下,MyBatis-Spring-Boot-Starter会查找以@Mapper注解标记的映射器。你需要给每个MyBatis映射器标识上@Mapper注解,但是这样非常的麻烦,这时可以使用@MapperScan注解来扫描包。@MapperScan注解的作用:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会代理生成相应的实现类。添加位置:是在Springboot启动类上面添加。

    @SpringBootApplication
    2 @MapperScan("com.xsge.app.mapper")
    3 public class SpringbootMybatisApplication {
    4
    5 public static void main(String[] args) {
    6 SpringApplication.run(SpringbootMybatisApplication.class, args);
    7 }
    8
    9 }

    除了在启动类上使用注解@MapperScan实现扫描Mapper接口生成代理对象外,还可以使用@Mapper注解,接口类上添加了@Mapper,在编译之后也会生成相应的接口实现类。两者选择其一即可,但使用@Mapper则要求每个接口类上都需要添加,通过使用@MapperScan注解,可以让我们不用为每个Mapper类都添加@Mapper注解。详情参考MyBatis中文网

  7. 运行SpringBoot启动类测试

  2.Mapper接口基于XML方式实现CURD

    使用xml方式需要在application.yml中进行一些额外的配置。(通常即使在注解方式中,也会添加公共的配置)

  1. 修改yml文件,新增配置

     1 # MyBatis配置
    2 mybatis:
    3 # 配置别名
    4 type-aliases-package: com.xsge.app.entity
    5 # 配置XML扫描地址
    6 mapper-locations:
    7 - classpath:mapper/*.xml
    8 # 配置启用驼峰命名方式
    9 configuration:
    10 map-underscore-to-camel-case: true
  2. 在根目录下增子mapper包,并添加mapper映射配置(xml文件)
     1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3
    4 <mapper namespace= "com.xsge.app.mapper.PersonMapper">
    5
    6 <update id="update" parameterType="com.xsge.app.entity.Person">
    7 UPDATE person SET name=#{name},password=#{password} WHERE id=#{id}
    8 </update>
    9
    10 <select id = "queryListPerson" resultType = "com.xsge.app.entity.Person">
    11 SELECT * FROM person
    12 </select>
    13
    14 </mapper>
  3. 修改控制器PersonController添加测试接口
     1 /**
    2 * 测试接口:http://localhost:8080/queryListPerson
    3 * 请求方式:GET 返回值:查询结果集
    4 */
    5 @RequestMapping(value = "/queryListPerson",method = RequestMethod.GET)
    6 public List<Person> queryListPerson() {
    7 return personService.queryListPerson();
    8 }
    9
    10 /**
    11 * 测试接口:http://localhost:8080/update
    12 * 请求方式:POST 返回值:更新影响行数
    13 */
    14 @RequestMapping(value = "/update",method = RequestMethod.POST)
    15 public int update(@RequestBody Person person) {
    16 return personService.update(person);
    17 }
  4. 运行SpringBoot启动类,测试

4.访问Druid监控后台

  访问Druid监控后台,查看SQL监控信息:访问:http://localhost:8080/druid 会自动跳转至Druid后台监控登录页,输入自定义配置的账户/密码(xsge,xsge)即可登录查看详情。

SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)的更多相关文章

  1. SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)

    SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...

  2. SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)

    SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...

  3. SpringBoot:整合Druid、MyBatis

    目录 简介 JDBC 导入依赖 连接数据库 CRUD操作 自定义数据源 DruidDataSource Druid 简介 配置数据源 配置 Druid 数据源监控 配置 Druid web 监控 fi ...

  4. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

  5. SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂)

    SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂) 当前环境说明: Windows10_64 Maven3.x JDK1.8 MySQL5.6 SpringTool ...

  6. SpringBoot第九集:整合JSP和模板引擎Freemarker/Thymeleaf(2020最新最易懂)

    SpringBoot第九集:整合JSP和模板引擎(2020最新最易懂) 当客户通过前端页面提交请求后,我们以前是怎么做的?后端接收请求数据,处理请求,把响应结果交给模板引擎JSP,最后将渲染后的JSP ...

  7. Java之SpringBoot自定义配置与整合Druid

    Java之SpringBoot自定义配置与整合Druid SpringBoot配置文件 优先级 前面SpringBoot基础有提到,关于SpringBoot配置文件可以是properties或者是ya ...

  8. SpringBoot第一集:入门(2020最新最易懂)

    2020最新SpringBoot第一集:入门(2020最新最易懂) 学习思路: 是什么?为什么要学,有什么用?有什么特点?简单明了的总结一句话! SpringBoot推荐开发工具: Spring To ...

  9. SpringBoot第二集:注解与配置(2020最新最易懂)

    2020最新SpringBoot第二集:基础注解/基础配置(2020最新最易懂) 一.Eclipse安装SpringBoot插件 Eclipse实现SpringBoot开发,为便于项目的快速构建,需要 ...

随机推荐

  1. C++vector and opencv Mat

    转载:https://blog.csdn.net/u012507022/article/details/50979011?utm_source=blogxgwz5 最近在写Opencv程序,用到离散小 ...

  2. Beyond Compare 3, 简体中文版 安装

    转载: 1.https://www.scootersoftware.com/download.php 2.http://www.scootersoftware.com/download.php 下载地 ...

  3. Espruino似乎和Arduino一样

    参考:https://baike.baidu.com/item/Espruino Espruino 编辑 锁定 讨论   Espruino 是一个微处理器的 JavaScript 解释器,我们用它来创 ...

  4. matlab中for 用来重复指定次数的 for 循环

    参考:https://ww2.mathworks.cn/help/matlab/ref/for.html?searchHighlight=for&s_tid=doc_srchtitle for ...

  5. Nginx(五)、http反向代理的实现

    上一篇nginx的文章中,我们理解了整个http正向代理的运行流程原理,主要就是事件机制接入,header解析,body解析,然后遍历各种checker,以及详细讲解了其正向代理的具体实现过程.这已经 ...

  6. Hadoop理论基础

    Hadoop是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理.   特性:扩 ...

  7. 基于raft共识搭建的Fabric1.4.4多机网络环境

    1准备工作介绍 1各个主机ip以及节点分配情况 各个主机的节点分配情况 ip地址 orderer0.example.com,peer0.org1.example.com 172.17.3.60 ord ...

  8. 高效的后端API开发模板-illuminant

    概要 整体介绍 补充说明 Q. 有了 prisma 自动生成的 graphql 接口, 为什么还要 rest 接口和 websocket 接口? Q. 为什么要通过 illuminant 加一层反向代 ...

  9. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  10. Convert to Ones CodeForces(超水题)

    题目大意:给你几个数,这些数里面只有0或1,你有两种操作:1.把一段区域内的所有数前后交换位置.2.把一段区域内所有数取反.(区域可大可小,可以是所有数也                       ...