Skip to content

common-mybatis-plus-starter

1.功能介绍

1.自定义分页封装

  • 只需传递 pageNumpageSizetotaldata 即可自动完成分页封装,简化分页逻辑。

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

点击下载 EasyCodeConfig.json

2.在插件设置中选择从本地导入配置

CleanShot 2025-01-19 at 14.38.51@2x

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

CleanShot 2025-01-19 at 14.40.10@2x

2.IDEA连接数据库

1.点击右上角的数据库标志,然后点击加号,选择要连接的数据库

CleanShot 2025-01-19 at 14.47.49@2x

2.填写数据库信息进行连接

CleanShot 2025-01-19 at 14.50.06@2x

3.创建并使用数据库 sunrays_framework

CleanShot 2025-01-19 at 14.53.54@2x

CleanShot 2025-01-19 at 14.54.04@2x

sql
create database sunrays_framework;
use sunrays_framework;
4.创建示例表

CleanShot 2025-01-19 at 14.55.42@2x

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

CleanShot 2025-01-19 at 15.11.53@2x

CleanShot 2025-01-19 at 15.12.17@2x

3.项目环境搭建

1.创建模块 common-mybatis-plus-starter-demo

CleanShot 2025-01-19 at 14.59.01@2x

2.目录结构

CleanShot 2025-01-19 at 15.07.33@2x

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.启动测试

CleanShot 2025-01-19 at 15.14.22@2x

CleanShot 2025-01-19 at 15.15.09@2x

CleanShot 2025-01-19 at 15.15.17@2x

4.使用EasyCode生成代码

1.选中指定的表,右键生成代码

CleanShot 2025-01-19 at 15.17.06@2x

2.选择Module和Package以及之前导入的模板,点击OK

CleanShot 2025-01-19 at 15.18.54@2x

3.生成的代码

CleanShot 2025-01-19 at 15.21.51@2x

5.测试分页查询

1.不加任何条件查询第一页,页面大小为三的数据

CleanShot 2025-01-19 at 15.24.40@2x

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方法的入参格式化打印

CleanShot 2025-01-19 at 15.27.18@2x

2.统计数量的sql格式化打印

CleanShot 2025-01-19 at 15.27.57@2x

3.查询数据的sql格式化打印

CleanShot 2025-01-19 at 15.28.39@2x

4.controller和service方法的出参格式化打印

CleanShot 2025-01-19 at 15.29.04@2x

CleanShot 2025-01-19 at 15.29.19@2x

4.部分生成代码说明

1.ExampleTableController.java

1.展示

CleanShot 2025-01-19 at 15.37.16@2x

CleanShot 2025-01-19 at 15.37.32@2x

CleanShot 2025-01-19 at 15.38.02@2x

2.介绍
  1. 该文件是Controller
  2. 继承了BaseController,提供了Date类型的自动转换,和一些快捷的响应方法
  3. 提供了一些基础的接口实现
  4. 如果想要自定义接口,直接在下面调用Service即可,跟平常的使用方式是一样的

2.ExampleTableService.java

1.展示

CleanShot 2025-01-19 at 15.41.55@2x

CleanShot 2025-01-19 at 15.57.46@2x

2.介绍
  1. 该文件是Service接口
  2. 两个泛型分别是与数据库对应的entity的类型以及id类型
  3. 使用的时候也是跟平常一样,在接口内加一个方法

3.ExampleTableServiceImpl.java

1.展示

CleanShot 2025-01-19 at 15.45.21@2x

CleanShot 2025-01-19 at 15.52.09@2x

2.介绍
  1. 该文件是Service的实现类
  2. 三个泛型分别是调用MyBatis Plus方法的Mapper类型,与数据库对应的entity的类型以及id类型
  3. 构造器是为了在运行时动态给父类设置具体的操作Mybatis Plus的Mapper
  4. 调用框架自动生成的方法使用super.xxx,调用自己实现的方法用注入的Mapper
  5. 使用的时候,就不需要管那么多,直接实现Service方法即可

4.ExampleTableMapper.java

1.展示

CleanShot 2025-01-19 at 15.56.22@2x

2.介绍
  1. 该文件是Mapper接口
  2. 提供了三个基础的方法
  3. 使用起来也是跟平常一样,加方法

5.ExampleTableMapper.xml

1.展示

CleanShot 2025-01-19 at 16.00.13@2x

2.介绍
  1. 该文件是Mapper的实现类
  2. 提供了三个基础方法的实现
  3. 使用起来就直接实现Mapper接口的方法去写sql就行

5.示例:使用框架编写一个需求

1.需求

分页查询id大于5的用户

2.目录结构

CleanShot 2025-01-19 at 16.54.27@2x

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);
    }

8.查询结果

CleanShot 2025-01-19 at 16.58.08@2x