• SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池


    前言

    之前搭建SpringBoot项目工程,所使用的持久层框架不是Mybatis就是JPA,还没试过整合MybatisPlus框架并使用,原来也如此简单。在此简单记录一下在SpringBoot项目中,整合MybatisPlus持久层框架、Druid数据库连接池的过程。

    一、导入依赖

    (1)pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>帅龍之龍artifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <parent>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-parentartifactId>
    12. <version>2.5.3version>
    13. <relativePath/>
    14. parent>
    15. <properties>
    16. <java.version>1.8java.version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-starter-webartifactId>
    22. dependency>
    23. <dependency>
    24. <groupId>org.mybatis.spring.bootgroupId>
    25. <artifactId>mybatis-spring-boot-starterartifactId>
    26. <version>2.1.1version>
    27. dependency>
    28. <dependency>
    29. <groupId>com.baomidougroupId>
    30. <artifactId>mybatis-plus-boot-starterartifactId>
    31. <version>3.5.2version>
    32. dependency>
    33. <dependency>
    34. <groupId>com.alibabagroupId>
    35. <artifactId>druid-spring-boot-starterartifactId>
    36. <version>1.2.15version>
    37. dependency>
    38. <dependency>
    39. <groupId>mysqlgroupId>
    40. <artifactId>mysql-connector-javaartifactId>
    41. <scope>runtimescope>
    42. dependency>
    43. <dependency>
    44. <groupId>org.springframework.bootgroupId>
    45. <artifactId>spring-boot-starter-thymeleafartifactId>
    46. dependency>
    47. <dependency>
    48. <groupId>org.projectlombokgroupId>
    49. <artifactId>lombokartifactId>
    50. dependency>
    51. <dependency>
    52. <groupId>eu.bitwalkergroupId>
    53. <artifactId>UserAgentUtilsartifactId>
    54. <version>1.20version>
    55. dependency>
    56. dependencies>
    57. <build>
    58. <plugins>
    59. <plugin>
    60. <groupId>org.springframework.bootgroupId>
    61. <artifactId>spring-boot-maven-pluginartifactId>
    62. plugin>
    63. plugins>
    64. build>
    65. project>

    二、项目配置

    (1)application.yml

    1. server:
    2. port: 8090
    3. spring:
    4. datasource:
    5. #---- ^ MySQL 数据库配置 ----#
    6. driver-class-name: com.mysql.cj.jdbc.Driver
    7. url: jdbc:mysql://127.0.0.1:3306/帅龍之龍?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    8. username:
    9. password:
    10. type: com.alibaba.druid.pool.DruidDataSource
    11. #---- / MySQL 数据库配置 ----#
    12. #---- ^ Druid 数据库连接池配置 ----#
    13. druid:
    14. # 初始化连接池数量
    15. initial-size: 5
    16. # 最小连接池数量
    17. min-idle: 5
    18. # 最大连接池数量
    19. max-active: 30
    20. # 配置获取连接等待超时的时间,单位毫秒
    21. max-wait: 60000
    22. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    23. time-between-eviction-runs-millis: 60000
    24. # 配置一个连接在池中最小生存的时间,单位是毫秒
    25. min-evictable-idle-time-millis: 300000
    26. # 验证数据库连接的有效性,若返回结果不为空,则说明连接可用
    27. validation-query: select 1
    28. # 在检查闲置连接时同时检查连接可用性
    29. test-while-idle: true
    30. # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    31. test-on-borrow: false
    32. # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    33. test-on-return: false
    34. # 是否缓存preparedStatement,也就是PSCachePSCache对支持游标的数据库性能提升巨大,比如说Oracle,而在MySQL下建议关闭
    35. pool-prepared-statements: true
    36. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    37. max-pool-prepared-statement-per-connection-size: 20
    38. filters: stat,wall
    39. # 合并多个DruidDataSource的监控数据
    40. #useGlobalDataSourceStat: true
    41. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    42. connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    43. # 采集web-jdbc关联监控的数据
    44. web-stat-filter:
    45. enabled: true
    46. url-pattern: "/*"
    47. exclusions: "*.txt,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
    48. # 监控配置
    49. stat-view-servlet:
    50. enabled: true
    51. url-pattern: "/druid/*"
    52. reset-enable: false
    53. login-username: root
    54. login-password: 123456
    55. allow:
    56. deny:
    57. #---- / Druid ^ 数据库连接池配置 ----#
    58. #---- ^ 文件上传大小限制 ----#
    59. servlet:
    60. multipart:
    61. max-file-size: 30MB
    62. max-request-size: 30MB
    63. #---- / 文件上传大小限制 ----#
    64. #---- ^ thymeleaf 前端模板配置 ----#
    65. thymeleaf:
    66. mode: HTML
    67. encoding: UTF-8
    68. cache: false
    69. prefix: classpath:/templates/
    70. suffix: .html
    71. #---- / thymeleaf 前端模板配置 ----#
    72. #---- ^ mybatis-plus 配置 ----#
    73. mybatis-plus:
    74. mapper-locations: mapper/*.xml
    75. configuration:
    76. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    77. map-underscore-to-camel-case: true
    78. type-aliases-package: org.example.pojo.entity
    79. #---- / mybatis-plus 配置 ----#

    三、控制层

    (1)/src/org/example/controller/RecordController.java

    1. package org.example.controller;
    2. import org.example.service.impl.RecordServiceImpl;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.*;
    6. import javax.servlet.http.HttpServletRequest;
    7. @Controller
    8. @RequestMapping(value = "api")
    9. public class RecordController {
    10. @Autowired
    11. private RecordServiceImpl recordService;
    12. /**
    13. * 保存用户访问记录
    14. */
    15. @GetMapping(value = "saveUserAccessRecord")
    16. @ResponseBody
    17. @CrossOrigin
    18. public T saveUserAccessRecord (HttpServletRequest request) {
    19. return recordService.saveUserAccessRecord(request);
    20. }
    21. /**
    22. * 删除用户访问记录
    23. */
    24. @GetMapping(value = "deleteUserAccessRecord")
    25. @ResponseBody
    26. @CrossOrigin
    27. public T deleteUserAccessRecord (@RequestParam("recordId") Integer recordId) {
    28. return recordService.deleteUserAccessRecord(recordId);
    29. }
    30. /**
    31. * 修改用户访问记录
    32. */
    33. @GetMapping(value = "modifyUserAccessRecord")
    34. @ResponseBody
    35. @CrossOrigin
    36. public T modifyUserAccessRecord () {
    37. return recordService.modifyUserAccessRecord();
    38. }
    39. /**
    40. * 查询用户访问记录
    41. */
    42. @GetMapping(value = "queryUserAccessRecord")
    43. @ResponseBody
    44. @CrossOrigin
    45. public T queryUserAccessRecord () {
    46. return recordService.queryUserAccessRecord();
    47. }
    48. }

    四、接口层

    (1)/src/org/example/service/IRecordService.java

    1. package org.example.service;
    2. import javax.servlet.http.HttpServletRequest;
    3. public interface IRecordService {
    4. T saveUserAccessRecord(HttpServletRequest request);
    5. T deleteUserAccessRecord(Integer recordId);
    6. T modifyUserAccessRecord();
    7. T queryUserAccessRecord();
    8. }

    五、实现层

    (1)/src/org/example/service/impl/RecordServiceImpl.java

    1. package org.example.service.impl;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    4. import eu.bitwalker.useragentutils.UserAgent;
    5. import org.example.mapper.RecordMapper;
    6. import org.example.pojo.entity.Record;
    7. import org.example.service.IRecordService;
    8. import org.slf4j.Logger;
    9. import org.slf4j.LoggerFactory;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import org.springframework.stereotype.Service;
    12. import javax.servlet.http.HttpServletRequest;
    13. import java.util.HashMap;
    14. @Service
    15. public class RecordServiceImpl implements IRecordService {
    16. private static final Logger log = LoggerFactory.getLogger(RecordServiceImpl.class);
    17. @Autowired
    18. public RecordMapper recordMapper;
    19. @Override
    20. public T saveUserAccessRecord(HttpServletRequest request) {
    21. HashMap responseObj = new HashMap<>();
    22. try {
    23. String agent = request.getHeader("User-Agent");
    24. UserAgent userAgent = UserAgent.parseUserAgentString(agent);
    25. // 获取发起请求的IP地址
    26. String ip = request.getHeader("x-forwarded-for");
    27. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    28. ip = request.getHeader("Proxy-Client-IP");
    29. }
    30. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    31. ip = request.getHeader("WL-Proxy-Client-IP");
    32. }
    33. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    34. ip = request.getRemoteAddr();
    35. }
    36. Record record = new Record();
    37. record.setIp(ip);
    38. record.setBrowser(userAgent.getBrowser().getName());
    39. record.setOs(userAgent.getOperatingSystem().getName());
    40. record.setDeviceType(userAgent.getOperatingSystem().getDeviceType().getName());
    41. recordMapper.insert(record);
    42. responseObj.put("code", 200);
    43. responseObj.put("success", true);
    44. responseObj.put("data", record);
    45. responseObj.put("msg", "保存成功");
    46. } catch (Exception e) {
    47. responseObj.put("code", 500);
    48. responseObj.put("success", false);
    49. responseObj.put("msg", e.getMessage());
    50. }
    51. return (T) responseObj;
    52. }
    53. @Override
    54. public T deleteUserAccessRecord(Integer recordId) {
    55. try {
    56. recordMapper.deleteById(recordId);
    57. return (T) "success";
    58. } catch (Exception e) {
    59. return (T) "fail";
    60. }
    61. }
    62. @Override
    63. public T modifyUserAccessRecord() {
    64. try {
    65. Record record = new Record();
    66. record.setId(1L);
    67. record.setIp("localhost");
    68. record.setBrowser("帅龍之龍");
    69. record.setOs("Windows 11");
    70. record.setDeviceType("Android");
    71. recordMapper.updateById(record);
    72. return (T) "success";
    73. } catch (Exception e) {
    74. return (T) "fail";
    75. }
    76. }
    77. @Override
    78. public T queryUserAccessRecord() {
    79. // 根据ID查询
    80. // Long recordId = (long) 1;
    81. // return (T) recordMapper.selectById(recordId);
    82. // 使用 QueryWrapper 构造器查询全部用户
    83. // QueryWrapper queryWrapper = new QueryWrapper<>();
    84. // queryWrapper.eq("ip", "0:0:0:0:0:0:0:1");
    85. // return (T) recordMapper.selectList(queryWrapper);
    86. // 使用 LambdaQueryWrapper 构造器查询全部用户
    87. LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
    88. lambdaQueryWrapper.eq(Record::getIp, "127.0.0.1");
    89. return (T) recordMapper.selectList(lambdaQueryWrapper);
    90. }
    91. }

    六、对象实体

    (1)/src/org/example/pojo/entity/Record.java

    1. package org.example.pojo.entity;
    2. import com.baomidou.mybatisplus.annotation.IdType;
    3. import com.baomidou.mybatisplus.annotation.TableField;
    4. import com.baomidou.mybatisplus.annotation.TableId;
    5. import lombok.Data;
    6. import lombok.ToString;
    7. import java.sql.Timestamp;
    8. @Data
    9. @ToString
    10. public class Record {
    11. // 指定主键名、主键生产策略
    12. @TableId(value = "id", type = IdType.AUTO)
    13. private Long id;
    14. private String ip;
    15. private String os;
    16. private String browser;
    17. // 指定列名,若一致则可以不用指定,若不一致则需要指定
    18. @TableField("device_type")
    19. private String deviceType;
    20. // 指定列名,若一致则可以不用指定,若不一致则需要指定
    21. @TableField("create_time")
    22. private Timestamp createTime;
    23. }

    七、持久层

    (1)/src/org/example/mapper/RecordMapper.java

    1. package org.example.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import org.example.pojo.entity.*;
    4. import org.springframework.stereotype.Repository;
    5. @Repository
    6. public interface RecordMapper extends BaseMapper {
    7. }

    八、启动器

    (1)App.java

    1. package org.example;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. import org.springframework.transaction.annotation.EnableTransactionManagement;
    6. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    7. @MapperScan("org.example.*")
    8. @EnableWebMvc
    9. @EnableTransactionManagement
    10. @SpringBootApplication
    11. public class App {
    12. public static void main(String[] args) {
    13. SpringApplication.run(App.class, args);
    14. }
    15. }

    九、数据表

    1. --
    2. -- 表的结构 `record`
    3. --
    4. CREATE TABLE IF NOT EXISTS `record` (
    5. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    6. `ip` varchar(30) DEFAULT NULL,
    7. `os` varchar(30) DEFAULT NULL,
    8. `browser` varchar(30) DEFAULT NULL,
    9. `device_type` varchar(30) DEFAULT NULL,
    10. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    11. PRIMARY KEY (`id`)
    12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
    13. --
    14. -- 转存表中的数据 `record`
    15. --
    16. INSERT INTO `record` (`id`, `ip`, `os`, `browser`, `device_type`, `create_time`) VALUES
    17. (1, 'localhost', 'Windows 11', '帅龍之龍', 'Android', '2021-11-13 17:33:24'),
    18. (2, '0:0:0:0:0:0:0:1', 'WINDOWS_10', 'CHROME', 'Computer', '2021-11-13 17:43:54'),
    19. (3, '0:0:0:0:0:0:0:1', 'WINDOWS_10', 'CHROME', 'Computer', '2021-11-13 17:48:28'),
    20. (4, '127.0.0.1', 'WINDOWS_10', 'CHROME', 'Computer', '2021-11-13 17:49:38'),
    21. (5, '127.0.0.1', 'WINDOWS_10', 'CHROME', 'Computer', '2021-11-13 17:54:42'),
    22. (6, '192.168.0.101', 'Windows 10', 'Chrome 9', 'Computer', '2023-10-09 14:18:32'),
    23. (7, '192.168.0.101', 'Windows 10', 'Chrome 9', 'Computer', '2023-10-09 14:19:29');

    十、运行效果

    (1)德鲁伊登录页面

    (2)查询示例

  • 相关阅读:
    命令行参数
    旅游景区IP网络广播系统方案-旅游风景区景点IP网络广播建设指南
    SAP ABAP debug的七种方法及错误消息定位
    c语言实现面向对象编程(const * ,* const)
    Reids实战——分布式锁优化(Lua脚本)
    spark性能优化调优指导性文件
    【JavaWeb】JSP基本语法、指令、九大内置对象、四大作用域
    【数据分析入门】Seaborn[散点图、条形图、计数图、热力图、箱型图、小提琴图]
    数据⼀致性模型有哪些?
    uniapp——uicloud云服务(增删改查)
  • 原文地址:https://blog.csdn.net/Cai181191/article/details/133686732