问题描述
1、表设计
create table mi_outpatient_reg_result
(
id bigint auto_increment comment 'id'
primary key,
insuplc_admdvs varchar(100) null comment '参保地区划',
psn_no varchar(100) null comment '人员编号',
ipt_otp_no varchar(100) null comment '住院/门诊流水号',
mdtrt_id varchar(100) null comment '就诊id',
vola_type varchar(100) null comment '违规类型',
vola_dscr text null comment '违规描述',
)
2、Java实体
@Data
public class MiOutpatientRegResult {
/**
* 参保地区划
*/
private String insuplcAdmdvs;
/**
* 人员编号
*/
private String psn_no;
/**
* 住院/门诊号
*/
private String ipt_otp_no;
/**
* 就诊id
*/
private String mdtrt_id;
/**
* 违规类型
*/
private String vola_type;
/**
* 违规说明
*/
private String vola_dscr;
}
3、问题:当使用Mybatis-Plus进行查询的时候发现只有id、insuplcAdmdvs字段不为Null;其余下划线的字段都映射为Null。
原因
之前有了解过Mybatis的映射是通过实体的Getter-Setter方法进行赋值,mybatis又开启了驼峰映射。
1、开启驼峰导致的、实体命名又没按照驼峰命名
mytais源码:
public static String methodToProperty(String name) {
// 布尔值类型的命名
if (name.startsWith("is")) {
name = name.substring(2);
} else if (name.startsWith("get") || name.startsWith("set")) {
name = name.substring(3);
} else {
throw new ReflectionException("Error parsing property name '" + name + "'. Didn't start with 'is', 'get' or 'set'.");
}
// 单个的字段或者多个的字段并且第二个字母是小写
// 比如setPsn_no返回psn_no与数据库字段转了驼峰的不一致,所以才一直映射为null
// setPsnNo返回psnNo与数据库转了驼峰一致赋值成功
if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
}
return name;
}
解决
1、实体命名按驼峰规范命名,就可以直接配合@Data注解(我这里业务命名就要求这样不能改)
2、手动生写Getter-Setter方法,按照驼峰格式命名(如下)
3、关闭mybatis驼峰映射
// Lombok生成的
public void setPsn_no(String psn_no) {
this.psn_no = psn_no;
}
// 手动生成的
public void setPsnNo(String psn_no) {
this.psn_no = psn_no;
}