common-mybatis-plus-starter
1.功能介绍
1.自定义分页封装
- 只需传递
pageNum
,pageSize
,total
,data
即可自动完成分页封装,简化分页逻辑。
2.对 MyBatis-Plus 框架进行二次封装
- 隐藏
QueryWrapper
等复杂实现细节,保留动态生成 CRUD 特性。 - 结合 EasyCode 自定义模板优化代码生成,实现无感封装,统一数据访问规范,大幅提升开发效率和规范性,打造高可用、高扩展性、低入门成本的企业级数据访问层解决方案。
3.定义 MyBatis 拦截器
- 对 SQL 进行格式话输出,提高 SQL 可读性,便于排查问题。
2.配置示例
1.开启 SQL 美化 配置是否启用 SQL 美化功能,使 SQL 更加可读。
yaml
sun-rays:
mybatis-plus:
sql-beauty-enabled: true # 是否开启 SQL 美化(默认 true)
2.配置数据源 配置数据库连接信息,使用 Spring 的数据源配置项。
yaml
spring:
datasource:
username: ${MYSQL_USERNAME} # 用户名
password: ${MYSQL_PASSWORD} # 密码
url: jdbc:mysql://${MYSQL_IP}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false # 数据库连接 URL
3.配置 EasyCode 的宏定义
properties
# 定义配置宏
# 指定逻辑删除字段名(驼峰命名)
set($logicDeleteField = "isDeleted")
# 指定逻辑删除字段名(下划线命名)
set($logicDeleteFieldUnder = "is_deleted")
# 定义全局逻辑删除字段的删除值和未删除值
set($deleteColumnValue = 1)
set($notDeletedColumnValue = 0)
# 配置排除的字段列表(驼峰命名)
set($excludedFields = ["createBy", "createTime", "updateBy", "updateTime"])
4.配置 common-mybatis-plus-starter
模块的 BaseEntity
与通用字段一致
5.最佳实践(无需任何配置)
通用字段为:
create_by
create_time
update_by
update_time
is_deleted
3.案例演示
1.EasyCode插件配置
1.下载 EasyCodeConfig.json
2.在插件设置中选择从本地导入配置
3.在设置的Global Config中创建sunrays-framework.vm并粘贴配置
properties
# 定义配置宏
# 指定逻辑删除字段名(驼峰命名)
set($logicDeleteField = "isDeleted")
# 指定逻辑删除字段名(下划线命名)
set($logicDeleteFieldUnder = "is_deleted")
#定义全局逻辑删除字段的删除值和未删除值
set($deleteColumnValue = 1)
set($notDeletedColumnValue = 0)
# 配置排除的字段列表(驼峰命名)
set($excludedFields = ["createBy", "createTime", "updateBy", "updateTime"])
# 最佳实践(必要字段):create_by,create_time,update_by,update_time,is_deleted
2.IDEA连接数据库
1.点击右上角的数据库标志,然后点击加号,选择要连接的数据库
2.填写数据库信息进行连接
3.创建并使用数据库 sunrays_framework
sql
create database sunrays_framework;
use sunrays_framework;
4.创建示例表
sql
CREATE TABLE example_table
(
id INT PRIMARY KEY COMMENT '主键ID',
user_name VARCHAR(255) NULL COMMENT '用户名称',
user_email VARCHAR(255) NULL COMMENT '用户邮箱',
phone_number VARCHAR(20) DEFAULT NULL COMMENT '联系电话',
home_address VARCHAR(255) DEFAULT NULL COMMENT '家庭住址',
account_status TINYINT(1) DEFAULT 0 COMMENT '账户状态(0-禁用,1-启用)',
create_by VARCHAR(50) DEFAULT NULL COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(50) DEFAULT NULL COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
is_deleted TINYINT(1) DEFAULT 0 COMMENT '逻辑删除标记(0-未删除,1-已删除)'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='示例表';
INSERT INTO example_table (id, user_name, user_email, phone_number, home_address, account_status, create_by)
VALUES (1, '张三', 'zhangsan@example.com', '13800138000', '北京市朝阳区', 1, 'admin'),
(2, '李四', 'lisi@example.com', '13800138001', '上海市浦东新区', 1, 'admin'),
(3, '王五', 'wangwu@example.com', '13800138002', '广州市天河区', 0, 'admin'),
(4, '赵六', 'zhaoliu@example.com', '13800138003', '深圳市福田区', 1, 'admin'),
(5, '孙七', 'sunqi@example.com', '13800138004', '成都市武侯区', 0, 'admin'),
(6, '周八', 'zhouba@example.com', '13800138005', '杭州市西湖区', 1, 'admin'),
(7, '吴九', 'wujia@example.com', '13800138006', '重庆市渝中区', 0, 'admin'),
(8, '郑十', 'zhengshi@example.com', '13800138007', '南京市鼓楼区', 1, 'admin'),
(9, '冯十一', 'fengshiyi@example.com', '13800138008', '武汉市武昌区', 1, 'admin'),
(10, '褚十二', 'chushier@example.com', '13800138009', '长沙市岳麓区', 0, 'admin');
5.让IDEA连接刚才创建的数据库sunrays_framework
3.项目环境搭建
1.创建模块 common-mybatis-plus-starter-demo
2.目录结构
3.pom.xml
1.基本配置
xml
<!-- 通过properties来指定版本号 -->
<properties>
<!-- 指定编译版本 -->
<java.version>1.8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 指定Sunrays-Framework的版本 -->
<sunrays.version>1.0.0</sunrays.version>
</properties>
<dependencyManagement>
<!-- 使用sunrays-dependencies来管理依赖,则依赖无需加版本号 -->
<dependencies>
<dependency>
<groupId>cn.sunxiansheng</groupId>
<artifactId>sunrays-dependencies</artifactId>
<version>${sunrays.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.引入依赖
xml
<dependencies>
<!-- common-mybatis-plus-starter -->
<dependency>
<groupId>cn.sunxiansheng</groupId>
<artifactId>common-mybatis-plus-starter</artifactId>
</dependency>
<!-- common-log4j2-starter 是必须引入的!!! -->
<dependency>
<groupId>cn.sunxiansheng</groupId>
<artifactId>common-log4j2-starter</artifactId>
</dependency>
<!-- EasyCode 生成的代码依赖Web模块-->
<dependency>
<groupId>cn.sunxiansheng</groupId>
<artifactId>common-web-starter</artifactId>
</dependency>
<!-- env模块确保数据安全,可以不引入 -->
<dependency>
<groupId>cn.sunxiansheng</groupId>
<artifactId>common-env-starter</artifactId>
</dependency>
</dependencies>
4.application.yml 配置日志根目录、.env文件的绝对路径、数据源
yaml
sun-rays:
log4j2:
home: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-mybatis-plus-starter-demo/logs # 日志根目录(默认./logs)
env:
path: /Users/sunxiansheng/IdeaProjects/sunrays-framework/sunrays-common-demo/common-mybatis-plus-starter-demo # .env文件的绝对路径
spring:
datasource:
username: ${MYSQL_USERNAME} # 用户名
password: ${MYSQL_PASSWORD} # 密码
url: jdbc:mysql://${MYSQL_IP}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false # url
5..env文件配置数据库信息
properties
MYSQL_USERNAME=用户名
MYSQL_PASSWORD=密码
MYSQL_IP=ip
MYSQL_PORT=端口
MYSQL_DATABASE=数据库名字
6.MyBatisPlusController.java 测试Controller
java
package cn.sunxiansheng.mybatis.plus.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Description: MyBatisPlusController
*
* @Author sun
* @Create 2025/1/19 15:01
* @Version 1.0
*/
@RestController
public class MyBatisPlusController {
/**
* A test endpoint.
*
* @return A sample response.
*/
@RequestMapping("/test")
public String test() {
return "This is a test response from MyBatisPlusController";
}
}
7.MyBatisPlusApplication.java 启动类
java
package cn.sunxiansheng.mybatis.plus;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Description: MyBatisPlusApplication
*
* @Author sun
* @Create 2025/1/19 15:00
* @Version 1.0
*/
@SpringBootApplication
public class MyBatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisPlusApplication.class, args);
}
}
8.启动测试
4.使用EasyCode生成代码
1.选中指定的表,右键生成代码
2.选择Module和Package以及之前导入的模板,点击OK
3.生成的代码
5.测试分页查询
1.不加任何条件查询第一页,页面大小为三的数据
2.响应结果
json
{
"success": true,
"code": 200,
"message": "操作成功",
"data": {
"pageNo": 1,
"pageSize": 3,
"total": 10,
"totalPages": 4,
"result": [
{
"id": 1,
"userName": "张三",
"userEmail": "zhangsan@example.com",
"phoneNumber": "13800138000",
"homeAddress": "北京市朝阳区",
"accountStatus": 1,
"isDeleted": 0
},
{
"id": 2,
"userName": "李四",
"userEmail": "lisi@example.com",
"phoneNumber": "13800138001",
"homeAddress": "上海市浦东新区",
"accountStatus": 1,
"isDeleted": 0
},
{
"id": 3,
"userName": "王五",
"userEmail": "wangwu@example.com",
"phoneNumber": "13800138002",
"homeAddress": "广州市天河区",
"accountStatus": 0,
"isDeleted": 0
}
],
"start": 1,
"end": 3,
"hasNextPage": true,
"hasPreviousPage": false
}
}
6.全链路日志展示
1.controller和service方法的入参格式化打印
2.统计数量的sql格式化打印
3.查询数据的sql格式化打印
4.controller和service方法的出参格式化打印
4.部分生成代码说明
1.ExampleTableController.java
1.展示
2.介绍
- 该文件是Controller
- 继承了BaseController,提供了Date类型的自动转换,和一些快捷的响应方法
- 提供了一些基础的接口实现
- 如果想要自定义接口,直接在下面调用Service即可,跟平常的使用方式是一样的
2.ExampleTableService.java
1.展示
2.介绍
- 该文件是Service接口
- 两个泛型分别是与数据库对应的entity的类型以及id类型
- 使用的时候也是跟平常一样,在接口内加一个方法
3.ExampleTableServiceImpl.java
1.展示
2.介绍
- 该文件是Service的实现类
- 三个泛型分别是调用MyBatis Plus方法的Mapper类型,与数据库对应的entity的类型以及id类型
- 构造器是为了在运行时动态给父类设置具体的操作Mybatis Plus的Mapper
- 调用框架自动生成的方法使用super.xxx,调用自己实现的方法用注入的Mapper
- 使用的时候,就不需要管那么多,直接实现Service方法即可
4.ExampleTableMapper.java
1.展示
2.介绍
- 该文件是Mapper接口
- 提供了三个基础的方法
- 使用起来也是跟平常一样,加方法
5.ExampleTableMapper.xml
1.展示
2.介绍
- 该文件是Mapper的实现类
- 提供了三个基础方法的实现
- 使用起来就直接实现Mapper接口的方法去写sql就行
5.示例:使用框架编写一个需求
1.需求
分页查询id大于5的用户
2.目录结构
3.ExampleTableMapper.java 新增求数量和求数据的方法
java
/**
* 查询出id大于5的用户数量
*
* @return
*/
Long countById();
/**
* 分页查询出id大于5的所有用户
*
* @param offset
* @param limit
* @return
*/
List<ExampleTable> queryByPageAboutId(@Param("offset") Long offset,
@Param("limit") Long limit);
4.ExampleTableMapper.xml 实现方法
xml
<select id="countById" resultType="java.lang.Long">
select count(*)
from example_table
where id > 5
</select>
<select id="queryByPageAboutId" resultMap="ExampleTableMap">
select id, user_name, user_email, phone_number, home_address, account_status, create_by, create_time, update_by,
update_time, is_deleted
from example_table
where id > 5
and is_deleted = 0
limit #{offset}, #{limit}
</select>
5.ExampleTableService.java 新增分页查询的方法
java
/**
* 分页查询id大于5的用户
*
* @return
*/
PageResult<ExampleTableVo> queryByPageAboutId(ExampleTableController.QueryByPageAboutIdReq req);
6.ExampleTableServiceImpl.java 实现方法
java
@Override
@Transactional(rollbackFor = Exception.class) // 开启事务
public PageResult<ExampleTableVo> queryByPageAboutId(ExampleTableController.QueryByPageAboutIdReq req) {
// 分页查询
PageResult<ExampleTableVo> paginate = SunPageHelper.paginate(
req.getPageNo(),
req.getPageSize(),
() -> exampleTableMapper.countById(),
(offset, limit) -> {
// 查询数据,并转换为vo
List<ExampleTable> exampleTableList =
exampleTableMapper.queryByPageAboutId(offset, limit);
List<ExampleTableVo> exampleTableVos = ExampleTableConverter.INSTANCE.convertPoList2VoList(exampleTableList);
return exampleTableVos;
}
);
return paginate;
}
7.ExampleTableController.java 新增req和分页查询方法
java
@Data
public static class QueryByPageAboutIdReq {
private Long pageNo;
private Long pageSize;
}
/**
* 分页查询id大于5的用户
*
* @return
*/
@GetMapping("/queryByPageAboutId")
public ResultWrapper<PageResult<ExampleTableVo>> queryByPageAboutId(QueryByPageAboutIdReq req) {
// ============================== Preconditions 参数校验 ==============================
// ============================== 调用Service层 ==============================
// 调用service查询id大于5的用户
PageResult<ExampleTableVo> pageResult = exampleTableService.queryByPageAboutId(req);
return ResultWrapper.ok(pageResult);
}