mybatis-plus的添加與修改詳解
mybatis-plus添加與修改
mybaits-plus幫我們簡化了CRUD,這次來說一下添加與修改的操作
由于我們所有的 SQL 是不可見的,我們希望知道他是怎么執(zhí)行的,所以我們必須要看日志。
在properties中添加日志功能:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置日志完畢之后,后面的學(xué)習(xí)就需要注意這個(gè)自動(dòng)生成的SQL
插入操作
@Test public void testInsert(){ ? ? User user = new User(); ? ? user.setName("java2"); ? ? user.setAge(31); ? ? user.setEmail("13434423@qq.com"); ? ? int result = userMapper.insert(user);// 幫我們自動(dòng)生成 id ? ? System.out.println(result); ? ? // 受影響的行數(shù) ? ? System.out.println(user); ? ? ? // 發(fā)現(xiàn),id會(huì)自動(dòng)回填 }
數(shù)據(jù)庫插入的 id 默認(rèn)值為:全局的唯一 id
主鍵生成策略
分布式系統(tǒng)唯一 id 生成
這里主鍵是通過一個(gè)雪花算法進(jìn)行完成的。
主鍵自增
我們需要配置主鍵自增
1.實(shí)體類上 @TableId(type= IdType.AUTO)
2.數(shù)據(jù)庫字段一定要是自增的!
3.再次插入即可!
補(bǔ)充:主鍵自增是一種形式,還可以有其他的形式
NONE(1)
未設(shè)置主鍵INPUT(2)
手動(dòng)輸入主鍵ID_WORKER(3)
默認(rèn)的全局唯一 idUUID(4)
全局唯一 id uuidID_WORKER_STR(5)
字符串表示法
更新操作
// 測試更新 @Test public void testUpdate(){ User user = new User(); // 通過條件自動(dòng)拼接動(dòng)態(tài) sql user.setId(3L); user.setName("ABCD"); user.setAge(18); // 注意:updateById 但是參數(shù)是一個(gè) 對(duì)象?。?! int i = userMapper.updateById(user); System.out.println(i);  }
所有的 SQL 都是自動(dòng)幫我們動(dòng)態(tài)匹配的
自動(dòng)填充
我們?cè)跀?shù)據(jù)庫表中經(jīng)常會(huì)有這樣的情況,數(shù)據(jù)添加與修改的時(shí)候需要被記錄,每一次操作都需要有時(shí)間,所有我們利用自動(dòng)填充來完成對(duì)時(shí)間的修改創(chuàng)建時(shí)間,修改時(shí)間!這些個(gè)操作都要自動(dòng)完成,不希望手動(dòng)
這里我們直接用代碼級(jí)別
給數(shù)據(jù)庫表中添加 create_time、update_time 兩個(gè)字段
實(shí)體類上字段屬性需要加上注解TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT) // 時(shí)間特有的注解 private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
編寫處理器來處理這個(gè)時(shí)間特有的注解即可
在工程建立 handler 包,創(chuàng)建一個(gè) MyMetaObjectHandler 類
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { // 插入時(shí)的填充策略 @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill......."); // setFieldValByName(String fieldName, Object fieldVal, MetaObject meatObject) this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } // 更新時(shí)的填充策略 @Override public void updateFill(MetaObject metaObject) { log.info("start insert fill......."); this.setFieldValByName("updateTime",new Date(),metaObject); } }
最后重新測試插入操作,重新測試更新操作,觀察時(shí)間是否有所變化
mybatis-plus批量添加
mybatis-plus 當(dāng)前我用的最新版本
<dependency> ? ? <groupId>com.baomidou</groupId> ? ? <artifactId>mybatis-plus-boot-starter</artifactId> ? ? <version>3.5.1</version> </dependency>
找到這里我不用多說了,mybatis-plus源碼的批量插入和修改是通過for循環(huán)轉(zhuǎn)化為多條的單條SQL循環(huán)進(jìn)行插入和修改,所以該方法是SQL拼接成一條SQL傳入數(shù)據(jù)庫
批量插入
package com.guide.common.mybatis.mapper; import java.util.List; /** * @author * @version 1.0 * @date 2022/5/6 10:34 */ public interface SpiceBaseMapper<T> { /** * 批量插入 * {@link com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn} * * @param entityList 要插入的數(shù)據(jù) * @return 成功插入的數(shù)據(jù)條數(shù) */ int insertBatchSomeColumn(List<T> entityList); }
package com.guide.common.mybatis.mapper; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import org.springframework.stereotype.Component; import java.util.List; /** * @author * @version 1.0 * @date 2022/5/6 10:28 */ @Component public class SpiceSqlInjector extends DefaultSqlInjector { /** * 如果只需增加方法,保留mybatis plus自帶方法, * 可以先獲取super.getMethodList(),再添加add */ @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { // 注意:此SQL注入器繼承了DefaultSqlInjector(默認(rèn)注入器),調(diào)用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自帶方法 List<AbstractMethod> methodList = super.getMethodList(mapperClass); // 注入InsertBatchSomeColumn // 在!t.isLogicDelete()表示不要邏輯刪除字段,!"update_time".equals(t.getColumn())表示不要字段名為 update_time 的字段,不對(duì)進(jìn)行操作 // methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete() && !"update_time".equals(t.getColumn()))); // 要邏輯刪除 t.isLogicDelete() 默認(rèn)不要 methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete())); return methodList; } }
記住Java是可以接口多繼承的
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄的方式詳細(xì)介紹
這篇文章主要介紹了使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄,通過監(jiān)聽器去監(jiān)聽,當(dāng)訪問到具體的類方法,通過aop切面去獲取訪問的方法,然后將日志記錄下來,就這種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Java實(shí)現(xiàn)ATM系統(tǒng)超全面步驟解讀建議收藏
這篇文章主要為大家詳細(xì)介紹了用Java實(shí)現(xiàn)簡單ATM機(jī)功能,文中實(shí)現(xiàn)流程寫的非常清晰全面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03SpringAOP如何修改請(qǐng)求參數(shù)列表
這篇文章主要介紹了SpringAOP如何修改請(qǐng)求參數(shù)列表問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03springcloud集成skywalking實(shí)現(xiàn)全鏈路追蹤
在微服務(wù)治理中,springcloud也是技術(shù)選型中的一個(gè)成熟的解決方案,而且相對(duì)dubbo來說,springcloud涉及到的微服務(wù)組件更多,調(diào)用鏈路可能更復(fù)雜,本文將詳細(xì)介紹下如何在springcloud中集成skywalking,需要的朋友可以參考下2024-01-01關(guān)于jpa中無法刪除onetomany中many問題的解決
這篇文章主要介紹了關(guān)于jpa中無法刪除onetomany中many問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12