我真的是懒啊,是真不想写增删改查接口,所以试着写了一套通用增删改查(默认实现,复杂的需要自行重写方法),主要是由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)可在此处做删除的后置操作