MyBatisPlus(SpringBoot版)功能说明

一 ,基本操作

1.0 前置操作

  1. 创建一个SpringBoot项目, maven引入依赖
<?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.qcby</groupId>
    <artifactId>MyBatisPlus</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

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

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--devtools热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>2.7.12</version>
            <optional>true</optional>
        </dependency>

    </dependencies>
</project>
  1. 创建数据库mybatisplus_test,并创建t_user表
/*
 Navicat Premium Data Transfer

 Source Server         : local
 Source Server Type    : MySQL
 Source Server Version : 80037
 Source Host           : localhost:3306
 Source Schema         : mybatisplus_test

 Target Server Type    : MySQL
 Target Server Version : 80037
 File Encoding         : 65001

 Date: 15/01/2025 19:07:56
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `user_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `age` int NOT NULL,
  `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '1-男,0-女',
  `isDeleted` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'zhangsan', '1111111', '张三', '北京', 11, '1', '0');
INSERT INTO `t_user` VALUES (2, 'lisi', '1111111', '李四', '上海', 20, '0', '0');
INSERT INTO `t_user` VALUES (3, 'wangwu', '1111111', '王五', '广州', 34, '1', '0');
INSERT INTO `t_user` VALUES (4, 'zhaoliu', '1111111', '赵六', '深圳', 18, '1', '0');
INSERT INTO `t_user` VALUES (5, 'qianqi', '1111111', '钱七', '郑州', 3, '0', '0');

SET FOREIGN_KEY_CHECKS = 1;

  1. 创建User类
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@TableName("t_user")
public class User {
   
   

    private Integer id;

    private String username;

    private String password;

    private Integer age;

    private Integer sex;

    private String nickName;
}

1.1 常用注解

1.1.1 @TableName

该注解用于指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,您需要使用这个注解来明确指定表名。

@TableName("t_user")
public class User {
   
   
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
@TableName注解的属性

value: 用户自定义表名,默认值""
schema:数据库名称,除非数据库使用了schema,否则不写
keepGlobalPrefix:此实体类映射的表是否使用在配置文件指定全局的tablePrefix,**默认值false,即默认不使用;**如果设置为 true,即使注解中指定了表名,也会自动加上全局的表前缀。
resultMap:指定在 XML 中定义的 ResultMap 的 ID,用于将查询结果映射到特定类型的实体类对象。
autoResultMap:是否自动构建 resultMap。如果已经设置了 resultMap,这个属性不会生效。

关于MyBatis的typeHandler,对于MyBatis-plus需要注意:
MyBatis 只支持将 typeHandler 写在两个地方:
1. 定义在 resultMap 中,作用于查询结果的封装。
2. 定义在 insert 和 update 语句的 #{property} 中的 property 后面,例如:#{property,typehandler=xxx.xxx.xxx},并且只作用于当前设置的值。

关于mybatis的typeHandler,这里有一篇博客:MyBatis之TypeHandler用法

excludeProperty:指定在映射时需要排除的属性名。这些属性将不会被包含在生成的 SQL 语句中。默认值String[];
这里的不会被包含在生成的sql中,指的是所有sql操作,只要涉及到了这个字段,都会被忽略

重点:与@TableField注解的exist区分

@TableId

该注解用于标记实体类中的主键字段。如果你的主键字段名为 id,你可以省略这个注解。

@TableName("sys_user")
public class User {
   
   
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
@TableId注解的属性

value:标记表的主键字段值,比如uid,id等
type:主键生成策略,**默认使用雪花算法**
IdType.AUTO:使用数据库自增 ID 作为主键。
IdType.NONE:无特定生成策略,如果全局配置中有 IdType 相关的配置,则会跟随全局配置。
IdType.INPUT:在插入数据前,由用户自行设置主键值。
IdType.ASSIGN_ID:自动分配 ID,适用于 Long、Integer、String 类型的主键。默认使用雪花算法通过 IdentifierGenerator 的 nextId 实现。@since 3.3.0
IdType.ASSIGN_UUID:自动分配 UUID,适用于 String 类型的主键。默认实现为 IdentifierGenerator 的 nextUUID 方法。

@TableField

该注解用于标记实体类中的非主键字段,它告诉 MyBatis-Plus 如何映射实体类字段到数据库表字段。如果你的实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,你可以省略这个注解。
相当于我们用注解替代了*Mapper.xml中的resultMap!非常强大!

@TableField的属性

value:指定数据库中的字段名。如果你的实体类字段名与数据库字段名不同,使用这个属性来指定正确的数据库字段名。
exist:指示这个字段是否存在于数据库表中。如果设置为 false,MyBatis-Plus 在生成 SQL 时会忽略这个字段。
condition:构建queryWrapper的时候,其中一个构造方法是传入一个实体,此时标注在实体字段上的注解就会生效,构建查询条件

实体类

@TableName("sys_user")
public class User {
   
   
    @TableId
    private Long id;

    private String name;

    @TableField(condition = "%s > #{%s}") // 自定义 age 字段的条件表达式
    private Integer age;

    private String email;
}

查询

User queryEntity = new User();
    queryEntity.setAge(18); // 设置 age 字段的值

    // 创建 QueryWrapper 实例,并传递 User 实例
    QueryWrapper<User> queryWrapper = new QueryWrapper<>(queryEntity);

    // 执行查询
    List<User> userList = userMapper.selectList(queryWrapper);

    return userList;

update:在执行更新操作时,指定字段在 SET 子句中的表达式。这个属性的优先级高于 el 属性,允许你自定义字段的更新逻辑。

注意:el 属性允许你使用表达式来动态控制字段的更新行为,它使用的是 OGNL 表达式。 例如,你可以使用 @TableField(el = "CASE WHEN age > 18 THEN 'adult' ELSE 'child' END") 这样的表达式,在更新操作时根据一定的条件来计算字段的值。

@TableName("sys_user")
public class User {
   
   
    @TableId
    private Long id;

    private String name;

    private Integer age;

    private String email;

    @TableField(update="%s+1") // 自定义更新时的表达式
    private Integer version;
}

会自动执行如下sql

UPDATE sys_user
SET name = 'Updated Name', age = 30, email = 'updated@example.com', version = version + 1
WHERE id = 1;

FieldStrategy 枚举类型定义:
insertStrategy:定义在插入新记录时,如何处理字段的值。这个属性允许你控制字段是否应该包含在 INSERT 语句中,以及在什么条件下包含。
FieldStrategy 枚举类型定义

FieldStrategy.DEFAULT:遵循全局配置的策略。如果全局配置未指定,默认行为是仅在字段值不为 NULL 时插入该字段。
FieldStrategy.ALWAYS:总是插入该字段,无论字段值是否为 NULL。
FieldStrategy.NOT_NULL:仅在字段值不为 NULL 时插入该字段。
FieldStrategy.NOT_EMPTY:仅在字段值不为空(对于字符串类型)或不为 NULL(对于其他类型)时插入该字段。
FieldStrategy.NEVER:从不插入该字段,即使字段值不为 NULL。
updateStrategy:定义在更新记录时,如何处理字段的值。这个属性允许你控制字段是否应该包含在 UPDATE 语句的 SET 子句中,以及在什么条件下包含。
取值和insertStrategy 属性的FieldStrategy 枚举相同,这里不在赘述

whereStrategy:定义在生成**更新语句的 WHERE 子句**时,如何处理字段的值。这个属性允许你控制字段是否应该包含在 WHERE 子句中,以及在什么条件下包含。
取值和insertStrategy 属性的FieldStrategy 枚举相同,这里不在赘述

fill:字段自动填充策略。该属性用于指定在执行数据库操作(如插入、更新)时,如何自动填充字段的值。通过使用 FieldFill 枚举,可以灵活地控制字段的填充行为。

此功能需要配合自动填充字段功能一起使用。也就是说项目中需要有自定义类实现MetaObjectHandler接口

FieldFill 枚举类型定义

FieldFill.DEFAULT:默认不进行填充,依赖于数据库的默认值或手动设置。

FieldFill.INSERT:在插入操作时自动填充字段值。

FieldFill.UPDATE:在更新操作时自动填充字段值。

FieldFill.INSERT_UPDATE:在插入和更新操作时都会自动填充字段值。

select:指示在执行查询操作时,该字段是否应该包含在 SELECT 语句中。这个属性允许您控制查询结果中包含哪些字段,从而提供更细粒度的数据访问控制。

与exist属性的区别在于,exist会在所有生成的sql所有可能出现字段的位置中忽略这个字段,select属性只会忽略select的查询结果中的这个字段

@TableName("user")
public class User {
   
   
    // 其他字段...

    @TableField(select = false)
    private String password;

    // 构造函数、getter 和 setter...
}

keepGlobalFormat
默认false
指示在处理字段时是否保持使用全局 DbConfig 中定义的 columnFormat 规则。这个属性用于控制字段值在数据库操作中是否应用全局的列格式化规则。

jdbcType:JDBC类型,用于指定字段在数据库中的数据类型。这个属性允许您显式地设置字段的数据库类型,以确保与数据库的兼容性,特别是在处理特殊类型或自定义类型时。
详细说明
当 jdbcType 属性设置为 JdbcType.UNDEFINED(默认值)时,MyBatis-Plus 将根据字段的 Java 类型自动推断其 JDBC 类型。
当 jdbcType 属性设置为特定的 JdbcType 枚举值时,该字段将使用指定的 JDBC 类型进行数据库操作。这可以用于解决类型映射问题,或者在需要精确控制数据库类型时使用。

一般不用显示设置这个值,MyBatisPlus可以自动处理类型一年干涉。除非想主动转换类型,比如把User类转为Varchar存入数据库

typeHandler:类型处理器,用于指定在数据库操作中如何处理特定字段的值。这个属性允许您自定义字段值的转换逻辑,以适应特定的数据类型或业务需求。

详细说明
当 typeHandler 属性未设置(即使用默认值 UnknownTypeHandler.class)时,MyBatis-Plus 将使用默认的类型处理器来处理字段值。
当 typeHandler 属性设置为特定的 TypeHandler 子类时,该字段将使用指定的类型处理器进行数据库操作。这可以用于处理自定义类型、特殊数据格式或非标准的数据库类型。

numericScale:指定小数点后保留的位数,该属性仅在执行 update 操作时生效。它用于控制数值类型字段在更新时的小数精度。

详细说明
当 numericScale 属性设置为空字符串(默认值)时,字段的小数精度将遵循数据库的默认设置或字段定义时的设置。
当 numericScale 属性设置为特定的数值(如 “2”)时,该字段在执行 update 操作时将按照指定的小数位数进行处理。

@Version注解

该注解用于标记实体类中的字段作为乐观锁版本号字段。
乐观锁是一种并发控制机制,它假设多个事务可以同时进行而不会互相干扰,只在提交事务时检查是否有冲突。通过在实体类中使用@Version注解,MyBatis-Plus 会在更新操作时自动检查版本号,确保在更新过程中数据没有被其他事务修改。

@EnumValue

该注解用于标记枚举类中的字段,指定在数据库中存储的枚举值。当实体类中的某个字段是枚举类型时,使用@EnumValue注解可以告诉MyBatis-Plus在数据库中存储枚举值的哪个属性。

这个注解不需要标注在实体类的字段上,而是标注在Enum类的get方法上

@TableName("sys_user")
public class User {
   
   
    @TableId
    private Long id;
    @TableField("nickname") // 映射到数据库字段 "nickname"
    private String name;
    private Integer age;
    private String email;
    private Gender gender; // 假设 Gender 是一个枚举类型
}

public enum Gender {
   
   
    MALE("M", "男"),
    FEMALE("F", "女");

    private String code;
    private String description;

    Gender(String code, String description) {
   
   
        this.code = code;
        this.description = description;
    }

    @EnumValue // 指定存储到数据库的枚举值为 code
    public String getCode() {
   
   
        return code;
    }
}

@TableLogic

该注解用于标记实体类中的字段作为逻辑删除字段。逻辑删除是一种数据管理策略,它不是真正地从数据库中删除记录,而是在记录中标记该记录为已删除状态。通过使用@TableLogic注解,MyBatis-Plus 可以在查询、更新和删除操作中自动处理逻辑删除字段的值。

@KeySequence

该注解用于指定 Oracle 数据库中序列(Sequence)的名称,以便在实体类中生成主键值。在 Oracle 数据库中,主键通常是通过序列来生成的,而不是像其他数据库那样使用自增字段。@KeySequence注解告诉 MyBatis-Plus 使用特定的序列来生成主键。

@InterceptorIgnore

该注解用于指定Ma

<think>好的,我需要帮助用户寻找MyBatis PlusSpring Boot 3集成的示例代码或教程。首先,我要确认用户的需求:他们想要一个集成示例,可能包括配置步骤、代码示例以及相关依赖。 接下来,我需要回忆一下MyBatis PlusSpring Boot 3的特点。MyBatis Plus是一个增强工具,简化了MyBatis的开发,而Spring Boot 3需要Java 17或更高本,并且可能使用Jakarta EE 9+的包名,比如jakarta.persistence而不是javax.persistence。因此,在集成时需要注意依赖本和包名的变化。 首先,用户需要添加正确的依赖。在Maven中,Spring Boot Starter本可能需要用3.x,而MyBatis PlusSpring Boot Starter应该兼容。我需要检查最新的MyBatis Plus本是否支持Spring Boot 3。根据记忆,MyBatis Plus 3.5.x本应该支持,但需要确认。例如,可能使用mybatis-spring-boot-starter本3.0.3,对应MyBatis Plus 3.5.3.1。 然后,配置数据源。Spring Boot 3的配置文件application.properties或application.yml中的数据库连接配置和之前类似,但驱动类可能需要根据数据库更新,比如MySQL的驱动类可能是com.mysql.cj.jdbc.Driver,并且URL可能需要加上时区参数。 接下来,实体类需要使用Jakarta的注解,比如@Table和@Id来自jakarta.persistence包。这需要提醒用户替换旧的javax包引用。 创建Mapper接口时,要继承MyBatis Plus的BaseMapper,并添加@Mapper注解或在启动类上使用@MapperScan扫描包。这里需要注意扫描路径是否正确。 在服务层,可以使用MyBatis Plus提供的ServiceImpl来简化CRUD操作,用户需要创建Service接口和实现类,并注入Mapper。 控制器层使用@RestController注解,处理HTTP请求,并调用服务层的方法。这里需要示例代码展示如何编写一个简单的GET请求处理。 最后,启动类需要使用@SpringBootApplication,并确保正确配置,特别是如果用户有自定义配置的话。 此外,可能需要提醒用户常见的注意事项,比如依赖本冲突、包名变更导致的问题,以及如何开启MyBatis Plus的特性如分页插件。同时,提供参考资料链接或进一步学习的方向,比如官方文档或社区教程,帮助用户深入理解。 生成相关问题方面,用户可能对配置细节、高级功能(如分页、乐观锁)、性能优化或异常处理感兴趣。因此,相关问题可以围绕这些方面展开,引导用户进一步探索。</think>以下是关于MyBatis PlusSpring Boot 3集成的示例和关键步骤说明--- ### 1. 添加依赖 在`pom.xml`中添加以下依赖(本根据实际情况调整): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> ``` 注意:Spring Boot 3需要Java 17+,且MyBatis Plus本需支持Jakarta EE 9[^1]。 --- ### 2. 配置数据源 在`application.yml`中配置数据库连接: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` --- ### 3. 定义实体类 使用Jakarta持久化注解(Spring Boot 3默认): ```java import jakarta.persistence.Table; import jakarta.persistence.Id; @Table(name = "user") public class User { @Id private Long id; private String name; private Integer age; // 省略getter/setter } ``` --- ### 4. 创建Mapper接口 继承MyBatis Plus的`BaseMapper`: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { } ``` --- ### 5. 启用Mapper扫描 在启动类添加注解: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 指定Mapper接口所在包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- ### 6. 编写Service层 ```java public interface UserService extends IService<User> {} @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {} ``` --- ### 7. 编写Controller ```java @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getById(@PathVariable Long id) { return userService.getById(id); } } ``` --- ### 8. 启用MyBatis Plus特性(可选) 例如配置分页插件: ```java @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值