1. 实体与表字段定义
1.1. 实体定义
package com.boot.domain;
import com.boot.base.common.domain.AbstractEntity;
import lombok.Data;
import javax.persistence.*;
/**
* @Description 用户实体
* @Author admin
* @Date 2020/7/2
*/
@Data
@Entity
@Table(name = "user")
public class user {
private String name;
private Gender gender;
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum")
public EnumAO getGender() {
return gender;
}
}
package com.boot.domain;
/**
* @Description 性别枚举
* @Author admin
* @Date 2020/11/7
*/
public enum Gender {
/** 注意:
* 1.java实体中的枚举的下标索引从0开始,而数据库的enum类型的索引是从1开始!
* 2.此处的1、2对应的时数据库中的对应字段gender的enum类型的索引!
*/
MAN(1),
WOMAN(2);
private int value;
EnumAO(int i) {
this.value = i;
}
public int getValue() {
return value;
}
public static Gender getGender(int i) {
switch (i) {
case 1:
return MAN;
case 2:
return WOMAN;
}
return null;
}
}
@RestController
@RequestMapping("/user")
public class AppController extends AbstractController {
/**
* 保存用户
* 备注:测试方法
* @param user
* @return
*/
@PostMapping("/user")
public Result save(@RequestBody User user) {
/**user.getGender().getValue()对应请求参数中的0或1*/ appOpinion.setGender(Gender.getGender(user.getGender().getValue()));
// 用户业务层保存用户信息方法
userService.save(user);
return new Result("success");
}
}
/** postman发生请求: */
url:http://localhost:8080/user
method:POST
{
"name":"小明",
"gender":0
}
// 注意:参数"gender"传0时对应枚举类Gender中的MAN,传1时WOMAN;因java中的enum类型元素下标索引从0开始,而数据库的enum是从1开始!
1.2. 表字段定义
create table app_opinion
(
name varchar(50) not null comment '姓名',
gender enum ('MAN', 'WOMAN') null comment '性别'
);
**备注:表字段gender类型被指定为enum类型的意义:
有时可以使用枚举类代替常用的字符串类型,mysql存储枚举类型会非常紧凑,会根据列表值的数据压缩到一个或两个字节中,mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的查找表!(内容来自mysql官网并进行的翻译)**
3. 关于可能出现的错误原因及解决
当插入一条记录是可能产生的错误:[01000][1265] Data truncated for column ‘gender’ at row 1
原因:没有对应的enum类型索引下标!如:insert into user(name, gender) values (‘xiaoming’, 3);会报以上错误,因为enum (‘MAN’, ‘WOMAN’) 对应的下标只有1和2!
解决:插入时必须对应存在的/正确的下标值!