【笑小枫的SpringBoot系列】【三】SpringBoot集成Mybatis Plus

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【笑小枫的SpringBoot系列】【三】SpringBoot集成Mybatis Plus

3. 集成Mybatis Plus


3.1 配置基础依赖⚙️


👉首先,项目中会使用到mysql、mybatis-plus、druid数据连接池等等功能,接下来我们就一一讲解一下。


依赖名称 依赖描述 版本
mysql-connector-java:mysql-connector-java mysql驱动 8.0.29
com.alibaba:druid 阿里巴巴Druid数据库连接池
com.baomidou:mybatis-plus-boot-starter mybatis-plus的依赖 3.5.2
com.baomidou:mybatis-plus-generator mybatis-plus的自动生成代码插件
org.apache.velocity:velocity-engine-core Java 的模板引擎框架,用于代码自动生成 2.3
org.projectlombok:lombok 代码简化,getter/setter、构造器编译时生成
com.alibaba:fastjson 阿里巴巴Json操作工具类 2.0.7


完整的pom.xml文件如下:👇


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.maple</groupId>
  <artifactId>maple-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>maple-demo</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java-version>1.8</java-version>
    <lombok-version>1.18.24</lombok-version>
    <druid-version>1.2.11</druid-version>
    <mybatis-plus-version>3.5.2</mybatis-plus-version>
    <velocity-version>2.3</velocity-version>
    <fastjson-version>2.0.7</fastjson-version>
    <mysql-connector-version>8.0.29</mysql-connector-version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- 引入web相关 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--使用Mysql数据库-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql-connector-version}</version>
    </dependency>
    <!--使用阿里巴巴druid数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>${druid-version}</version>
    </dependency>
    <!-- mybatis-plus的依赖 -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>${mybatis-plus-version}</version>
    </dependency>
    <!-- mybatis-plus的自动生成代码插件 -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>${mybatis-plus-version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
      <version>${velocity-version}</version>
    </dependency>
    <!--Lombok管理Getter/Setter/log等-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
      <version>${lombok-version}</version>
    </dependency>
    <!-- 处理JSON -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>${fastjson-version}</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

3.2 引入Mysql配置


👉首先我们需要创建一个Mysql数据库maple,字符集选择utf8。这里我们使用的工具是Navicat Premium 11。当然其他工具都是一样,没有特使要求。


25eb187163dcd1b81a862f7fb12ccb6a.png

👉创建一张usc_user表,当然有很多字段我们可能暂且不需要,暂且保留,sql如下:👇

CREATE TABLE `usc_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `account` varchar(30) DEFAULT NULL COMMENT '用户账号',
  `user_name` varchar(30) DEFAULT NULL COMMENT '用户姓名',
  `nick_name` varchar(30) DEFAULT NULL COMMENT '用户昵称',
  `user_type` varchar(2) DEFAULT '00' COMMENT '用户类型(00系统用户,01小程序用户)',
  `email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
  `phone` varchar(11) DEFAULT '' COMMENT '手机号码',
  `sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
  `avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
  `salt` varchar(32) DEFAULT NULL COMMENT '用户加密盐值',
  `password` varchar(100) DEFAULT '' COMMENT '密码',
  `status` char(1) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `create_name` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_id` bigint(20) DEFAULT NULL COMMENT '更新人id',
  `update_name` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `delete_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户中心-用户信息表';


👉创建好数据库后,配置我们项目的application.yml文件

server:
  port: 6666
spring:
  application:
    name: maple-admin
  # 配置数据库连接
  datasource:
    # 数据库连接地址及常用配置
    url: jdbc:mysql://127.0.0.1:3306/maple?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
    # 数据库连接驱动
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据库用户
    username: root
    # 数据库用户密码
    password: 123456
    # 配置druid数据库连接池---------------------------------------
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 初始化大小,最小,最大
      initialSize: 5
      minIdle: 5
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 校验SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery项,则下面三项配置无用
      validationQuery: SELECT 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 合并多个DruidDataSource的监控数据
      useGlobalDataSourceStat: true
# 配置mybatis-plus的xml和bean的目录
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    # 开启驼峰功能
    map-underscore-to-camel-case: true
    # 日志打印功能
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #逻辑删除配置
  global-config:
    db-config:
      # 逻辑已删除值(默认为 1)
      logic-delete-value: 1
      # 逻辑未删除值(默认为 0)
      logic-not-delete-value: 0


至此,我们的数据库配置已经完成✌。接下来我们配置一下Mybatis-plus。


3.3 引入MyBatis-Plus配置


配置MyBatis-Plus


  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis-Plus是基于MyBatis框架进一步的封装,增强了MyBatis的功能,只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间,以及一些常用工具的封装。
  • MyBatis中文文档地址:https://mybatis.org/mybatis-3/zh/index.html
  • MyBatis-Plus官方地址:https://baomidou.com/

接下来我们就一起配置一下MyBatis-Plus:

这里我们会使用Mybatis-plus生成代码、分页、逻辑删除、常用字段自动注入数据等插件。

👉首先是application.yml

# 配置mybatis-plus的xml和bean的目录
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true    # 开启驼峰功能
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl    # 日志打印功能
  global-config:  #逻辑删除配置
    db-config:
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

然后我们在com.maple.demo下创建config目录存放我们的系统配置,在config目录创建MybatisPlusConfig.java文件

这里配置下Mybaits的自动填充机制和druid监控页面


package com.maple.demo.config;
import com.alibaba.druid.support.http.StatViewServlet;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.servlet.Servlet;
import java.util.Date;
/**
 * Mybatis plus配置
 *
 * @author 笑小枫
 * @date 2022/7/10
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.maple.demo.mapper")
public class MybatisPlusConfig implements MetaObjectHandler {
    /**
     * 新增时,自动填充数据
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("isDeleted", false, metaObject);
        this.setFieldValByName("createId", 1L, metaObject);
        this.setFieldValByName("createName", "占位符", metaObject);
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateId", 1L, metaObject);
        this.setFieldValByName("updateName", "占位符", metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    /**
     * 修改时,自动填充数据
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateId", 1L, metaObject);
        this.setFieldValByName("updateName", "占位符", metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    /**
     * 配置druid监控服务器
     *
     * @return 返回监控注册的servlet对象
     */
    @Bean
    public ServletRegistrationBean<Servlet> statViewServlet() {
        ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        // 添加IP白名单,如果不需要黑名单、白名单的功能,注释掉即可
        servletRegistrationBean.addInitParameter("allow", "192.168.25.125,127.0.0.1");
        // 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
        servletRegistrationBean.addInitParameter("deny", "192.168.25.123");
        // 添加控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", "druid");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        // 是否能够重置数据
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }
}

其中,createId、createName暂时使用占位符,后期结合登录后从JWT里面获取。


配置自动生成代码插件


👉首先创建BaseEntity.java,所有的实体类都继承该对象,用于存放系统字段,代码如下👇

package com.maple.demo.config.bean;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @author 笑小枫
 * @date 2022/7/11
 */
@Data
public class BaseEntity implements Serializable {
    @TableId(type = IdType.AUTO)
    protected Long id;
    @ApiModelProperty("创建人id")
    @TableField(value = "create_id", fill = FieldFill.INSERT)
    private Long createId;
    @ApiModelProperty("创建人名称")
    @TableField(value = "create_name", fill = FieldFill.INSERT)
    private String createName;
    @ApiModelProperty("创建时间")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    @ApiModelProperty("更新人id")
    @TableField(value = "update_id", fill = FieldFill.INSERT_UPDATE)
    private Long updateId;
    @ApiModelProperty("更新人名称")
    @TableField(value = "update_name", fill = FieldFill.INSERT_UPDATE)
    private String updateName;
    @ApiModelProperty("更新时间")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}


👉配置MyBatis-Plus代码生成工具,在com.maple.demo目录下创建util目录,用于存放工具类。

然后创建Generator.java,代码如下:👇

package com.maple.demo.util;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.maple.demo.config.bean.BaseEntity;
/**
 * MyBatis-Plus代码生成工具
 *
 * @author 笑小枫
 * @date 2019/4/25
 */
public class Generator {
    public static void main(String[] args) {
        // 设置作者
        String auth = "笑小枫";
        // 设置父包名
        String packageName = "com.maple.demo";
        // 设置父包模块名
        String moduleName = "";
        // 指定输出目录
        String path = "D:";
        String url = "jdbc:mysql://127.0.0.1:3306/maple?useUnicode=true&useSSL=false&characterEncoding=utf8";
        String username = "root";
        String password = "*****";
        // 设置需要生成的表名
        String table = "usc_user";
        // 设置过滤表前缀
        String[] tablePrefix = {"usc_", "sys_"};
        generateTest(auth, packageName, path, moduleName, url, username, password, table, tablePrefix);
    }
    private static void generateTest(String auth, String packageName, String path, String moduleName,
                                     String url, String username, String password, String table, String[] tablePrefix) {
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> builder.author(auth)
                        // 开启 swagger 模式
                        .enableSwagger()
                        .outputDir(path))
                .packageConfig(builder -> builder.parent(packageName)
                                .moduleName(moduleName)
                        // 设置mapperXml生成路径
                        //.pathInfo(Collections.singletonMap(OutputFile.xml, path))
                )
                .strategyConfig(builder -> builder.addInclude(table)
                        .addTablePrefix(tablePrefix)
                        .entityBuilder().superClass(BaseEntity.class).enableLombok().logicDeleteColumnName("delete_flag")
                        .controllerBuilder().enableRestStyle()
                )
                .execute();
    }
}

注意:适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!3.5.1 以下的请参考代码生成器旧


  • superClass(BaseEntity.class):entity使用父类BaseEntity.class,减少id、创建人、修改人等系统字段
  • .enableSwagger():我们配置了knife4j,所以我们开启swagger模式,这样会自动生成一些swagger的注解
  • logicDeleteColumnName(“delete_flag”):开启逻辑删除
  • enableLombok():项目使用lombok,减少getter/setter代码的编写,使用插件编译时自动生成
  • controllerBuilder().enableRestStyle():controller使用Rest代码风格


👉然后我们执行该Main方法


c48326c22edfa7963770c80416e6f73f.png

然后会在配置的目录下生成com文件夹,本文的在D:盘下。

我们将代码复制到我们的项目中,此时的项目代码结构如下如:👇

afe7df05c58ad439707bfefaf7b03849.png


3.3 功能测试👌


编写一个测试用例测试一下吧

在UserController.java文件中添加新增用户和根据ID查询用户信息的接口👇


package com.maple.demo.controller;
import com.maple.demo.entity.User;
import com.maple.demo.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 * 用户中心-用户信息表 前端控制器
 * </p>
 *
 * @author 笑小枫
 * @since 2022-07-11
 */
@RestController
@RequestMapping("/user")
@AllArgsConstructor
@Api(tags = "用户信息管理")
public class UserController {
    private final IUserService userService;
    @ApiOperation(value = "插入用户信息")
    @PostMapping("/insert")
    public User insert(@RequestBody User user){
         userService.save(user);
         return user;
    }
    @ApiOperation(value = "根据用户ID查询用户信息")
    @GetMapping("/selectById")
    public User selectById(Long userId){
        return userService.getById(userId);
    }
}

这是我们在打开我们的Knife4j,可以在Swagger Models里面看到我们添加的User对象👇


544fa79427cc9785a901aebc06cf35dc.png



在用户信息管理里面可以看到我们的接口信息,我们先调用一下插入方法。

参数我们只保留简单的几个,如下👇

{
  "account": "xiaoxiaofeng",
  "email": "1150640979@qq.com",
  "nickName": "笑小枫",
  "password": "123456",
  "phone": "18300000000",
  "userName": "笑小枫"
}


调用结果如下图所示👇

c1283469c72dc7bf15e87253e4c9c4a1.png


可以看到数据里面,我们的数据已经插入进去了👇


c65bbdfd5fc27d699e50ec4ad2b7848f.png


接下来我们调用查询接口看一下👇


dbb4e0940fe1f878922fd4e96b98d652.png

OK,大功告成✌️

我们在上文中配置阿里巴巴的Druid数据库连接池,那么我们怎么可以看一下我们的sql执行情况呢?

可以在浏览器输入:http://127.0.0.1:6666/druid

在SQL监控中可以看到我们的sql执行情况,以及一些慢sql的分析👇


47a71d0a3d4baeea5b6bce39e694f7e1.png


小结


好啦,本文就到这里了,我们简单的总结一下,主要介绍了以下内容

  • SpringBoot集成mysql数据库
  • 集成Mybatis Plus框架
  • 通过一个简单的例子演示了一下使用Mybatis Plus进行数据插入和查询
  • 使用Knife4j进行接口调试
  • 集成阿里巴巴Druid数据连接池
  • 通过Druid页面进行执行sql查询、分析


关于笑小枫💕


本章到这里结束了,喜欢的朋友关注一下我呦,大伙的支持,就是我坚持写下去的动力。

后续文章会陆续更新,文档会同步在微信公众号、个人博客、CSDN和GitHub保持同步更新。

微信公众号:笑小枫

笑小枫个人博客:https://www.xiaoxiaofeng.com

CSDN:https://zhangfz.blog.csdn.net

GitHub文档:https://github.com/hack-feng/maple-demo


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
SQL Java 数据库连接
SpringBoot整合Mybatis
SpringBoot整合Mybatis
28 2
|
1天前
|
Java 数据库连接 Spring
Spring 整合mybatis
Spring 整合mybatis
19 2
|
1天前
|
NoSQL Java MongoDB
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
【5月更文挑战第11天】本文介绍了如何将非关系型数据库MongoDB与Spring Boot框架集成,以实现高效灵活的数据管理。Spring Boot简化了Spring应用的构建和部署,MongoDB则以其对灵活数据结构的处理能力受到青睐。集成步骤包括:添加MongoDB依赖、配置连接信息、创建数据访问对象(DAO)以及进行数据操作。通过这种方式,开发者可以充分利用两者优势,应对各种数据需求。在实际应用中,结合微服务架构等技术,可以构建高性能、可扩展的系统。掌握MongoDB与Spring Boot集成对于提升开发效率和项目质量至关重要,未来有望在更多领域得到广泛应用。
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
|
1天前
|
消息中间件 JSON Java
RabbitMQ的springboot项目集成使用-01
RabbitMQ的springboot项目集成使用-01
|
1天前
|
搜索推荐 Java 数据库
springboot集成ElasticSearch的具体操作(系统全文检索)
springboot集成ElasticSearch的具体操作(系统全文检索)
|
1天前
|
消息中间件 Java Spring
Springboot 集成Rabbitmq之延时队列
Springboot 集成Rabbitmq之延时队列
6 0
|
1天前
|
网络协议 Java Spring
Springboot 集成websocket
Springboot 集成websocket
11 0
|
1天前
|
XML Java 数据库
springboot集成flowable
springboot集成flowable
|
1天前
|
JSON Java 数据格式
nbcio-boot升级springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json问题
nbcio-boot升级springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json问题
|
1天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通