<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.0modelVersion>
<groupId>com.qcbygroupId>
<artifactId>MyBatisPlusartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.6.7version>
<relativePath/>
parent>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.5.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.27version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<version>2.7.12version>
<optional>trueoptional>
dependency>
dependencies>
project>
/*
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;
@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;
}
该注解用于指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,您需要使用这个注解来明确指定表名。
@TableName("t_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
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区分
该注解用于标记实体类中的主键字段。如果你的主键字段名为 id,你可以省略这个注解。
@TableName("sys_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
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 方法。
该注解用于标记实体类中的非主键字段,它告诉 MyBatis-Plus 如何映射实体类字段到数据库表字段。如果你的实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,你可以省略这个注解。
相当于我们用注解替代了*Mapper.xml中的resultMap!非常强大!
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 = '[email protected]', 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注解,MyBatis-Plus 会在更新操作时自动检查版本号,确保在更新过程中数据没有被其他事务修改。
该注解用于标记枚举类中的字段,指定在数据库中存储的枚举值。当实体类中的某个字段是枚举类型时,使用@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(