当前位置:   article > 正文

搭建springboot后端框架(二)集成druid数据源+druid监控+mybatis-plus+mysql+logback日志_spring.datasource.druid.test-while-idle=false

spring.datasource.druid.test-while-idle=false

项目搭建工具及版本:

eclipse / jdk1.8 / springboot2.5.0 

1.pom.xml引入相关jar包

  1. <!--mybatis依赖-->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.2.0</version>
  6. </dependency>
  7. <!--mybatis-plus依赖-->
  8. <dependency>
  9. <groupId>com.baomidou</groupId>
  10. <artifactId>mybatis-plus-boot-starter</artifactId>
  11. <version>3.3.2</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.baomidou</groupId>
  15. <artifactId>mybatis-plus-generator</artifactId>
  16. <version>3.3.2</version>
  17. </dependency>
  18. <!-- MySQL连接驱动 -->
  19. <dependency>
  20. <groupId>mysql</groupId>
  21. <artifactId>mysql-connector-java</artifactId>
  22. </dependency>
  23. <!-- 引入druid支持 -->
  24. <dependency>
  25. <groupId>com.alibaba</groupId>
  26. <artifactId>druid-spring-boot-starter</artifactId>
  27. <version>1.2.6</version>
  28. </dependency>
  29. <!--lombok支持简化开发-->
  30. <dependency>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. </dependency>

2.application-dev.properties增加配置

  1. #===================== 数据库配置(使用druid)=====================
  2. #mysql
  3. spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
  4. spring.datasource.druid.url=jdbc:mysql://你的mysql地址:3306/数据库名称?characterEncoding=utf-8&useSSL=false
  5. spring.datasource.druid.username=root
  6. spring.datasource.druid.password=你的mysql密码
  7. spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
  8. #===================== druid连接池配置 =====================
  9. spring.datasource.druid.initial-size=5
  10. spring.datasource.druid.max-active=20
  11. spring.datasource.druid.min-idle=5
  12. spring.datasource.druid.max-wait=60000
  13. spring.datasource.druid.pool-prepared-statements=true
  14. spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
  15. #spring.datasource.druid.max-open-prepared-statements=
  16. spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
  17. spring.datasource.druid.validation-query-timeout=30000
  18. spring.datasource.druid.test-on-borrow=false
  19. spring.datasource.druid.test-on-return=false
  20. spring.datasource.druid.test-while-idle=true
  21. spring.datasource.druid.time-between-eviction-runs-millis=60000
  22. spring.datasource.druid.min-evictable-idle-time-millis=300000
  23. #spring.datasource.druid.max-evictable-idle-time-millis=
  24. spring.datasource.druid.filters=stat,wall,slf4j
  25. #WebStatFilter配置
  26. spring.datasource.druid.web-stat-filter.enabled=true
  27. spring.datasource.druid.web-stat-filter.url-pattern=/*
  28. spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico, /druid/*
  29. spring.datasource.druid.web-stat-filter.session-stat-enable=true
  30. spring.datasource.druid.web-stat-filter.session-stat-max-count=2000
  31. spring.datasource.druid.web-stat-filter.principal-session-name=USER_SESSION
  32. spring.datasource.druid.web-stat-filter.principal-cookie-name=USER_COOKIE
  33. spring.datasource.druid.web-stat-filter.profile-enable=true
  34. #StatViewServlet配置
  35. spring.datasource.druid.stat-view-servlet.enabled=true
  36. spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
  37. spring.datasource.druid.stat-view-servlet.reset-enable=false
  38. spring.datasource.druid.stat-view-servlet.login-username=
  39. spring.datasource.druid.stat-view-servlet.login-password=
  40. spring.datasource.druid.stat-view-servlet.allow=
  41. spring.datasource.druid.stat-view-servlet.deny=
  42. #Spring监控配置
  43. #Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
  44. spring.datasource.druid.aop-patterns=com.*.*.dao.*,com.*.*.service.*
  45. #如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true
  46. #===================== mybatis-plus配置 =====================
  47. #如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
  48. #如果是放在resource目录 classpath:/mapper/*Mapper.xml
  49. mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
  50. #别名包扫描,多个package用逗号或者分号分隔
  51. mybatis-plus.type-aliases-package=com.*.*.dao
  52. #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
  53. mybatis-plus.configuration.map-underscore-to-camel-case=true
  54. mybatis-plus.configuration.cache-enabled=false
  55. #配置JdbcTypeForNull, oracle数据库必须配置
  56. mybatis-plus.configuration.jdbc-type-for-null='null'
  57. #开启sql日志
  58. #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  59. #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
  60. mybatis-plus.global-config.id-type=0
  61. #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
  62. mybatis-plus.global-config.field-strategy=2
  63. #驼峰下划线转换
  64. mybatis-plus.global-config.db-column-underline=true
  65. #mp2.3+ 全局表前缀 t_
  66. mybatis-plus.global-config.table-prefix=ht_
  67. #刷新mapper 调试神器
  68. mybatis-plus.global-config.refresh-mapper=true
  69. #数据库大写下划线转换
  70. mybatis-plus.global-config.capital-mode=true
  71. #逻辑删除配置(下面3个配置)
  72. mybatis-plus.global-config.logic-delete-value=4
  73. mybatis-plus.global-config.logic-not-delete-value=0

3.springboot自带logback日志框架,所以只需要启用配置即可。

使用:在需要使用日志的类名位置加入@Slf4j注解即可使用,后面的例子会穿插使用。

配置:logback.xml为自定义日志配置,一般没啥特殊要求模板使用即可,附上本项目的日志配置文件。

配置文件与properties文件同目录/src/main/resources/即可。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!-- 修改日志文件名及路径 -->
  4. <property name="logName" value="bbnet-api"/>
  5. <property name="logPath" value="logs"/>
  6. <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  7. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  8. <encoder>
  9. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  10. <charset>utf8</charset>
  11. </encoder>
  12. </appender>
  13. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  14. <file>${logPath}/${logName}.log</file>
  15. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  16. <!-- 保存历史记录到这个文件夹,日起为后缀 -->
  17. <fileNamePattern>${logPath}/${logName}.%d{yyyy-MM-dd}.log</fileNamePattern>
  18. <!-- 自动保存30天之内的日志文件 -->
  19. <maxHistory>30</maxHistory>
  20. </rollingPolicy>
  21. <encoder>
  22. <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  23. <charset>utf8</charset>
  24. </encoder>
  25. </appender>
  26. <root level="INFO">
  27. <appender-ref ref="CONSOLE"></appender-ref>
  28. <appender-ref ref="FILE"></appender-ref>
  29. </root>
  30. <!-- mybatis打印sql配置,可以指定到类,如果开启了sql插件这里就不用单独配置 -->
  31. <!-- <logger name="com.*.*.mapper" level="TRACE" additivity="true" /> -->
  32. <!-- 排除不需要打印的日志 -->
  33. <logger name="com.alibaba.druid.pool.DruidDataSource" level="OFF" />
  34. <logger name="org.springframework.web.servlet.DispatcherServlet" level="OFF" />
  35. <logger name="org.apache.catalina.core.ContainerBase" level="OFF" />
  36. </configuration>

4.增加druid数据源和数据监控配置类

有这3个功能类即可。

  1. package com.bbnet.config.druid;
  2. import javax.sql.DataSource;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import com.alibaba.druid.pool.DruidDataSource;
  7. import lombok.extern.slf4j.Slf4j;
  8. /**
  9. * druid注册到容器
  10. *
  11. *
  12. * @author sgc
  13. * @since 2021-08-25
  14. */
  15. @Configuration
  16. @Slf4j
  17. public class DruidConfig {
  18. // protected final Logger log = LoggerFactory.getLogger(DruidConfig.class);
  19. @ConfigurationProperties(prefix = "spring.datasource.druid")
  20. @Bean
  21. public DataSource druid(){
  22. log.info("Druid数据源和监控配置初始化完成");
  23. return new DruidDataSource();
  24. }
  25. }
  1. package com.bbnet.config.druid;
  2. import javax.servlet.annotation.WebFilter;
  3. import javax.servlet.annotation.WebInitParam;
  4. import com.alibaba.druid.support.http.WebStatFilter;
  5. /**
  6. * @Description druid过滤器
  7. * <pre>
  8. *
  9. * </pre>
  10. *
  11. *
  12. * @author sgc
  13. * @date 2021-08-25
  14. */
  15. @WebFilter(filterName="druidWebStatFilter",
  16. urlPatterns="/*",
  17. initParams={
  18. @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源
  19. }
  20. )
  21. public class DruidStatFilter extends WebStatFilter {
  22. }
  1. package com.bbnet.config.druid;
  2. import javax.servlet.annotation.WebInitParam;
  3. import javax.servlet.annotation.WebServlet;
  4. import com.alibaba.druid.support.http.StatViewServlet;
  5. /**
  6. * 配置druid的servlet,druid数据源状态监控
  7. *
  8. * @author sgc
  9. * @date 2021-08-25
  10. */
  11. @WebServlet(urlPatterns="/druid/*",
  12. initParams={
  13. @WebInitParam(name="allow",value=""),// IP白名单(没有配置或者为空,则允许所有访问)
  14. @WebInitParam(name="deny",value=""),// IP黑名单 (存在共同时,deny优先于allow)
  15. @WebInitParam(name="loginUsername",value=""),// 用户名
  16. @WebInitParam(name="loginPassword",value=""),// 密码
  17. @WebInitParam(name="resetEnable",value="true")// 禁用HTML页面上的“Reset All”功能
  18. }
  19. )
  20. public class DruidStatViewServlet extends StatViewServlet {
  21. private static final long serialVersionUID = 1L;
  22. }

以上配置完成项目启动则通过localhost:8888/druid/即可访问druid的监控系统。

druid相关问题这里不做赘述。 

5.项目启动类加上注解@ServletComponentScan

  1. package com.bbnet;
  2. import java.net.InetAddress;
  3. import java.net.UnknownHostException;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.boot.web.servlet.ServletComponentScan;
  7. import org.springframework.context.ConfigurableApplicationContext;
  8. import org.springframework.core.env.Environment;
  9. /**
  10. * @Description 项目启动类
  11. * <pre>
  12. *
  13. * </pre>
  14. *
  15. *
  16. * @author sgc
  17. * @date 2021-08-25
  18. */
  19. @SpringBootApplication
  20. @ServletComponentScan
  21. public class BbnetApplication {
  22. public static void main(String[] args) throws UnknownHostException {
  23. // SpringApplication.run(BbnetApplication.class);
  24. //System.setProperty("spring.devtools.restart.enabled", "true");
  25. ConfigurableApplicationContext application = SpringApplication.run(BbnetApplication.class, args);
  26. Environment env = application.getEnvironment();
  27. String ip = InetAddress.getLocalHost().getHostAddress();
  28. String port = env.getProperty("server.port");
  29. String path = env.getProperty("server.servlet.context-path");
  30. System.out.println(
  31. "\n--------后台服务启动成功--------------------------------------------------------------\n\t" +
  32. "本地访问地址: \t\thttp://localhost:" + port + path + "/\n\t" +
  33. "公网访问地址: \t\thttp://" + ip + ":" + port + path + "/\n\t" +
  34. "Swagger接口文档地址: \thttp://" + ip + ":" + port + path + "/swagger-ui.html\n\t" +
  35. "Druid数据监控地址: \thttp://" + ip + ":" + port + path + "/druid/\n" +
  36. "-----------------------------------------------------------------------------------");
  37. }
  38. }

6.增加mybatis-plus配置类

  1. package com.bbnet.config.mybatisplus;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.transaction.annotation.EnableTransactionManagement;
  6. import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
  7. import lombok.extern.slf4j.Slf4j;
  8. /**
  9. * mybatis-plus配置
  10. *
  11. *
  12. * @author sgc
  13. * @since 2021-08-25
  14. */
  15. @EnableTransactionManagement
  16. @Configuration
  17. @MapperScan(basePackages = "com.**.mapper")
  18. @Slf4j
  19. public class MybatisPlusConfig {
  20. // protected final Logger log = LoggerFactory.getLogger(MybatisPlusConfig.class);
  21. @Bean
  22. public PaginationInterceptor paginationInterceptor() {
  23. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  24. // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
  25. // paginationInterceptor.setOverflow(false);
  26. // 设置最大单页限制数量,默认 500 条,-1 不受限制
  27. // paginationInterceptor.setLimit(500);
  28. log.info("Mybatis-Plus配置初始化完成");
  29. return paginationInterceptor;
  30. }
  31. }

PS:因为本示例将来会读取/src/main/resources/下mapper文件夹下的xml文件,所以保证/src/main/resources/下已经新建该目录。

7.mysql示例表结构

  1. DROP TABLE IF EXISTS `ht_area`;
  2. CREATE TABLE `ht_area` (
  3. `id` int(11) NOT NULL COMMENT '主键',
  4. `name` varchar(64) NOT NULL COMMENT '名称',
  5. `parent_id` int(11) DEFAULT NULL COMMENT '父区域ID',
  6. `type` int(11) NOT NULL COMMENT '区域类型,1:省份;2:城市;3:区县',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='区域信息表';
  9. SET FOREIGN_KEY_CHECKS = 1;

8.创建mybatis-plus增强controller类,将来所有的业务controller类将继承该类。

  1. package com.bbnet.common.base;
  2. import java.util.List;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.baomidou.mybatisplus.extension.service.IService;
  11. import io.swagger.annotations.ApiImplicitParam;
  12. import io.swagger.annotations.ApiImplicitParams;
  13. import io.swagger.annotations.ApiOperation;
  14. /**
  15. * 所有控制器的父类
  16. *
  17. * @param <T>
  18. *
  19. * @author sgc
  20. * @since 2021-08-25
  21. */
  22. public abstract class BaseController<T> {
  23. public abstract IService<T> getIService();
  24. protected final Logger log = LoggerFactory.getLogger(BaseController.class);
  25. /**
  26. * 查询所有
  27. * @return
  28. */
  29. @PostMapping("/list")
  30. @ApiOperation(value="查询所有", notes="")
  31. public List<T> list() {
  32. return getIService().list();
  33. }
  34. /**
  35. * 分页查询
  36. * @param current
  37. * @param size
  38. * @return
  39. */
  40. @SuppressWarnings({ "unchecked", "rawtypes" })
  41. @PostMapping("/page")
  42. @ApiOperation(value="分页查询", notes="比如:当前第1页查询10条数据,则current=1,size=10")
  43. @ApiImplicitParams({
  44. @ApiImplicitParam(name = "current", value = "当前第几页", required = true, dataType = "String"),
  45. @ApiImplicitParam(name = "size", value = "查询几条", required = true, dataType = "String")
  46. })
  47. public IPage<T> page(@RequestParam String current, @RequestParam String size) {
  48. Page<T> page = new Page(Long.parseLong(current), Long.parseLong(size));
  49. return getIService().page(page);
  50. }
  51. /**
  52. * 新增
  53. * @param t
  54. * @return
  55. */
  56. @PostMapping("/add")
  57. @ApiOperation(value="新增", notes="")
  58. public String add(@RequestBody T t) {
  59. return getIService().save(t) ? "添加成功!" : "添加失败!";
  60. }
  61. /**
  62. * 更新
  63. * @param t
  64. * @return
  65. */
  66. @PostMapping("/update")
  67. @ApiOperation(value="更新", notes="")
  68. public String update(@RequestBody T t) {
  69. return getIService().updateById(t) ? "修改成功!" : "修改失败!";
  70. }
  71. /**
  72. * 删除
  73. * @param id
  74. * @return
  75. */
  76. @PostMapping("/deleteById")
  77. @ApiOperation(value="删除", notes="")
  78. @ApiImplicitParams({
  79. @ApiImplicitParam(name = "id", value = "主键id", required = true, dataType = "String")
  80. })
  81. public String deleteById(@RequestParam String id) {
  82. return getIService().removeById(id) ? "删除成功!" : "删除失败!";
  83. }
  84. }

9.创建vo/mapper/service/impl/controller的demo示例代码

  1. package com.bbnet.demo.vo;
  2. import com.baomidou.mybatisplus.annotation.TableId;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.Data;
  5. import lombok.experimental.Accessors;
  6. @Data
  7. @Accessors(chain = true)
  8. @TableName("ht_area")
  9. public class Area {
  10. @TableId
  11. private Integer id;
  12. private String name;
  13. private Integer parentId;
  14. private Integer type;
  15. }
  1. package com.bbnet.demo.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.bbnet.demo.vo.Area;
  4. public interface AreaService extends IService<Area> {
  5. String say();
  6. }
  1. package com.bbnet.demo.service.impl;
  2. import org.springframework.stereotype.Service;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.bbnet.demo.mapper.AreaMapper;
  5. import com.bbnet.demo.service.AreaService;
  6. import com.bbnet.demo.vo.Area;
  7. @Service
  8. public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements AreaService {
  9. @Override
  10. public String say() {
  11. }
  12. }
  1. package com.bbnet.demo.controller;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import com.baomidou.mybatisplus.extension.service.IService;
  10. import com.bbnet.common.base.BaseController;
  11. import com.bbnet.demo.service.AreaService;
  12. import com.bbnet.demo.vo.Area;
  13. @RestController
  14. @RequestMapping("/demo")
  15. public class DemoController extends BaseController<Area> {
  16. private static final Logger log = LoggerFactory.getLogger(DemoController.class);
  17. @Autowired
  18. private AreaService areaService;
  19. @Override
  20. public IService<Area> getIService() {
  21. return areaService;
  22. }
  23. @PostMapping("/catchReq")
  24. public String catchReq(@RequestParam String id) {
  25. log.info("初始化了getIService...");
  26. return areaService.say();
  27. }
  28. }

10.测试controller的继承类

因为DemoController继承了BaseController类,所以BaseController中的方法是可以提供给demo去使用的,故直接请求localhost:8888/bbnet/demo/list是可以查到数据库的数据的

11.测试druid的监控页面

请求http://127.0.0.1:8888/bbnet/druid/地址,如下图:

至此,框架集成日志、mysql、mybatis、druid、mybatis-plus完成,代码细节上可能有一点未注解清楚的地方,有问题请留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46489?site
推荐阅读
相关标签
  

闽ICP备14008679号