关于springboot:笑小枫的SpringBoot系列三SpringBoot集成Mybatis-Plus

47次阅读

共计 13273 个字符,预计需要花费 34 分钟才能阅读完成。

3. 集成 Mybatis Plus

3.1 配置根底依赖⚙️

👉首先,我的项目中会应用到 mysql、mybatis-plus、druid 数据连接池等等性能,接下来咱们就一一解说一下。

依赖名称 依赖形容 版本
mysql-connector-java:mysql-connector-java mysql 驱动 8.0.29
com.alibaba:druid 阿里巴巴 Druid 数据库连接池 1.2.11
com.baomidou:mybatis-plus-boot-starter mybatis-plus 的依赖 3.5.2
com.baomidou:mybatis-plus-generator mybatis-plus 的主动生成代码插件 3.5.2
org.apache.velocity:velocity-engine-core Java 的模板引擎框架,用于代码主动生成 2.3
org.projectlombok:lombok 代码简化,getter/setter、结构器编译时生成 1.18.24
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。当然其余工具都是一样,没有特使要求。

👉创立一张 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 = "Zhang123";
        // 设置须要生成的表名
        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 办法

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

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

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 对象👇

在用户信息管理外面能够看到咱们的接口信息,咱们先调用一下插入方法。

参数咱们只保留简略的几个,如下👇

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

调用后果如下图所示👇

能够看到数据外面,咱们的数据曾经插入进去了👇

接下来咱们调用查问接口看一下👇

OK,功败垂成✌️

咱们在上文中配置阿里巴巴的 Druid 数据库连接池,那么咱们怎么能够看一下咱们的 sql 执行状况呢?

能够在浏览器输出:http://127.0.0.1:6666/druid

在 SQL 监控中能够看到咱们的 sql 执行状况,以及一些慢 sql 的剖析👇

小结

好啦,本文就到这里了,咱们简略的总结一下,次要介绍了以下内容

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

本文源码:https://github.com/hack-feng/maple-demo

正文完
 0