SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)
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.准备工作
- 创建数据库。
- 新增对应数据库实体类。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private Integer id;
private String name;
private String password;
} 修改pom.xml引入依赖。
以下依赖文件,并非整个项目中所有已包含的依赖,例如:热部署,Lombok等,由于代码长度问题,一些基本引用的依赖,我并没有写入,请另行参考博主其他SpringBoot整合文档,自行参考导入更多所需依赖。
Spring家族的使命就是为了简化而生,但是随着Spring的发展壮大,有点事与愿违了。为了坚持初心,Spring家族祭出了一大杀器---Spring Boot。Spring Boot的核心理念是:不建议使用xml文件配置。但是,这对MyBatis来说进退两难,因为MyBatis离不开xml,需要xml来配置sql语句。为了迎合Spring Boot的发展理念,MyBatis官方开发了mybatis-spring-boot-starter1 <!-- 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官方说明文档
- 创建一个包含基本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
- 修改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 } - 新增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 } - 新增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 } - 新增控制器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 } - 建议修改yml文件,添加别名和驼峰命名配置
- 在启动类上添加注解@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中文网
- 运行SpringBoot启动类测试
2.Mapper接口基于XML方式实现CURD
使用xml方式需要在application.yml中进行一些额外的配置。(通常即使在注解方式中,也会添加公共的配置)
- 修改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 - 在根目录下增子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> - 修改控制器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 } - 运行SpringBoot启动类,测试
4.访问Druid监控后台
访问Druid监控后台,查看SQL监控信息:访问:http://localhost:8080/druid 会自动跳转至Druid后台监控登录页,输入自定义配置的账户/密码(xsge,xsge)即可登录查看详情。
SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)的更多相关文章
- SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂)
SpringBoot第七集:异常处理与整合JSR303校验(2020最新最易懂) 一.SpringBoot全局异常 先讲下什么是全局异常处理器? 全局异常处理器就是把整个系统的异常统一自动处理,程序员 ...
- SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂)
SpringBoot第十一集:整合Swagger3.0与RESTful接口整合返回值(2020最新最易懂) 一,整合Swagger3.0 随着Spring Boot.Spring Cloud等微服务的 ...
- SpringBoot:整合Druid、MyBatis
目录 简介 JDBC 导入依赖 连接数据库 CRUD操作 自定义数据源 DruidDataSource Druid 简介 配置数据源 配置 Druid 数据源监控 配置 Druid web 监控 fi ...
- SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)
SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...
- SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂)
SpringBoot第四集:整合JdbcTemplate和JPA(2020最新最易懂) 当前环境说明: Windows10_64 Maven3.x JDK1.8 MySQL5.6 SpringTool ...
- SpringBoot第九集:整合JSP和模板引擎Freemarker/Thymeleaf(2020最新最易懂)
SpringBoot第九集:整合JSP和模板引擎(2020最新最易懂) 当客户通过前端页面提交请求后,我们以前是怎么做的?后端接收请求数据,处理请求,把响应结果交给模板引擎JSP,最后将渲染后的JSP ...
- Java之SpringBoot自定义配置与整合Druid
Java之SpringBoot自定义配置与整合Druid SpringBoot配置文件 优先级 前面SpringBoot基础有提到,关于SpringBoot配置文件可以是properties或者是ya ...
- SpringBoot第一集:入门(2020最新最易懂)
2020最新SpringBoot第一集:入门(2020最新最易懂) 学习思路: 是什么?为什么要学,有什么用?有什么特点?简单明了的总结一句话! SpringBoot推荐开发工具: Spring To ...
- SpringBoot第二集:注解与配置(2020最新最易懂)
2020最新SpringBoot第二集:基础注解/基础配置(2020最新最易懂) 一.Eclipse安装SpringBoot插件 Eclipse实现SpringBoot开发,为便于项目的快速构建,需要 ...
随机推荐
- nessus 家庭版安装教程(windows)
1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...
- JSON.stringify 的使用
一.作用:这个函数的作用主要是为了序列化对象.就是把原来是对象的类型转换成字符串类型(json格式的String类型). 二.语法:JSON.stringify(value[, replacer][, ...
- linux下各种骚操作
(备注:不定时更新) 1. ctrl+l 清屏快捷键,相当于clear 2. !+命令开头部分 执行最近执行的此条命令 ### 如!vi 编辑上一次用vi打开的文件, 3. echo $$ ...
- Docker入门手册
20.Docker 20.1 Docker的起源 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司,这家公司主要提供基于PaaS的云计算技术服务 ...
- 扩展、接管MVC都不会,还说会Spring Boot?
持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 版本 如何扩展MVC? 如何自定义一个拦截器? 什么都不配置为什么依然能运行MVC相关的功能? 如何全面接管MVC?[不推荐] 为 ...
- centos 7.0 更改启动环境/启动进入图形界面/命令行模式
当前我桌面模式 systemctl set-default multi-user.target ln -sf /lib/systemd/system/multi-user.target /etc/sy ...
- 2017-18一《电子商务概论》本科作业-商A1551
第1次作业: 1 2017年双十一新营销方案 2 销售额达1682亿元分析组成及了解猫狗大战 3 破亿店铺举例. 第2次作业: 1.你如何来定义和理解电子商务?电子商务对社会经济带了怎样的影响,企业. ...
- 【贪心算法】HDU 5969 最大的位或
题目内容 Vjudge链接 给出一个闭区间,找该区间内两个数,使这两个数的按位或最大. 输入格式 包含至多\(10001\)组测试数据. 第一行有一个正整数,表示数据的组数. 接下来每一行表示一组数据 ...
- wine实用经验教程
本篇讲类unix系统下的用以模拟运行Windows程序的wine.会从普通使用者的比较实用的角度去讲.有专为国内用户准备的内容. 本篇面向有Linux经验但对wine不熟悉的人. wine可靠吗?该不 ...
- C++ Primer第5版 第一章课后练习
练习1.9 #include <iostream> int main() { int sum = 0, val = 50; while (val <= 100) { sum += v ...