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

净重21克 2020-11-09 17:23:26
SpringBoot 第五集 第五 五集 整合


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)即可登录查看详情。

 

版权声明
本文为[净重21克]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/xsge/p/13932235.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云