单表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后端代码生成实现的主要内容,如果未能解决你的问题,请参考以下文章