前言
有了初步认识后,了解一下基本用法(今天刚嘲笑完邓超水煎包煎糊了之后,晚上蒸包子的时候水烧干了!!我的包子也蒸糊了!!!晚上歌手突围赛,tia momoko姐妹花冲鸭!!!)
这个是自己学习时候记得笔记要是想详细了解可以去MP官网,上边有更详细的配置流程以及视频教学:MyBatis-Plus
新增(Create)
service层直接调用mapper中的insert(T t)方法,参数就是BaseMapper<>中指定的参数,插入数据某个数据为 null 时会自动判断,不进行插入
// 插入
public void insertType(Type type){
this.typeMapper.insert(type);
}
controller层调用
@RequestMapping("/insert")
public void insertType(){
Type type = new Type();
type.setId(7);
// type.setName("abc"); // 此时不对name属性进行设置
type.setParentId(1);
this.typeService.insertType(type);
}
输出的 insert 语句
常见问题
- 数据库中设置自增(AUTOINCREMENT)id时,如果插入数据没有指定,则会按着策略执行 id 自增;
- 表中的id字段的名称不叫id时,指定@TableId注释对应id属性
@TableId
private int typeId;
(这个是教学视频中的问题,但我在实际操作中,id字段的名称不为id但是表中的名字与类中的名字形成对应 type_id === typeId,只是在启动时报一个warn表示没找到@TableId,insert操作可正常执行)
排除非表中字段
有时实体类中会有写数据不对应表中任何字段,是通过一些操作的计算或者组装的临时数据,这个时候如果不进行配置,当这种属性有数据时MyBatis-Plus会认为这个为数据库中的字段,执行插入操作,此时会报错。
解决方法:
- 字段声明为 transient 使其不可序列化
(对于不希望在网络上传输的字段,transient的作用就是把这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化,意思是transient修饰的age字段,他的生命周期仅仅在内存中,不会被写到磁盘中)
详情可以看这篇文章transient关键字
private transient String mark; // table中没有对应字段,这只是做标记的数据
- 字段声明为 static
static修饰的静态变量也不会被序列化,Lombok不会给static声明的属性生成对应的getter、setter方法,需要自己手动添加
详情可看这篇文章static关键字
private static String mark; // table中没有对应字段,这只是做标记的数据
public static String getMark() {
return mark;
}
public static void setMark(String mark) {
Type.mark = mark;
}
- 添加注释@TableField(exist = false)
声明此数据在数据库中没有对应字段,exist 默认为 true
@TableField(exist = false)
private String mark; // table中没有对应字段,这只是做标记的数据