问题引入
表中的有些字段值是固定的,例如性别(男或女)。
CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`gender` int(11) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
性别字段在数据库中一般用数字表示,但是在Java实体类中,我们会用枚举
@NoArgsConstructor
@AllArgsConstructor
@Data //lombok注解
@TableName("t_user")
public class User {
@TableId (value = "uid",type = IdType.AUTO)// 标注主键
private Long id;
@TableField(value = "name")
private String username;
private Integer age;
private String email;
// 这里是枚举类型,数据库是int类型
private GenderEnum gender;
// @TableLogic
private Integer isDeleted;
}
@Getter
public enum GenderEnum {
MALE(1, "男"),
FEMALE(2, "女");
private Integer gender;
private String genderName;
GenderEnum(Integer gender, String genderName) {
this.gender = gender;
this.genderName = genderName;
}
}
如果直接存入数据,会发生错误
@Test
public void testSexEnum(){
User user = new User();
user.setUsername("Enum");
user.setAge(20);
user.setGender(GenderEnum.MALE);
//==> Preparing: INSERT INTO t_user ( name, age, gender ) VALUES ( ?, ?, ? )
//==> Parameters: Enum(String), 20(Integer), MALE(String)
//Cause: java.sql.SQLException: Incorrect integer value: 'MALE' for column 'gender' at row 1
//这里发生了错误,gender存入的是String类型的值-MALE(String)
userMapper.insert(user);
}
使用MyBatis-Plus的通用枚举
使用@EnumValue注解
@Getter
public enum GenderEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue // 将注解所标注的值存储到数据库中
private Integer gender;
private String genderName;
GenderEnum(Integer gender, String genderName) {
this.gender = gender;
this.genderName = genderName;
}
}
在老的Mybatis-plus版本中还需要配置扫描通用枚举
mybatis-plus: configuration: # 配置MyBatis日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl type-enums-package: com.xxx.xxx.enums
实验
@Test
public void testSexEnum2(){
User user = new User();
user.setUsername("Enum");
user.setAge(20);
//设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
user.setGender(GenderEnum.MALE);
//==> Preparing: INSERT INTO t_user ( name, age, gender ) VALUES ( ?, ?, ? )
//==> Parameters: Enum(String), 20(Integer), 1(Integer)
userMapper.insert(user);
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com