【MyBatis-Plus】 学习记录 常用功能及代码生成器使用


MyBatis-Plus 是一个在 MyBatis 基础上进行增强的持久层框架,主要目标是简化开发,减少重复代码。

1. 环境准备

依赖添加
首先在你的项目中添加 MyBatis-Plus 的相关依赖。

如果是 Maven 项目,pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本号</version>
</dependency>

其他依赖(如 MySQL):

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

配置数据库
application.yml 中配置你的数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml

2. 创建基础实体类

假设我们有一个 User 表:

CREATE TABLE user (
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    name VARCHAR(30) DEFAULT NULL,
    age INT(11) DEFAULT NULL,
    email VARCHAR(50) DEFAULT NULL,
    PRIMARY KEY (id)
);

对应的实体类 User.java

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  • @TableName:用于指定数据库表名,若类名与表名一致可以省略。
  • @TableId:标识主键。

3. 编写 Mapper 接口

创建一个 UserMapper 接口,继承 MyBatis-Plus 提供的 BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

MyBatis-Plus 会自动生成常用的 CRUD 方法,常见方法如下:

  • insert()
  • deleteById()
  • updateById()
  • selectById()
  • selectList()

4. Service 层

为了更好地管理业务逻辑,可以创建 Service 层。MyBatis-Plus 提供了 IServiceServiceImpl 作为基础类。

import com.baomidou.mybatisplus.extension.service.IService;

public interface UserService extends IService<User> {
}

实现类:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

ServiceImpl 类提供了基本的增删改查功能。

5. 控制器层

编写控制器层来处理客户端的请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 查询所有用户
    @GetMapping("/list")
    public List<User> list() {
        return userService.list();
    }

    // 根据ID查询用户
    @GetMapping("/{id}")
    public User getById(@PathVariable("id") Long id) {
        return userService.getById(id);
    }

    // 新增用户
    @PostMapping("/add")
    public boolean add(@RequestBody User user) {
        return userService.save(user);
    }

    // 修改用户
    @PutMapping("/update")
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

    // 删除用户
    @DeleteMapping("/delete/{id}")
    public boolean delete(@PathVariable("id") Long id) {
        return userService.removeById(id);
    }
}

6. 分页功能

MyBatis-Plus 提供了简单的分页功能,只需添加 Page 参数即可。

依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

Controller 中添加分页查询:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 分页查询
    @GetMapping("/page")
    public Page<User> page(@RequestParam(defaultValue = "1") int current,
                           @RequestParam(defaultValue = "10") int size) {
        Page<User> page = new Page<>(current, size);
        return userService.page(page);
    }
}

7. 条件构造器

MyBatis-Plus 提供了非常强大的条件构造器 QueryWrapper,可用于复杂查询。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

@GetMapping("/search")
public List<User> search(@RequestParam String name, @RequestParam Integer age) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", name).eq("age", age);
    return userService.list(queryWrapper);
}

8. 配置乐观锁

乐观锁可以通过版本号字段实现。首先在实体类中添加 @Version 注解。

import com.baomidou.mybatisplus.annotation.Version;

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @Version
    private Integer version;
}

然后在 application.yml 中启用乐观锁插件:

mybatis-plus:
  configuration:
    optimistic-locker: true

9. 常见问题

  1. MyBatis-Plus 自定义 SQL 查询
    如果需要自定义 SQL,可以在 UserMapper 接口中添加注解或者编写 XML 文件:

    @Select("SELECT * FROM user WHERE age > #{age}")
    List<User> selectByAge(@Param("age") Integer age);
    
  2. 事务管理
    可以通过 Spring 的 @Transactional 注解来管理事务。

    @Transactional
    public boolean saveUser(User user) {
        return userService.save(user);
    }
    

MyBatis-Plus 极大简化了数据库操作的开发工作,提供了 CRUD 方法、分页、条件构造器、乐观锁等常用功能,同时也可以支持自定义 SQL 查询。

10. 代码生成器

下面是一个详细的 MyBatis-Plus 代码生成器教程,从创建数据库表开始,到生成代码的步骤:

1. 创建数据库表

首先,你需要在你的数据库中创建一个表。例如,我们创建一个名为 user 的表:

CREATE DATABASE mybatis_plus_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE mybatis_plus_db;

CREATE TABLE user (
                      id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
                      name VARCHAR(50) NOT NULL COMMENT '用户名',
                      age INT(11) DEFAULT NULL COMMENT '年龄',
                      email VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
                      PRIMARY KEY (id)
) COMMENT='用户表';

2. 引入依赖

在你的 Maven 项目的 pom.xml 中添加 MyBatis-Plus 和代码生成器的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>mybatis-plus-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <slf4j.version>1.7.36</slf4j.version>
    </properties>
    <dependencies>
        <!-- MyBatis-Plus 核心包 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- MyBatis-Plus 代码生成器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version> <!-- 或者根据需求使用最新的版本 -->
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
    </dependencies>

</project>

3. 配置数据库连接

application.ymlapplication.properties 中配置你的数据库连接:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus_db?useSSL=false&serverTimezone=UTC
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

4. 编写代码生成器

在你的项目中创建一个新的 Java 类,例如 CodeGenerator,用来生成代码:

package com.example;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.sql.Types;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus_db" +
                                "?useUnicode=true&characterEncoding=UTF-8" +
                                "&useSSL=true&serverTimezone=Asia/Shanghai",
                        "root", "password123")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("username")
                            // 代码生成后不打开文件夹
                            .disableOpenDir()
                            // 时间日期格式,默认为 "yyyy-MM-dd"
                            .commentDate("yyyy-MM-dd HH:mm:ss")
                            // 文件生成位置
                            .outputDir(System.getProperty("user.dir") + "/src/main/java");
                })
                // 包配置
                .packageConfig(builder -> {
                    // 包路径
                    builder.parent("com.example")
                            // entity 命名(controller/service/mapper 一样适用)
                            .entity("pojo")
                            // 路径配置信息
                            .pathInfo(Collections.singletonMap(OutputFile.xml,
                                    System.getProperty("user.dir") + "/src/main/resources/com/username/MybatisPlus"));
                })
                // 策略配置
                .strategyConfig(builder -> {
                    // 精准添加生成代码的表(也可以进行模糊匹配 like/模糊排除表 noLike/精准排除 addExclude)
                    builder.addInclude("user", "user_id_card")
                            // 实体类配置
                            .entityBuilder()
                            // 开启 lombok 生成 @Getter@Setter
                            .enableLombok()
                            // 字段注解
                            .enableTableFieldAnnotation()
                            // 雪花算法
                            .idType(IdType.ASSIGN_ID)
                            // 表字段自动填充
                            .addTableFills(new Column("created_time", FieldFill.INSERT))
                            .addTableFills(new Column("modified_time", FieldFill.INSERT_UPDATE))
                            .build()
                            // 控制器配置
                            .controllerBuilder()
                            .enableRestStyle()
                            .mapperBuilder()
                            .build();
                })
                // 使用默认 Velocity 引擎模板生成代码
                .templateEngine(new VelocityTemplateEngine())
                .execute();
    }
}

5. 运行代码生成器

确保你已连接到数据库,并在你的 IDE 中运行 CodeGenerator 类。生成的代码会自动输出到你指定的目录(如 src/main/java)。

6. 查看生成的代码

src/main/java 目录下,你会看到生成的实体类、Mapper 接口、Service 接口及其实现类、Controller 等文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值