在写项目是遇到一个与实体类MyBatis Plus无法映射的问题。
导致我一直查询出来的数据包装进实体类都是null,看mp日志是可以查出数据的,所以问题的冠军就是在于映射进实体类这一块。
这是我的实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("viptype")
public class VipType {
@TableId(type = IdType.AUTO)
private int vipType_id;
private String vip_name;
private Double vip_price;
private int vip_time;
private String vip_drsc;
}
这是数据库的中表的字段
create table viptype
(
vipType_id int auto_increment
primary key,
vip_name varchar(50) null,
vip_price decimal(8, 2) null,
vip_time int null,
vip_drsc varchar(255) null
);
可以看到实体类和数据库的字段名字都是一模一样的,这要在mybatis框架中是可以映射进去的,而我用的是mp框架并且用到了mp的注解,所以我实体类中的小驼峰命名的字段会被解读成用“_”分开的字段,例如实体类中的vipType_id被解读成vip_type_id,而数据库里面是没有这个字段的,所以导致映射不进去。
解决方案一:按照mp的规定写好对应的实体类
我这里为了规范把数据库和实体类都做了修改,如下
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("viptype")
public class VipType implements Serializable {
@TableId(value = "vip_type_id")
private int vipTypeId;
@TableField("vip_name")
private String vipName;
@TableField("vip_price")
private Double vipPrice;
@TableField("vip_time")
private int vipTime;
@TableField("vip_drsc")
private String vipDrsc;
}
create table viptype
(
vip_type_id int auto_increment
primary key,
vip_name varchar(50) null,
vip_price decimal(8, 2) null,
vip_time int null,
vip_drsc varchar(255) null
);
以此做到根据mp的规则对代码进行规范修改。
方案二:修改mp的规则,使原来的代码任然可以用。
mp中自动映射的规则之一:
字段名下划线命名方式和实体类属性小驼峰命名方式映射 -> 字段名 vip_name 实体类属性名 vipName
如果不想使用这种自动映射,则可以在yml文件中设置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: false
#map-underscore-to-camel-case: true 支持下划线到驼峰的映射
#map-underscore-to-camel-case: false 不支持下划线到驼峰的映射
将其设为false就可以了。
总结:这个问题加深了我对mp框架的理解与使用,当然mp的自动映射规则不止这一种,感兴趣的可以了解下。