单表CRUD后端代码生成实现

Posted dingwen_blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单表CRUD后端代码生成实现相关的知识,希望对你有一定的参考价值。

前言

慢慢发现,单张表的增删改查从控制层到数据访问层几乎都是机械式代码。为此,产生了提出公用代码的想法。本篇文章将展现第一版本的实现,主要包括基于SpringBoot2.X的starter实现以及使用的案例组成。

1. 版本环境说明

  • SpringBoot 2.5.2
  • Maven 3.5.0
  • JDK 1.8
  • Knife4j 2.0.7
  • mysql 8.0.15
  • Mybatis-plus 3.4.2
  • FastJson 1.2.75
  • Validation 2.5.2

2. 简介

基于Mybatis-plus实现的单表CRUD从数据访问层到控制层的封装,集成了knifefj实现API文档,以及统一异常处理,返回结果封装,基于Bean Validation的参数校验,log4j等。

3. 功能

主要包括单表的从控制层到数据访问层及实体层的通用代码实现,详细信息自行查阅API文档。

在这里插入图片描述

4. 项目结构预览

在这里插入图片描述

完整代码地址: https://gitee.com/dingwen-gitee/dingwen-frame-starter.git

5. 使用

5.1 准备

5.1.1 数据库环境: 此处一Mysql为例,准备了两张数据表作为测试。

/*
 Navicat Premium Data Transfer

 Source Server         : 192.168.233.131
 Source Server Type    : MySQL
 Source Server Version : 80023
 Source Host           : 192.168.233.131:3306
 Source Schema         : stu_myb_plu

 Target Server Type    : MySQL
 Target Server Version : 80023
 File Encoding         : 65001

 Date: 02/07/2021 14:53:42
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_department
-- ----------------------------
DROP TABLE IF EXISTS `sys_department`;
CREATE TABLE `sys_department`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统部门表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_department
-- ----------------------------
INSERT INTO `sys_department` VALUES (1, '研发部');
INSERT INTO `sys_department` VALUES (2, '产品部');

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `age` int(0) NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `manager_id` bigint(0) NULL DEFAULT NULL COMMENT '该用户直属上级用户ID',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `deleted` int(0) NULL DEFAULT 0 COMMENT '逻辑删除标识,0-未删除,1-已删除',
  `version` int(0) NULL DEFAULT 1 COMMENT '版本',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 112 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统用户表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (100, 'dingwen', 40, 'boss@baomidou.com', 1, '2021-01-22 01:48:00', 0, 2);
INSERT INTO `sys_user` VALUES (101, 'Jack', 40, 'boss@baomidou.com', 1, '2021-01-22 09:48:00', 0, 1);
INSERT INTO `sys_user` VALUES (102, 'WeiBo', 24, 'boss@baomidou.com', 1, '2022-01-22 01:48:00', 0, 2);
INSERT INTO `sys_user` VALUES (103, 'Lucy', 24, 'boss@baomidou.com', 2, '2021-02-22 09:48:00', 0, 1);
INSERT INTO `sys_user` VALUES (104, 'dingwen', 24, 'boss@baomidou.com', 2, '2021-02-22 09:48:00', 0, 1);
INSERT INTO `sys_user` VALUES (105, 'kafka', 0, 'lucy@fdjf.com', 4, '2021-06-08 09:32:09', 0, 1);
INSERT INTO `sys_user` VALUES (106, 'eason', 0, '1981723769@qq.com', 0, '2021-06-29 07:59:22', 0, 0);
INSERT INTO `sys_user` VALUES (111, 'alibaba', 66, '1981723769@qq.com', 0, '2021-06-29 10:07:53', 0, 0);

SET FOREIGN_KEY_CHECKS = 1;

5.1.2 安装查询生成代码

在这里插入图片描述

Free Mybatis plugin 安装完成后IDEA会有一个other选项,我们在这里进行代码生成。

在这里插入图片描述

5.1.3 配置数据库连接

other 里面选择 config database,进行配置测试,测试成功关闭即可。

在这里插入图片描述

5.1.4 准备jar

准备好dingwen-frame-starter确定本地maven环境正常,执行mvn clean install。将工具包安装到本地仓。

5.1.5 新建测试项目

在这里插入图片描述
在这里插入图片描述

5.1.5 依赖

依赖文件不完整自行补充。

    <properties>
        <java.version>1.8</java.version>
        <mysql.connector.version>8.0.15</mysql.connector.version>
    </properties>

		 <!--工具包-->
        <dependency>
            <groupId>com.dingwen</groupId>
            <artifactId>dingwen-frame-starter</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

5.1.6 基础配置

server:
  port: 8081
logging:
  config: classpath:log/logback-spring.xml

spring:
  datasource:
    url: jdbc:mysql://192.168.233.131:3306/stu_myb_plu?characterEncoding=utf-8&useSSL=true&serverTimezone=GMT
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456


  mvc:
    static-path-pattern: /**

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
  global-config:
    banner: false
  mapper-locations: classpath*:mapper/*.xml

  spring:
    profiles:
      active: dev

在这里插入图片描述

5.1.7 生成代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看自动生成的代码。

在这里插入图片描述

编写controller集成我们自己封装的工具包。

/**
 * <p>
 * 系统用户表 前端控制器
 * </p>
 *
 * @author dingwen
 * @since 2021-07-02
 */
@Api(tags = "用户")
@RestController
@RequestMapping("/users")
public class SysUserController extends BaseControllerImpl<SysUser> {

    public SysUserController(IService<SysUser> iService) {
        super(iService);
    }
}

/**
 * <p>
 * 系统部门表 前端控制器
 * </p>
 *
 * @author dingwen
 * @since 2021-07-02
 */
@Api(tags = "部门")
@RestController
@RequestMapping("/departments")
public class SysDepartmentController extends BaseControllerImpl<SysDepartment> {

    public SysDepartmentController(IService<SysDepartment> iService) {
        super(iService);
    }
}

5.1.8 在实体中添加校验规则方便测试

在这里插入图片描述

5.1.9 在mapper中添加注解

在这里插入图片描述

5.1.10 添加Mybatis-plus配置

在这里插入图片描述

package com.dingwen.frates.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis-plus 配置
 *
 * @author dingwen
 * @date 2021.05.11 17:00
 * @since 1.0.0-SNAPSHOT
 */
@Configuration
@MapperScan("com.dingwen.frates.mapper")
public class MybatisPlusAutoConfiguration {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

        // 自动分页插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        // 防止全表更新、删除插件
        mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());

        // 乐观锁配置
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return mybatisPlusInterceptor;
    }
}

非必须

package com.dingwen.frates.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;

/**
 *  自动填充处理器
 *
 * @author dingwen
 * @date 2021.06.08 17:13
 * @since 1.0.0-SNAPSHOT
 */
@Configuration
public class MyMetaObjectHandlerConfiguration implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 注意此处是实体属性名称
        strictFillStrategy(metaObject,"createTime",LocalDateTime::now);
    }

    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

6.开始测试

6.1 启动项目访问

http://localhost:8081/doc.html#/home

可以看到基础的增删改查都写好了。

在这里插入图片描述
在这里插入图片描述

6.2 查询所有测试

在这里插入图片描述

6.3 分页查询

在这里插入图片描述


# 结果
{
  "code": 200,
  "currentTime": "2021-07-02 15:47:12",
  "data": {
    "countId": "",
    "current": 1,
    "hitCount": false,
    "optimizeCountSql": true,
    "orders": [],
    "pages": 4,
    "records": [
      {
        "age": 40,
        "createTime": "2021-01-22 01:48:00",
        "deleted": 0,
        "email": "boss@baomidou.com",
        "id": 100,
        "managerId": 1,
        "name": "dingwen",
        "version": 2
      },
      {
        "age": 40,
        "createTime": "2021-01-22 09:48:00",
        "deleted": 0,
        "email": "boss@baomidou.com",
        "id": 101,
        "managerId": 1,
        "name": "dingwen",
        "version": 1
      }
    ],
    "searchCount": true,
    "size": 2,
    "total": 8
  },
  "message": "成功"
}

部门表也是一致。

在这里插入图片描述

6.4 修改单条记录

在这里插入图片描述
在这里插入图片描述

age校验。

在这里插入图片描述
在这里插入图片描述

其他方法类似。

7. 完善与更新

  • 切面日志(异步实现)
  • 进一步完善BaseController封装
  • 基础工具类封装(Hutool ? 等待确定)
  • doc文档注释部分乱码问题
  • 多数据源问题

以上是关于单表CRUD后端代码生成实现的主要内容,如果未能解决你的问题,请参考以下文章

纯 Java 撸个后台管理系统,这框架用起来贼好

oracle表的crud(增删改查)单表

Spring07_纯注解实战及Spring整合Junit

Spring07_纯注解实战及Spring整合Junit

单表CRUD-半注解

6MySQL之常见的单表CRUD操作