1. 程式人生 > >insert主鍵返回 selectKey使用

insert主鍵返回 selectKey使用

有時候新增一條資料,知道新增成功即可,但是有時候,需要這條新增資料的主鍵,以便邏輯使用,再將其查詢出來明顯不符合要求,效率也變低了。

這時候,通過一些設定,mybatis可以將insert的資料的主鍵返回,直接拿到新增資料的主鍵,以便後續使用。

這裡主要說的是selectKey標籤

設計表的時候有兩種主鍵,一種自增主鍵,一般為int型別,一種為非自增的主鍵,例如用uuid等。

首先說自增型別的主鍵。

1  對映xml中新增如下程式碼,註釋寫的很清楚了,不多做贅述。

  1. <!--新增資訊,並拿到新增資訊的表主鍵資訊。  
  2.     新增資料,得到主鍵的外層寫法沒什麼特別,跟普通的insert一樣。只不過裡面加了selectKey-->
  3. <insertid="insertAndgetkey"parameterType="com.soft.mybatis.model.User">
  4.     <!--selectKey  會將 SELECT LAST_INSERT_ID()的結果放入到傳入的model的主鍵裡面,  
  5.         keyProperty 對應的model中的主鍵的屬性名,這裡是 user 中的id,因為它跟資料庫的主鍵對應  
  6.         order AFTER 表示 SELECT LAST_INSERT_ID() 在insert執行之後執行,多用與自增主鍵,  
  7.               BEFORE 表示 SELECT LAST_INSERT_ID() 在insert執行之前執行,這樣的話就拿不到主鍵了,  
  8.                     這種適合那種主鍵不是自增的型別  
  9.         resultType 主鍵型別 -->
  10.     <selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">
  11.         SELECT LAST_INSERT_ID()  
  12.     </selectKey>
  13.     insert into t_user (username,password,create_date) values(#{username},#{password},#{createDate})  
  14. </insert>
2 介面 UserDao
  1. /** 
  2.  * 新增使用者資訊,並得到新增資料的主鍵 
  3.  *      主鍵自增 
  4.  * @return 
  5.  */
  6. int insertAndGeyKey(User user);  

3 實現類 UserDaoImpl
  1. publicint insertAndGeyKey(User user) {  
  2.     SqlSession sqlSession = null;  
  3.     try {  
  4.         sqlSession = SqlsessionUtil.getSqlSession();  
  5.         int key =  sqlSession.insert("test.insertAndgetkey",user);  
  6.         // commit
  7.         sqlSession.commit();  
  8.         return key;  
  9.     } catch (Exception e) {  
  10.         sqlSession.rollback();  
  11.         e.printStackTrace();  
  12.     } finally {  
  13.         SqlsessionUtil.closeSession(sqlSession);  
  14.     }  
  15.     return0;  
  16. }  
接下來就是測試了,

UserDaoTest

  1. /** 
  2.  * 注意,user.xml中已經說過,selectKey會將得到的主鍵放入model的主鍵屬性中, 
  3.  * 所以這裡獲取主鍵的方法一定是通過model.get主鍵才能獲取新增的主鍵 
  4.  * @throws Exception 
  5.  */
  6. @Test
  7. publicvoid insertAndGeyKey() throws Exception {  
  8.     User user = new User();  
  9.     user.setUsername("新增得到主鍵5");  
  10.     user.setPassword("123456");  
  11.     user.setCreateDate(new Date());  
  12.     int  result = dao.insertAndGeyKey(user);  
  13.     System.out.println("insertAndGeyKey :" + result);  
  14.     // 獲取新增資料主鍵
  15.     System.out.println("新增資料的主鍵 :" + user.getId());  
  16. }  

資料庫表新增資料主鍵為 34 



junit測試結果  得到主鍵 34  測試成功。


2 自增主鍵的獲取方法,說完了,下面來講講非自增主鍵的獲取方法。大致一樣,些許不同。

由於只有一張表,這裡又新建了一張表,對應的xml,別忘了將新建的xml新增到sqlMapConfig.xml中。

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE mapper  
  3.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace名稱空間,有種java package的感覺,sql隔離,這個名字必須唯一  
  6. 並且不能省略不寫也不能為空,不過名字倒是可以隨意,只要不跟另外一個檔案中的名字一樣即可-->
  7. <mappernamespace="customer">
  8.     <!-- 跟普通的insert沒有什麼不同的地方 -->
  9.     <insertid="insert"parameterType="com.soft.mybatis.model.Customer">
  10.         <!-- 跟自增主鍵方式相比,這裡的不同之處只有兩點  
  11.                     1  insert語句需要寫id欄位了,並且 values裡面也不能省略  
  12.                     2 selectKey 的order屬性需要寫成BEFORE 因為這樣才能將生成的uuid主鍵放入到model中,  
  13.                     這樣後面的insert的values裡面的id才不會獲取為空  
  14.               跟自增主鍵相比就這點區別,當然了這裡的獲取主鍵id的方式為 select uuid()  
  15.               當然也可以另寫別生成函式。-->
  16.         <selectKeykeyProperty="id"order="BEFORE"resultType="String">
  17.             select uuid()  
  18.         </selectKey>
  19.         insert into t_customer (id,c_name,c_sex,c_ceroNo,c_ceroType,c_age)  
  20.         values (#{id},#{name},#{sex},#{ceroNo},#{ceroType},#{age})  
  21.     </insert>
  22. </mapper>

介面  CustomerDao
  1. package com.soft.mybatis.dao;  
  2. import com.soft.mybatis.model.Customer;  
  3. /** 
  4.  * Created by xuweiwei on 2017/9/10. 
  5.  */
  6. publicinterface CustomerDao {  
  7.     int add(Customer customer);  
  8. }  
實現類 CustomerDaoImpl
  1. package com.soft.mybatis.dao.impl;  
  2. import com.soft.mybatis.Util.SqlsessionUtil;  
  3. import com.soft.mybatis.dao.CustomerDao;  
  4. import com.soft.mybatis.model.Customer;  
  5. import org.apache.ibatis.session.SqlSession;  
  6. /** 
  7.  * Created by xuweiwei on 2017/9/10. 
  8.  */
  9. publicclass CustomerDaoImpl implements CustomerDao {  
  10.     publicint add(Customer customer) {  
  11.         SqlSession sqlSession = null;  
  12.         try {  
  13.             sqlSession = SqlsessionUtil.getSqlSession();  
  14.             int key =  sqlSession.insert("customer.insert", customer);  
  15.             // commit
  16.             sqlSession.commit();  
  17.             return key;  
  18.         } catch (Exception e) {  
  19.             sqlSession.rollback();  
  20.             e.printStackTrace();  
  21.         } finally {  
  22.             SqlsessionUtil.closeSession(sqlSession);  
  23.         }  
  24.         return0;  
  25.     }  
  26. }  
準備工作完畢,下面進行測試。

執行前的資料 


測試類  CustomerDaoImplTest

  1. package com.soft.mybatis.dao.impl;  
  2. import com.soft.mybatis.dao.CustomerDao;  
  3. import com.soft.mybatis.model.Customer;  
  4. import org.junit.Test;  
  5. importstatic org.junit.Assert.*;  
  6. /** 
  7.  * Created by xuweiwei on 2017/9/10. 
  8.  */
  9. publicclass CustomerDaoImplTest {  
  10.     private CustomerDao customerDao = new CustomerDaoImpl();  
  11.     @Test
  12.     publicvoid add() throws Exception {  
  13.         Customer customer = new Customer();  
  14.         customer.setName("全球鷹1");  
  15.         customer.setAge(15);  
  16.         customer.setCeroNo("888888888888");  
  17.         customer.setCeroType(2);  
  18.         customer.setSex(1);  
  19.         int result = customerDao.add(customer);  
  20.         System.out.println("插入結果 : "+result);  
  21.         System.out.println("插入主鍵id : "+customer.getId());  
  22.     }  
  23. }  
測試結果


資料庫


可以看到新增的資料的主鍵已經獲取到了。

注意點:獲取主鍵,一定要從穿進去的model中獲取。

附  新增customer表的建表ddl

  1. CREATE TABLE `t_customer` (  
  2.   `id` varchar(50) NOT NULL,  
  3.   `c_name` varchar(20) DEFAULT NULL COMMENT '姓名',  
  4.   `c_sex` tinyint(4) DEFAULT NULL COMMENT '性別',  
  5.   `c_ceroNo` varchar(18) DEFAULT NULL COMMENT '證件號碼',  
  6.   `c_ceroType` tinyint(4) DEFAULT NULL COMMENT '1 身份證 2其他',  
  7.   `c_age` int(3) DEFAULT NULL COMMENT '年齡',  
  8.   PRIMARY KEY (`id`)  
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

相關推薦

mybatis學習之路----insert返回 selectKey使用

點滴記載,點滴進步,願自己更上一層樓。 有時候新增一條資料,知道新增成功即可,但是有時候,需要這條新增資料的主鍵,以便邏輯使用,再將其查詢出來明顯不符合要求,效率也變低了。 這時候,通過一些設定

insert返回 selectKey使用

有時候新增一條資料,知道新增成功即可,但是有時候,需要這條新增資料的主鍵,以便邏輯使用,再將其查詢出來明顯不符合要求,效率也變低了。這時候,通過一些設定,mybatis可以將insert的資料的主鍵返回,直接拿到新增資料的主鍵,以便後續使用。這裡主要說的是selectKey標

Springboot 結合mybatis的逆向生成外掛tk的insert方法實現uuid型別的返回

LZ試了好多方法,最終找到了一個有效的分享給大家。 就是在你需要返回主鍵的這個實體的mapper.xml檔案中覆蓋原先InsertMapper<T>中int insert方法 @InsertProvider(type = BaseInsertProvide

Mybatis插入時返回自增selectKey和useGeneratedKeys)

通過selectKey在插入操作前或者操作後獲取key值,做為欄位插入或返回欄位。(此段程式碼獲取的序列值id作為欄位值插入到實體類中返回)  <insert id="insert"> <selectKey keyProperty="id" result

避坑必看:很詳盡的MyBatis返回自增實驗(包括插入或更新SQL語句insert on duplicate key update的自增返回情況)

目錄 (7)介面 5. 總結 本篇文章對MyBatis操作MySQL時自增主鍵返回情況進行詳細的實驗,給出不同情況下Mybatis返回自增主鍵的不同行為,僅基於實驗結果,不做原始碼分

mybatis返回

類型 查詢 bsp tis 結果 主鍵 sel last 插入語 Mybatis主鍵返回:在<insert>標簽裏添加下面的內容 <selectKey keyProperty="id" resultType="long" order="AFTER">

【mybatis】mybatis中insert 自增和不自增的插入情況【mysql】

pro SQ class TE IV rop generate mys bat 主鍵不自增:返回值是插入的條數 <insert id="add" parameterType="EStudent"> insert into TStudent(name,

mybatis的執行流程 #{}和${} Mysql自增返回

ola save select .org 經驗 sel 占位符 upd 執行 n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的運行環境等信息。 Mapper.xml文件即Sql映射文件,文件中配置了操作數據庫的Sql語句。此文件需

自增與不自增的返回 返回

<mapper namespace="test"> <insert id="insertUser" parameterType="dancheng.mybatis.po.User"> <!--

mybatis插入自增返回

對於支援主鍵自增的sql而言,如mysql、sql server 如下方法: <insert id="addBook" parameterType="Book" useGeneratedKeys

mybatis返回策略

自增id 注意事項,mapper介面的引數必須是實體類形式傳入才能返回插入的id,然後返回的id直接在controller插入語句下面直接呼叫就可以獲取到了 表裡的id欄位必須設定成主鍵自增的  uuid方式,這個實體類和資料庫表根上面

mybatis mysql自增返回

對於自增主鍵的返回 <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- selectKey實現將主鍵返回,將主鍵返回到user物件

mybaits 配置insert 自動增長失效原因

初次涉獵mybaits 框架和mysql 資料庫導致框架使用出現很多的低階失誤,在此分享給大家避免此類錯誤: 配置檔案 <insert id="insertUser1" parameterType="domain.User" useGenerated

springmvc-mybatis的增刪改查以及返回

基於原始dao開發,而不是mapper代理 1.usermapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//

jdbc獲取insert

很多時候,當插入一條記錄後,希望馬上獲得插入的主鍵id, 不少獲得這個id的方法是 select max(id) from tablename; 為了獲得這個id需要多執行一次sql語句。 PostgreSQL提供了RETURNING語句在插入後立刻獲得這個id,具體方法

關於mybatis返回

在實際工作中有很多需求是需要返回插入資料的那條主鍵的,所以在mybatis配置時,若為mysql則有兩種方式,前提條件時,該主鍵是配置的自增長模式1.在插入資料的xml中配置2.在service層方法中

【MyBatis】——自增與非自增返回

  mysql自增主鍵,執行insert提交之前自動生成一個自增主鍵。當時一直沒有想為什麼要返回主鍵,也就是返回就返回了吧,總是有用的,確實,返回來有可能會作為下一次查詢的依據,或者下一個插入的外來鍵的憑證,總之,先返回來再說…… 實現思想是醬紫的:通過mysql函式獲

mybatis之返回

一、主鍵返回之MySQL自增主鍵 思路: MySQL自增主鍵,是指在insert之前MySQL會自動生成一個自增的主鍵。 我們可以通過MySQL的函式獲取到剛插入的自增主鍵: LAST_INSERT_ID() 這個函式是在insert語句之後去呼

mysql insert一條記錄(事務提交之前)怎樣返回建立記錄的id,last_insert_id(),selectkey && 標籤屬性

mysql插入資料後返回自增ID的方法   mysql和oracle插入的時候有一個很大的區別是,oracle支援序列做id,mysql本身有一個列可以做自增長欄位,mysql在插入一條資料後,如何能獲得到這個自增id的值呢?   方法一:是使用last_insert_id mysql> SELE

java mybatis中insert 操作 返回的小技巧。。。。

res des lec oracl 嵌入 tid batis 元素 ble 第一種方式: 在實體類的映射文件 "*Mapper.xml" 這樣寫: <insert id="insertvmatedic" keyColumn="mdid" useGeneratedKe