insert主鍵返回 selectKey使用
有時候新增一條資料,知道新增成功即可,但是有時候,需要這條新增資料的主鍵,以便邏輯使用,再將其查詢出來明顯不符合要求,效率也變低了。
這時候,通過一些設定,mybatis可以將insert的資料的主鍵返回,直接拿到新增資料的主鍵,以便後續使用。
這裡主要說的是selectKey標籤
設計表的時候有兩種主鍵,一種自增主鍵,一般為int型別,一種為非自增的主鍵,例如用uuid等。
首先說自增型別的主鍵。
1 對映xml中新增如下程式碼,註釋寫的很清楚了,不多做贅述。
- <!--新增資訊,並拿到新增資訊的表主鍵資訊。
- 新增資料,得到主鍵的外層寫法沒什麼特別,跟普通的insert一樣。只不過裡面加了selectKey-->
- <insertid="insertAndgetkey"parameterType="com.soft.mybatis.model.User">
- <!--selectKey 會將 SELECT LAST_INSERT_ID()的結果放入到傳入的model的主鍵裡面,
- keyProperty 對應的model中的主鍵的屬性名,這裡是 user 中的id,因為它跟資料庫的主鍵對應
- order AFTER 表示 SELECT LAST_INSERT_ID() 在insert執行之後執行,多用與自增主鍵,
- BEFORE 表示 SELECT LAST_INSERT_ID() 在insert執行之前執行,這樣的話就拿不到主鍵了,
- 這種適合那種主鍵不是自增的型別
- resultType 主鍵型別 -->
- <selectKeykeyProperty="id"order="AFTER"resultType="java.lang.Integer">
- SELECT LAST_INSERT_ID()
- </selectKey>
- insert into t_user (username,password,create_date) values(#{username},#{password},#{createDate})
- </insert>
- /**
- * 新增使用者資訊,並得到新增資料的主鍵
- * 主鍵自增
- * @return
- */
- int insertAndGeyKey(User user);
3 實現類 UserDaoImpl
- publicint insertAndGeyKey(User user) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlsessionUtil.getSqlSession();
- int key = sqlSession.insert("test.insertAndgetkey",user);
- // commit
- sqlSession.commit();
- return key;
- } catch (Exception e) {
- sqlSession.rollback();
- e.printStackTrace();
- } finally {
- SqlsessionUtil.closeSession(sqlSession);
- }
- return0;
- }
UserDaoTest
- /**
- * 注意,user.xml中已經說過,selectKey會將得到的主鍵放入model的主鍵屬性中,
- * 所以這裡獲取主鍵的方法一定是通過model.get主鍵才能獲取新增的主鍵
- * @throws Exception
- */
- @Test
- publicvoid insertAndGeyKey() throws Exception {
- User user = new User();
- user.setUsername("新增得到主鍵5");
- user.setPassword("123456");
- user.setCreateDate(new Date());
- int result = dao.insertAndGeyKey(user);
- System.out.println("insertAndGeyKey :" + result);
- // 獲取新增資料主鍵
- System.out.println("新增資料的主鍵 :" + user.getId());
- }
資料庫表新增資料主鍵為 34
junit測試結果 得到主鍵 34 測試成功。
2 自增主鍵的獲取方法,說完了,下面來講講非自增主鍵的獲取方法。大致一樣,些許不同。
由於只有一張表,這裡又新建了一張表,對應的xml,別忘了將新建的xml新增到sqlMapConfig.xml中。
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <!-- namespace名稱空間,有種java package的感覺,sql隔離,這個名字必須唯一
- 並且不能省略不寫也不能為空,不過名字倒是可以隨意,只要不跟另外一個檔案中的名字一樣即可-->
- <mappernamespace="customer">
- <!-- 跟普通的insert沒有什麼不同的地方 -->
- <insertid="insert"parameterType="com.soft.mybatis.model.Customer">
- <!-- 跟自增主鍵方式相比,這裡的不同之處只有兩點
- 1 insert語句需要寫id欄位了,並且 values裡面也不能省略
- 2 selectKey 的order屬性需要寫成BEFORE 因為這樣才能將生成的uuid主鍵放入到model中,
- 這樣後面的insert的values裡面的id才不會獲取為空
- 跟自增主鍵相比就這點區別,當然了這裡的獲取主鍵id的方式為 select uuid()
- 當然也可以另寫別生成函式。-->
- <selectKeykeyProperty="id"order="BEFORE"resultType="String">
- select uuid()
- </selectKey>
- insert into t_customer (id,c_name,c_sex,c_ceroNo,c_ceroType,c_age)
- values (#{id},#{name},#{sex},#{ceroNo},#{ceroType},#{age})
- </insert>
- </mapper>
介面 CustomerDao
- package com.soft.mybatis.dao;
- import com.soft.mybatis.model.Customer;
- /**
- * Created by xuweiwei on 2017/9/10.
- */
- publicinterface CustomerDao {
- int add(Customer customer);
- }
- package com.soft.mybatis.dao.impl;
- import com.soft.mybatis.Util.SqlsessionUtil;
- import com.soft.mybatis.dao.CustomerDao;
- import com.soft.mybatis.model.Customer;
- import org.apache.ibatis.session.SqlSession;
- /**
- * Created by xuweiwei on 2017/9/10.
- */
- publicclass CustomerDaoImpl implements CustomerDao {
- publicint add(Customer customer) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlsessionUtil.getSqlSession();
- int key = sqlSession.insert("customer.insert", customer);
- // commit
- sqlSession.commit();
- return key;
- } catch (Exception e) {
- sqlSession.rollback();
- e.printStackTrace();
- } finally {
- SqlsessionUtil.closeSession(sqlSession);
- }
- return0;
- }
- }
執行前的資料
測試類 CustomerDaoImplTest
- package com.soft.mybatis.dao.impl;
- import com.soft.mybatis.dao.CustomerDao;
- import com.soft.mybatis.model.Customer;
- import org.junit.Test;
- importstatic org.junit.Assert.*;
- /**
- * Created by xuweiwei on 2017/9/10.
- */
- publicclass CustomerDaoImplTest {
- private CustomerDao customerDao = new CustomerDaoImpl();
- @Test
- publicvoid add() throws Exception {
- Customer customer = new Customer();
- customer.setName("全球鷹1");
- customer.setAge(15);
- customer.setCeroNo("888888888888");
- customer.setCeroType(2);
- customer.setSex(1);
- int result = customerDao.add(customer);
- System.out.println("插入結果 : "+result);
- System.out.println("插入主鍵id : "+customer.getId());
- }
- }
資料庫
可以看到新增的資料的主鍵已經獲取到了。
注意點:獲取主鍵,一定要從穿進去的model中獲取。
附 新增customer表的建表ddl
- CREATE TABLE `t_customer` (
- `id` varchar(50) NOT NULL,
- `c_name` varchar(20) DEFAULT NULL COMMENT '姓名',
- `c_sex` tinyint(4) DEFAULT NULL COMMENT '性別',
- `c_ceroNo` varchar(18) DEFAULT NULL COMMENT '證件號碼',
- `c_ceroType` tinyint(4) DEFAULT NULL COMMENT '1 身份證 2其他',
- `c_age` int(3) DEFAULT NULL COMMENT '年齡',
- PRIMARY KEY (`id`)
- ) 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