Mybatis-plus插入后返回元素id的問題
mybatis-plus插入后返回插入元素的id
有三種方法,第三種最簡(jiǎn)單。
不想麻煩的直接看第三種
1.mybatis原生
mybaits-plus要使用mybatis原生需要一下配置,指定下mapper文件的位置就好
mybatis-plus: ? mapper-locations: classpath*:mapperxml/*Mapper.xml
直接先看mapper.xml文件,這個(gè)insert語句實(shí)際上就是插入MouldMessage這個(gè)我定義的實(shí)體類。
<mapper namespace="com.hwz.MessageMouldMapper"> ? ? <insert id="testInsert" useGeneratedKeys="true" keyProperty="id"> ? ? ? ? INSERT INTO t_XXXX ? ? ? ? XXXXXX,XXXX,XXXXX ? ? ? ? VALUES XXXX,XXXX,XXXX ? ? </insert> </mapper>
userGenerateKeys告訴mybatis使用自增主鍵,keyProperty指定這個(gè)主鍵名稱叫id。
然后再mapper接口定義這個(gè)方法
Long testInsert(MessageMould messageMould);
調(diào)用這個(gè)插入語句,information這個(gè)實(shí)例時(shí)沒有定義id,創(chuàng)建時(shí)間這些字段的,輸出結(jié)果是數(shù)據(jù)表修改條數(shù),這里插入一條,所以返回1。
System.out.println(messageMouldMapper.testInsert(information)+“----”);
然后這時(shí)候我們輸出下information的一些屬性,發(fā)現(xiàn)本來作為參數(shù)的information被mybatis自動(dòng)填充上了id和創(chuàng)建時(shí)間
System.out.println(information.getId()+“*******”+information.getCreateTime());
所以結(jié)論就是,插入之后找傳入的參數(shù),就能找到新增加元素的id
2.使用mybatis-plus注解
其實(shí)跟原生mybatis一樣,插入后元素的id會(huì)直接映射到參數(shù)中,只不過用注解代替了mapper.xml文件
@Insert(value = "INSERT INTO t_XXXX" + ? ? ? ? "XXX,XXX,XXX " + ? ? ? ? "VALUES (XXX,XXX,XXX)") @SelectKey(statement="select LAST_INSERT_ID()",keyProperty = "id",before = false,resultType = Long.class) Integer testInsert1(MessageMould messageMould);
執(zhí)行完這條insert操作后,直接拿形參messageMould的id,就能拿到id
3.使用mybatis-plus提供的insert
mybatis只要extends BaseMapper就可以調(diào)用他的insert方法。其實(shí)也就跟上面2個(gè)一樣。i調(diào)用insert(MessageMould messageMould)后,id會(huì)映射到形參messageMould中,直接拿形參messageMould的id,就能拿到id
Mybatis-plus設(shè)置id自增,插入數(shù)據(jù)
沒修改前
這是我的實(shí)體類。
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Company {
? private Integer id;
? private String cid;
? private String cname;
? private String address;
? private String representation;
? private String phone;
? private String email;
? private String weburl;
? private String introductory;
}我的數(shù)據(jù)庫(kù)設(shè)置的是id自增。 添加數(shù)據(jù)時(shí)沒有加上id的數(shù)據(jù)。
然后報(bào)錯(cuò)
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@59238b99]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3cc8aa87] was not registered for synchronization because synchronization is not active
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3cc8aa87]
2021-11-07 14:28:06.789 ERROR 5620 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.dk.pojo.Company' with value '1457233381002637313' Cause: java.lang.IllegalArgumentException: argument type mismatch] with root cause
查詢得知,當(dāng)時(shí)實(shí)體中,plus主鍵生成方式不設(shè)置生成方式時(shí),默認(rèn)的是自增。而且生成的值就如報(bào)錯(cuò)中的‘1457233381002637313’很長(zhǎng)的一個(gè)值。
而主鍵的設(shè)置類型有:
AUTO(0, “數(shù)據(jù)庫(kù)ID自增”), INPUT(1, “用戶輸入ID”), ID_WORKER(2, “全局唯一ID”), UUID(3, “全局唯一ID”), NONE(4, “該類型為未設(shè)置主鍵類型”), ID_WORKER_STR(5, “字符串全局唯一ID”);
所以修改后
第一次:
@TableId( type = IdType.AUTO) private Integer id;
這樣的修改跟修改前一樣。我們需要的是12、13這樣的序列,所以需要設(shè)置id生成方式,就需要在注解設(shè)置value的值。
@TableId(value = “id”, type = IdType.AUTO) private Integer id;
這樣指定id的值,我們?cè)谟胮lus插件insert時(shí)就不用插入id的值。生成的id值跟數(shù)據(jù)庫(kù)對(duì)應(yīng)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java 分轉(zhuǎn)元與元轉(zhuǎn)分實(shí)現(xiàn)操作
這篇文章主要介紹了java 分轉(zhuǎn)元與元轉(zhuǎn)分實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
java驗(yàn)證用戶是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄
這篇文章主要介紹了java驗(yàn)證用戶是否已經(jīng)登錄,java實(shí)現(xiàn)自動(dòng)登錄,感興趣的小伙伴們可以參考一下2016-04-04
詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn)
這篇文章主要介紹了詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn),備忘錄模式數(shù)據(jù)的存儲(chǔ)過程中應(yīng)當(dāng)注意淺拷貝和深拷貝的問題,需要的朋友可以參考下2016-04-04
springboot基于keytool實(shí)現(xiàn)https的雙向認(rèn)證示例教程
這篇文章主要介紹了springboot基于keytool實(shí)現(xiàn)https的雙向認(rèn)證,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Idea 配置國(guó)內(nèi) Maven 源的圖文教程
這篇文章主要介紹了Idea 配置國(guó)內(nèi) Maven 源的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
Java利用MultipartFile實(shí)現(xiàn)上傳多份文件的代碼
這篇文章主要介紹了Java利用MultipartFile實(shí)現(xiàn)上傳多份文件的代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
Java創(chuàng)建型設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡(jiǎn)單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時(shí)需要使用抽象工廠模式,抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)2022-09-09
SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能
Milvus?是一種高性能、高擴(kuò)展性的向量數(shù)據(jù)庫(kù),可在從筆記本電腦到大型分布式系統(tǒng)等各種環(huán)境中高效運(yùn)行,Deeplearning4j(DL4J)是一個(gè)開源的深度學(xué)習(xí)框架,專門為Java和Scala開發(fā),本文給大家介紹了SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能2024-10-10

