mybatis-plus的添加與修改詳解
mybatis-plus添加與修改
mybaits-plus幫我們簡(jiǎn)化了CRUD,這次來(lái)說(shuō)一下添加與修改的操作
由于我們所有的 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ù)庫(kù)插入的 id 默認(rèn)值為:全局的唯一 id
主鍵生成策略
分布式系統(tǒng)唯一 id 生成
這里主鍵是通過(guò)一個(gè)雪花算法進(jìn)行完成的。
主鍵自增
我們需要配置主鍵自增
1.實(shí)體類上 @TableId(type= IdType.AUTO)
2.數(shù)據(jù)庫(kù)字段一定要是自增的!

3.再次插入即可!
補(bǔ)充:主鍵自增是一種形式,還可以有其他的形式
NONE(1)未設(shè)置主鍵INPUT(2)手動(dòng)輸入主鍵ID_WORKER(3)默認(rèn)的全局唯一 idUUID(4)全局唯一 id uuidID_WORKER_STR(5)字符串表示法
更新操作
// 測(cè)試更新
@Test
public void testUpdate(){
User user = new User();
// 通過(guò)條件自動(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ù)庫(kù)表中經(jīng)常會(huì)有這樣的情況,數(shù)據(jù)添加與修改的時(shí)候需要被記錄,每一次操作都需要有時(shí)間,所有我們利用自動(dòng)填充來(lái)完成對(duì)時(shí)間的修改創(chuàng)建時(shí)間,修改時(shí)間!這些個(gè)操作都要自動(dòng)完成,不希望手動(dòng)
這里我們直接用代碼級(jí)別
給數(shù)據(jù)庫(kù)表中添加 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;
編寫處理器來(lái)處理這個(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);
}
}
最后重新測(cè)試插入操作,重新測(cè)試更新操作,觀察時(shí)間是否有所變化
mybatis-plus批量添加
mybatis-plus 當(dāng)前我用的最新版本
<dependency> ? ? <groupId>com.baomidou</groupId> ? ? <artifactId>mybatis-plus-boot-starter</artifactId> ? ? <version>3.5.1</version> </dependency>
找到這里我不用多說(shuō)了,mybatis-plus源碼的批量插入和修改是通過(guò)for循環(huán)轉(zhuǎn)化為多條的單條SQL循環(huán)進(jìn)行插入和修改,所以該方法是SQL拼接成一條SQL傳入數(shù)據(jù)庫(kù)
批量插入
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)文章
java連接Mysql數(shù)據(jù)庫(kù)的工具類
這篇文章主要介紹了java連接Mysql數(shù)據(jù)庫(kù)的工具類,非常的實(shí)用,推薦給大家,需要的朋友可以參考下2015-03-03
Spring Boot將項(xiàng)目打包成war包的操作方法
這篇文章主要介紹了Spring Boot將項(xiàng)目打包成war包的操作方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Java數(shù)據(jù)結(jié)構(gòu)徹底理解關(guān)于KMP算法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)關(guān)于KMP算法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn)
這篇文章主要介紹了以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn),線程池是Java實(shí)現(xiàn)多線程編程的基礎(chǔ),需要的朋友可以參考下2015-09-09
Java兩個(gè)乒乓球隊(duì)比賽名單問(wèn)題(判斷素?cái)?shù))
兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽比賽的名單。a說(shuō)他不和x比,c說(shuō)他不和x,z比,請(qǐng)編程序找出三隊(duì)賽手的名單2017-02-02

