我真的是懒啊,是真不想写增删改查接口,所以试着写了一套通用增删改查(默认实现,复杂的需要自行重写方法),主要是由EntityController
、EntityService
、EntityServiceImpl
完成。只要按规范继承了相关类,即可拥有增删改查功能。真就建好表,不用写一行代码就实现基础的增删改查。仓库:wonder-server
相关说明
核心
EntityController
提供6个基础的增删改查接口EntityService
定义基础的接口EntityServiceImpl
提供默认实现
就拿图书表简单的举个例子
-
建立一张数据库表
sqlCREATE TABLE `ex_book` ( `id` bigint NOT NULL, `name` varchar(20) DEFAULT NULL COMMENT '名称', `number` int DEFAULT NULL COMMENT '数量', `status` int DEFAULT NULL COMMENT '状态 0-维护中,1-正常,2-借出', `price` decimal(8,2) DEFAULT NULL COMMENT '单价', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `create_by` bigint DEFAULT NULL COMMENT '创建人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `update_by` bigint DEFAULT NULL COMMENT '更新人', `deleted` bit(1) DEFAULT NULL COMMENT '已删除', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='图书管理';
-
生成代码,来到
wonder-generator
模块com.gitee.whzzone.generator.Generator
,填写好数据库、表、代码生成位置java// 数据库连接配置 private static final String JDBC_URL = "jdbc:mysql://ip:3306/wonder?useUnicode=true&useSSL=false&characterEncoding=utf8"; private static final String JDBC_USER_NAME = "root"; private static final String JDBC_PASSWORD = "123456"; // 包名和模块名 private static final String PACKAGE_NAME = "com.gitee.whzzone.admin.business"; private static final String MODULE_NAME = ""; // 表名,多个表使用英文逗号分割 private static final String[] TBL_NAMES = {"ex_book"}; // 表名的前缀,从表生成代码时会去掉前缀 private static final String TABLE_PREFIX = "ex_";
-
启动
main
方法即可,会生成如下8个文件,然后启动项目进入项目swagger文档,即可拥有增删改查接口
生成的代码解释
Book.java
实体。继承了BaseEntity
,继承一些基础属性,如:id、createTime、updateTime、deleted...等等
BookDto.java
传输对象。继承了EntityDto
,也是继承了一些基础属性
BookQuery.java
查询参数。继承了EntityQuery
,继承了基础的查询基础属性,排序,分页等
BookController.java
controller层。继承了EntityController
,里面提供了6个基础接口,包括增删改查、列表、分页查询
BookService.java
service层。继承了EntityService
,定义了一些基础接口
BookServiceImpl.java
service实现。默认实现了service层定义的接口
BookMapper.java
mapper层。继承了MyBatis-Plus的BaseMapper
BookMapper.xml
mapper对应的xml文件
注解说明
-
@Query
该注解标识该支持字段查询。column
-对应的数据库字段,如果为空则取属性名转下划线作为查询字段名。expression
标识该字段的查询方式,目前支持精确、模糊、范围、大于、小于等等查询。注意,当expression = ExpressionEnum.BETWEEN
即范围查询时,column
不能为空,且column
的值必须成对存在,否则无法启动。如下配置表示在create_time
字段进行范围查询java// 精确查询 等同于 @Query(column = "status", expression = ExpressionEnum.EQ) @Query @ApiModelProperty("状态 0-维护中,1-正常,2-借出") private Integer status;
java// 模糊查询 等同于 @Query(column = "name", expression = ExpressionEnum.LIKE) @Query(expression = ExpressionEnum.LIKE) @ApiModelProperty("书名") private String name;
java// 范围查询 create_time @Query(column = "create_time", expression = ExpressionEnum.BETWEEN) @ApiModelProperty("开始时间") private Date startDate; @Query(column = "create_time", expression = ExpressionEnum.BETWEEN) @ApiModelProperty("结束时间") private Date endDate;
-
@SaveField
该注解标识该属性为可添加字段。默认提供的添加接口只提取带有该注解的属性。 -
@UpdateField
该注解标识该属性为可编辑字段。默认提供的编辑接口只提取带有该注解的属性。
参数校验组
-
CreateGroup.class
默认提供的添加接口会校验该分组 -
UpdateGroup.clas
默认提供的编辑接口会校验该分组java@SaveField @UpdateField @NotBlank(message = "收货人不能为空", groups = {CreateGroup.class, UpdateGroup.class}) @ApiModelProperty("收货人姓名") private String receiverName;
接口代码流程
添加或更新
- 进入
beforeSaveOrUpdateHandler(dto)
方法,可以对'增改'接口参数进行统一处理 - '增'接口进入
beforeSaveHandler(dto)
,'改'接口进入beforeUpdateHandler(dto)
,分别对参数进行处理 - 复制带有
XxxDto
中带有@SaveField
或者@UpdateField
的属性给实体 - 执行更新
updateById(entity)
或插入save(entity)
操作 - 执行
afterSaveHandler(entity)
方法,可在此进行添加或更新的后置处理
单条查询
- 执行
getById(id)
- 执行
afterQueryHandler(entity, queryHandler)
,根据不同的需求使用不同的处理器对响应的数据进行处理,返回dto
列表、分页查询
- 进入
handleQueryWrapper(query)
方法,处理查询的信息,分页信息等 - 执行
page(queryWrapper)
查询或list(queryWrapper)
- 执行
afterQueryHandler(list, queryHandler)
,根据不同的需求使用不同的处理器对响应的数据进行处理
删除
- 执行
removeById(id)
- 执行
afterDeleteHandler(entity)
可在此处做删除的后置操作