Mybatis Plus排除表中不存在字段的三种方式

1. 简单说明

1、声明该字段为 transient

private transient List<SpecParam> params;

2、声明该字段为 static

private static List<SpecParam> params;

3、通过注解@TableField(exist = false)声明

@TableField(exist = false)
private List<SpecParam> params;

以上三种方式可使对象中的属性不被序列化

2. MP 排除表中不存在字段的三种方式

首先来设定一个场景: 有这样一个Java实体类:Book

@Data
@TableName("t_book")
public class Book {

    @TableId
    private long id;

    private String bookName;
    
    private String remarks;
}

在此我们假设数据库中有一张t_book表,有主键id、书名两个字段。在Book类中remarks属性不属于这张表。

这时候加入有一个插入操作,类似于:

Book book = new Book();
book.setId(1)
book.setBookName("《Thinking In Java》");
book.setRemarks("我是图书的备注");
int rows = bookMapper.insert(book);

这时会报错,因为数据表中并不存在remarks字段。会报出字段不存在的异常,这时因为MP帮助我们做了映射。

解决方式一:添加transient关键字

在不是表中字段的属性前加上关键字transient,代表使用该关键字标识的属性,不会参与序列化过程。

如代码:

@Data
@TableName("t_book")
public class Book {

    @TableId
    private long id;

    private String bookName;
    
    private transient String remarks;
}

缺点是不能参与序列化了

解决方式二:声明变量为static类型

代码如下:

@Data
@TableName("t_book")
public class Book {

    @TableId
    private long id;

    private String bookName;
    
    private static String remarks;
    
    public static String getRemarks() {
        return remarks;
    }
    public static oid setRemarks(String remarks) {
        Book.remarks = remarks;
    }
}

注意

Lombok的@Data注解不会将静态变量生成getter、setter方法。

缺点:所有的Book都将设置成一样的。假如我们的需求是每一个Book对象都需要一份remarks字段,那声明成静态属性是不可以的。

解决方式三:使用MP的注解@TableField(exist = false) 代码如下:

@Data
@TableName("t_book")
public class Book {

    @TableId
    private long id;

    private String bookName;
    
    @TableField(exist = false)
    private String remarks;
}

说明: 这个exisit属性默认是true,即MP会为所有字段自动映射。在此设置成false即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章