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即可。

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