• 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.准备工作

    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
      11 # 设置日志显示:在控制台打印SQL
      12 logging:
      13   level:
      14     # 以包名前置,表示指定包下的操作指定日志级别。
      15     com.xsge.app.mapper: DEBUG 
    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.SpringBoot整合MyBatis分页助手

    1. 引入分页助手依赖
      1 <!-- SpringBoot整合MyBatis分页助手 -->
      2 <dependency>
      3     <groupId>com.github.pagehelper</groupId>
      4     <artifactId>pagehelper-spring-boot-starter</artifactId>
      5     <version>1.2.12</version>
      6 </dependency>
    2. 查询前设置分页,最后将将查询结果封装为PageInfo即可
       1 /**
       2  * 测试接口:http://localhost:8080/queryListPersonPage
       3  * 请求方式:GET      返回值:查询结果集,分页查询
       4  */
       5 @RequestMapping(value = "/queryListPersonPage",method = RequestMethod.GET)
       6 public PageInfo<Person> queryListPersonPage() {
       7     //1.执行分页
       8     PageHelper.startPage( 1, 2) ;
       9     //2.执行查询
      10     List<Person> list = personService.queryListPersonPage();
      11     //3.封装PageInfo对象
      12     PageInfo<Person> pageInfo = new PageInfo<Person> (list);
      13 
      14     return pageInfo;
      15 }
    3. 启动项目访问接口测试

    5.访问Druid监控后台

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

     说明:博主的每一篇文档都是承上启下的,因此如果看不懂,或者缺少配置导致无法执行,请参考上一集SpringBoot内容。

  • 相关阅读:
    [CTF隐写]png中CRC检验错误的分析
    Bugku
    Bugku
    【CTF 攻略】CTF比赛中关于zip的总结
    sqlserver中利用Tran_sql把逗号分隔的字符串拆成临时表
    H5摇一摇遇到的问题
    C# MVC 微信支付之微信模板消息推送
    各种大型网站技术架构
    ORM框架详解
    显示实现接口
  • 原文地址:https://www.cnblogs.com/xsge/p/13932235.html
Copyright © 2020-2023  润新知