關(guān)于JAVA項(xiàng)目公共字段自動(dòng)填充的理解
公共字段字段填充是什么?
“公共字段自動(dòng)填充”顧名思義,其實(shí)就是省略了在程序當(dāng)中對(duì)某些字段手動(dòng)填寫(xiě)的步驟,大大提高了效率!
為什么要使用公共字段填充技術(shù)在我們的程序當(dāng)中?
在我們項(xiàng)目的開(kāi)發(fā)中,當(dāng)我們?cè)谛薷臄?shù)據(jù)庫(kù)中的某些值的時(shí)候,有一些字段屬于公共子段,就是有些字段不僅是在某一個(gè)表里有,而是好幾張表里面都要設(shè)置這些字段。
為了簡(jiǎn)化項(xiàng)目的開(kāi)發(fā),縮小代碼量,我們就可以使用mybatis Plus為我們提供的公共字段填充功能,使我們的開(kāi)發(fā)更有效率,沒(méi)必要把時(shí)間和代碼量花費(fèi)在這些重復(fù)的工作上。具體可參考 https://blog.csdn.net/weixin_61724992/article/details/127435077
實(shí)現(xiàn)步驟:
1.在實(shí)體類的屬性上加入@TableField注解,指定自動(dòng)填充的策略
@TableField注解的fill屬性:
FieldFill.DEFAULT //默認(rèn)不自動(dòng)填充
FieldFill.INSERT //插入時(shí)自動(dòng)填充
FieldFill.UPDATE //修改時(shí)自動(dòng)填充
FieldFill.INSERT_UPDATE //插入和修改時(shí)都自動(dòng)填充
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("books")
public class Book {
private Integer ID;
private String booksname;
private String author;
@TableField(fill = FieldFill.INSERT)
private Integer num;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Double price;
}
2.按照框架要求編寫(xiě)元數(shù)據(jù)對(duì)象處理器,在此類中統(tǒng)一為公共字段賦值,此類需要實(shí)現(xiàn)MetaObjectHandler接口,并實(shí)現(xiàn)insertFill和updateFill方法,再使用MetaObject來(lái)設(shè)置對(duì)應(yīng)字段要自動(dòng)添加的值。
此類交spring管理,需要加上@Component注解
//公共字段自動(dòng)填充處理器
@Slf4j
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("添加時(shí)的操作...");
metaObject.setValue("字段名","值");
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("修改時(shí)的操作...");
metaObject.setValue("字段名","值");
}
}
對(duì)于自動(dòng)添加靜態(tài)值就如上即可
3.動(dòng)態(tài)值自動(dòng)添加
ThreadLocal
ThreadLocal并不是一個(gè)Thread,而是Thread的局部變量。hreadLocal為每個(gè)線程提供單獨(dú)一份存儲(chǔ)空間,具有線程隔離的效果,只有在線程內(nèi)才能獲取到對(duì)應(yīng)的值,線程外則不能訪問(wèn)。
簡(jiǎn)單概況為:在多線程并發(fā)情況下,每個(gè)線程中的變量都是相互獨(dú)立的(線程隔離效果)
創(chuàng)建一個(gè)ThreadLocal封裝類
public class BaseContext {
// 這里的Double不是固定,根據(jù)自己的需求決定
private static ThreadLocal<Double> threadLocal = new ThreadLocal<>();
public static void setCurrent(Double num) {
threadLocal.set(num);
}
public static Double getCurrent() {
return threadLocal.get();
}
}
回到MyMetaObjecthandler類中把具體值替換成BaseContext.getCurrent()即可
注:如果設(shè)置自動(dòng)填充的話,就必須滿足MyMetaObjecthandler 類中對(duì)應(yīng)方法的所有字段。例如insertFill方法中要自動(dòng)填充兩個(gè)字段,那么你就必須得在實(shí)體類中也要設(shè)置兩個(gè)字段與之匹配,如果想解決這類問(wèn)題需要在MyMetaObjecthandler 類中進(jìn)行相應(yīng)的設(shè)置
簡(jiǎn)單的測(cè)試
@Autowired
private BookService bookService;
@Test
void contextLoads() {
Book book = new Book();
book.setBooksname("三國(guó)演義");
book.setAuthor("羅貫中");
BaseContext.setCurrent(1111d);
bookService.save(book);
}
效果


浙公網(wǎng)安備 33010602011771號(hào)