SpringBoot集成MyBatisPlus 使用,实战篇

向右看齐 2024-03-22 12:11 187阅读 0赞

文章目录

  • 前言
  • 特性
  • 代码实战
    • mysql 建表语句
    • pom 配置
    • yml配置
    • 代码生成器(神器)
    • 分页配置
    • 公共字段填充(神器)
    • controller 测试代码

前言

MyBatis-Plus (简称 MP)在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官网地址:
https://baomidou.com/pages/24112f/

在这里插入图片描述

特性

  • 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小 :启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作,BaseMapper
  • 强大的 CRUD 操作 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,简单的CRUD操作不用自己编写。
  • 支持 Lambda 形式调用 :通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成 :支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式 :支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器 :采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动生成代码)
  • 内置分页插件 :基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库 :支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件 :可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件 :提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

代码实战

mysql 建表语句

使用 mybatisplus 需要先确定表结构,下面就是测试用的表结构。

  1. create table t_user (
  2. id int (10) primary key auto_increment comment '用户主键',
  3. username varchar (100) not null comment '用户名称',
  4. pwd varchar(50) not null comment '密码',
  5. create_time datetime not null comment '创建时间',
  6. update_time datetime comment '修改时间'
  7. ) engine = innodb default charset = utf8 collate = utf8_bin comment '用户表';

pom 配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <groupId>org.example</groupId>
  6. <artifactId>springboot-learning-parents</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <groupId>springboot-demo</groupId>
  11. <artifactId>springboot-mybatisplus</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. <name>springboot-mybatisplus</name>
  14. <description>springboot 集成 mybatisplus</description>
  15. <packaging>jar</packaging>
  16. <url>https://gitee.com/leo825/springboot-learning-parents.git</url>
  17. <properties>
  18. <start-class>com.demo.SpringbootMybatisplusApplication</start-class>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  21. <java.version>1.8</java.version>
  22. <mybatisplus.version>3.5.1</mybatisplus.version>
  23. <freemaker.version>2.3.31</freemaker.version>
  24. <mysql.version>8.0.28</mysql.version>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-web</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.projectlombok</groupId>
  37. <artifactId>lombok</artifactId>
  38. <optional>true</optional>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-test</artifactId>
  43. <scope>test</scope>
  44. </dependency>
  45. <!-- mybatis-plus 所需依赖 -->
  46. <dependency>
  47. <groupId>com.baomidou</groupId>
  48. <artifactId>mybatis-plus-boot-starter</artifactId>
  49. <version>${mybatisplus.version}</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>com.baomidou</groupId>
  53. <artifactId>mybatis-plus-generator</artifactId>
  54. <version>${mybatisplus.version}</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.freemarker</groupId>
  58. <artifactId>freemarker</artifactId>
  59. <version>2.3.31</version>
  60. </dependency>
  61. <!-- mysql 驱动 -->
  62. <dependency>
  63. <groupId>mysql</groupId>
  64. <artifactId>mysql-connector-java</artifactId>
  65. <version>${mysql.version}</version>
  66. </dependency>
  67. </dependencies>
  68. <build>
  69. <plugins>
  70. <plugin>
  71. <groupId>org.springframework.boot</groupId>
  72. <artifactId>spring-boot-maven-plugin</artifactId>
  73. </plugin>
  74. </plugins>
  75. </build>
  76. </project>

yml配置

  1. # springboot多环境配置
  2. #端口,项目上下文
  3. server:
  4. port: 8080
  5. servlet:
  6. context-path: /springboot-mybatisplus
  7. spring:
  8. # mysql 数据库连接信息,本地使用 mysql 服务版本为:8.0.28
  9. datasource:
  10. username: root
  11. password: 6tojyh*A3eQ6
  12. url: jdbc:mysql://localhost:3306/local_test?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
  13. driver-class-name: com.mysql.cj.jdbc.Driver
  14. # mybatis-plus 配置
  15. mybatis-plus:
  16. mapper-locations: classpath*:/mapper/**/*.xml
  17. #实体扫描,多个package用逗号或者分号分隔
  18. typeAliasesPackage: com.dmo.entity
  19. global-config:
  20. #数据库相关配置
  21. db-config:
  22. #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
  23. id-type: AUTO
  24. #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
  25. field-strategy: NOT_NULL
  26. #驼峰下划线转换
  27. column-underline: true
  28. logic-delete-value: -1
  29. logic-not-delete-value: 0
  30. banner: false
  31. #原生配置
  32. configuration:
  33. # 打印sql
  34. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  35. map-underscore-to-camel-case: true
  36. cache-enabled: false
  37. call-setters-on-nulls: true
  38. jdbc-type-for-null: 'null'
  39. # 日志输出配置
  40. logging:
  41. level:
  42. root: INFO
  43. org:
  44. springframework:
  45. security: WARN
  46. web: ERROR
  47. # 设置自己的 mapper 目录 输出sql日志
  48. com.demo.mapper: debug
  49. file:
  50. path: ./logs
  51. name: './logs/springboot-mybatisplus.log'
  52. pattern:
  53. file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'
  54. console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n'

代码生成器(神器)

使用代码生成器,把以前用于 CURD 的代码一键生成,大大节省了时间提高了效率,把原本1天的工作量,1个小时就能完成。
MybatisPlusGenerator.java

  1. package com.demo.util;
  2. import com.baomidou.mybatisplus.annotation.FieldFill;
  3. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  4. import com.baomidou.mybatisplus.generator.config.*;
  5. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  6. import com.baomidou.mybatisplus.generator.fill.Column;
  7. import java.util.Collections;
  8. /**
  9. * MybatisPlusGenerator 代码生成神器
  10. */
  11. public class MybatisPlusGenerator {
  12. public static void main(String[] args) {
  13. // mysql 连接
  14. FastAutoGenerator.create("jdbc:mysql://localhost:3306/local_test?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true", "root", "6tojyh*A3eQ6")
  15. .globalConfig(builder -> {
  16. builder.author("springBoot-Learning") // 设置作者
  17. //.enableSwagger() // 开启 swagger 模式
  18. .fileOverride() // 覆盖已生成文件
  19. .outputDir(System.getProperty("user.dir")+"/springboot-mybatisplus/src/main/java"); // 指定输出目录
  20. })
  21. .packageConfig(builder -> {
  22. builder.parent("com") // 设置父包名
  23. .moduleName("demo") // 设置父包模块名
  24. // .service() // 设置自定义service路径,不设置就是默认路径
  25. .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +"/src/main/resources/mapper/")); // 设置mapperXml生成路径
  26. })
  27. .strategyConfig(builder -> {
  28. builder.addInclude("t_user") // 设置需要生成的表名
  29. .addTablePrefix("t_", "c_")
  30. // 设置自动填充的时间字段
  31. .entityBuilder().addTableFills(
  32. new Column("create_time", FieldFill.INSERT),new Column("update_time", FieldFill.INSERT_UPDATE))
  33. ; // 设置过滤表前缀
  34. })
  35. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
  36. .execute();
  37. }
  38. }

生成结果如下:
代码生成

分页配置

  1. package com.demo.config;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. /**
  8. * mybatisplus 配置
  9. */
  10. @Configuration
  11. public class MybatisPlusConfig {
  12. /**
  13. * 老版本,目前已失效
  14. * @return
  15. */
  16. /**@Bean
  17. public PaginationInterceptor paginationInterceptor() {
  18. PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  19. return paginationInterceptor;
  20. }*/
  21. /**
  22. * 新的分页插件,一缓和二缓遵循mybatis的规则,
  23. */
  24. @Bean
  25. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  26. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  27. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  28. return interceptor;
  29. }
  30. }

公共字段填充(神器)

  1. package com.demo.config;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.ibatis.reflection.MetaObject;
  5. import org.springframework.stereotype.Component;
  6. import java.time.LocalDateTime;
  7. /**
  8. * 填充公共字段
  9. *
  10. */
  11. @Slf4j
  12. @Component
  13. public class MyMetaObjectHandler implements MetaObjectHandler {
  14. @Override
  15. public void insertFill(MetaObject metaObject) {
  16. log.info("start insert fill...");
  17. this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
  18. this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
  19. }
  20. @Override
  21. public void updateFill(MetaObject metaObject) {
  22. log.info("start update fill...");
  23. this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
  24. }
  25. }

controller 测试代码

  1. package com.demo.controller;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.demo.base.Result;
  7. import com.demo.entity.User;
  8. import com.demo.service.IUserService;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.bind.annotation.GetMapping;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import java.util.List;
  14. /**
  15. * controller 测试
  16. *
  17. */
  18. @RestController
  19. @RequestMapping("/user")
  20. public class UserController {
  21. /**
  22. * 构造方法注入
  23. */
  24. @Autowired
  25. IUserService userService;
  26. /**
  27. * 保存数据
  28. *
  29. * @return
  30. */
  31. @GetMapping("/save")
  32. public Result save() {
  33. User user = new User();
  34. user.setUsername("miaolinlin");
  35. user.setPwd("121212");
  36. userService.save(user);
  37. return new Result().ok(user);
  38. }
  39. /**
  40. * 修改数据
  41. *
  42. * @param id
  43. * @return
  44. */
  45. @GetMapping("/update")
  46. public Result update(Integer id) {
  47. User user = new User();
  48. user.setId(id);
  49. user.setPwd("1111111111");
  50. userService.updateById(user);
  51. return new Result().ok("{}");
  52. }
  53. @GetMapping("/list")
  54. public Result list() {
  55. // 返回所有
  56. List<User> list = userService.list();
  57. return new Result().ok(list);
  58. }
  59. @GetMapping("/listByContion")
  60. public Result listByContion() {
  61. /**
  62. * 条件查询, 通过QueryWrapper来实现查询的条件:
  63. * eq: 代表相等
  64. * like: 模糊匹配
  65. * orderBy: 排序
  66. * in, notin
  67. * 大于,小于,between等
  68. */
  69. List<User> list = userService.list(new LambdaQueryWrapper<User>()
  70. // 查询年龄=11的
  71. .eq(User::getUsername, "miao")
  72. // 模糊匹配
  73. .like(User::getPwd, "%111%")
  74. // 排序,按照创建时间
  75. .orderByDesc(User::getCreateTime)
  76. );
  77. return new Result().ok(list);
  78. }
  79. /**
  80. * 根据id获取数据
  81. *
  82. * @param id
  83. * @return
  84. */
  85. @GetMapping("/getById")
  86. public Result getById(Integer id) {
  87. User user = userService.getById(id);
  88. return new Result().ok(user);
  89. }
  90. /**
  91. * 删除数据
  92. *
  93. * @param id
  94. * @return
  95. */
  96. @GetMapping("/delete")
  97. public Result delete(Integer id) {
  98. userService.removeById(id);
  99. return new Result().ok("success");
  100. }
  101. /**
  102. * 分页查询
  103. *
  104. * @param pageNum
  105. * @param pageSize
  106. * @param name
  107. * @return
  108. */
  109. @GetMapping("/page")
  110. public Result page(int pageNum, int pageSize, String name) {
  111. IPage<User> page = new Page<>(pageNum, pageSize);
  112. IPage<User> page1 = userService.page(page, new LambdaQueryWrapper<User>()
  113. // 主要演示这里可以加条件。在name不为空的时候执行
  114. .like(StringUtils.isNotEmpty(name), User::getUsername, "%" + name + "%"));
  115. return new Result().ok(page1);
  116. }
  117. }

发表评论

表情:
评论列表 (有 0 条评论,187人围观)

还没有评论,来说两句吧...

相关阅读