mybatis學習之路----insert主鍵返回 selectKey使用
點滴記載,點滴進步,願自己更上一層樓。
有時候新增一條資料,知道新增成功即可,但是有時候,需要這條新增資料的主鍵,以便邏輯使用,再將其查詢出來明顯不符合要求,效率也變低了。
這時候,通過一些設定,mybatis可以將insert的資料的主鍵返回,直接拿到新增資料的主鍵,以便後續使用。
這裡主要說的是selectKey標籤
設計表的時候有兩種主鍵,一種自增主鍵,一般為int型別,一種為非自增的主鍵,例如用uuid等。
首先說自增型別的主鍵。
1 對映xml中新增如下程式碼,註釋寫的很清楚了,不多做贅述。
2 介面 UserDao<!--新增資訊,並拿到新增資訊的表主鍵資訊。 新增資料,得到主鍵的外層寫法沒什麼特別,跟普通的insert一樣。只不過裡面加了selectKey--> <insert id="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 主鍵型別 --> <selectKey keyProperty="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
接下來就是測試了,public int 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); } return 0; }
UserDaoTest
/** * 注意,user.xml中已經說過,selectKey會將得到的主鍵放入model的主鍵屬性中, * 所以這裡獲取主鍵的方法一定是通過model.get主鍵才能獲取新增的主鍵 * @throws Exception */ @Test public void 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中。
<?xml version="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隔離,這個名字必須唯一
並且不能省略不寫也不能為空,不過名字倒是可以隨意,只要不跟另外一個檔案中的名字一樣即可-->
<mapper namespace="customer">
<!-- 跟普通的insert沒有什麼不同的地方 -->
<insert id="insert" parameterType="com.soft.mybatis.model.Customer">
<!-- 跟自增主鍵方式相比,這裡的不同之處只有兩點
1 insert語句需要寫id欄位了,並且 values裡面也不能省略
2 selectKey 的order屬性需要寫成BEFORE 因為這樣才能將生成的uuid主鍵放入到model中,
這樣後面的insert的values裡面的id才不會獲取為空
跟自增主鍵相比就這點區別,當然了這裡的獲取主鍵id的方式為 select uuid()
當然也可以另寫別生成函式。-->
<selectKey keyProperty="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.
*/
public interface CustomerDao {
int add(Customer customer);
}
實現類 CustomerDaoImpl
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.
*/
public class CustomerDaoImpl implements CustomerDao {
public int 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);
}
return 0;
}
}
準備工作完畢,下面進行測試。
執行前的資料
測試類 CustomerDaoImplTest
package com.soft.mybatis.dao.impl;
import com.soft.mybatis.dao.CustomerDao;
import com.soft.mybatis.model.Customer;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by xuweiwei on 2017/9/10.
*/
public class CustomerDaoImplTest {
private CustomerDao customerDao = new CustomerDaoImpl();
@Test
public void 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標
mybatis學習之路----動態sql之if條件判斷各種使用方式
點滴記載,點滴進步,願自己更上一層樓。 由於需要看到效果,所以這節最好可以將sql語句打印出來。參考 mybatis學習之路----列印sql語句 mybatis的if判斷語句其實跟el表示式的if條件判斷有些類似。 例如: <if test="id != nul
mybatis學習之路----#{}, ${}兩種傳引數方式的區別--附原始碼解讀
點滴記載,點滴進步,願自己更上一層樓。 首先下個結論, ${} 會將傳入的引數完全拼接到sql語句中,也就是相當於一個拼接符號。 也就是,最後的處理方式就相當於 String sql = select * from user where id=${value}....
mybatis學習之路----批量更新資料兩種方法效率對比
點滴記載,點滴進步,願自己更上一層樓。 上節探討了批量新增資料,這節探討批量更新資料兩種寫法的效率問題。 實現方式有兩種, 一種用for迴圈通過迴圈傳過來的引數集合,迴圈出N條sql, 另一種 用mysql的case when 條件判斷變相的進行批量更新 下面進行實現
mybatis學習之路----mysql批量新增資料
mybatis學習之路----批量更新資料 接下來兩節要探討的是批量插入和批量更新,因為這兩種操作在企業中也經常用到。 mysql新增語句 insert into 表名(欄位,欄位。。。
mybatis學習之路----動態sql之choose when otherwise
點滴記載,點滴進步,願自己更上一層樓。 choose節點,用法跟java中的switch 語法相似(官方文件這麼說,事實也是這樣)。 節點用法。 <choose>
Mysql學習之路06-外來鍵
外來鍵 外來鍵的作用,主要有兩個: 一個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性 對子表的約束:子表進行寫操作的時候,如果對應的外來鍵欄位在父表找不到對應的匹配,那麼操作失敗(約束子表資料操作) 對父表的約
mybatis學習之路----動態sql之foreach set
點滴記載,點滴進步,願自己更上一層樓。 就像jsp前臺展示少不了集合遍歷一樣,這裡也支援集合遍歷,生成動態sql。 像sql的in函式,批量操作都少不了集合的遍歷。 foreach可以遍歷所有的可以
mybatis學習之路(一)IDE中mybatis環境的搭建並顯示資料庫中一個表中的所有資訊
①在IDE中建立Maven web專案②匯入mybatis jar包<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId&g
Mybatis學習之路之Oracle多表查詢
Oracle 的多表查詢 ,主要是結合各種查詢進行組合。從而構造出一個複雜的查詢。 所以首先得掌握一些常用的多表查詢的方法。再根據實際情況來進行組合。 首先介紹的是 Union: 將多個表的結果集去除重複取並集 (使用的表是自帶的學習表
Springboot 結合mybatis的逆向生成外掛tk的insert方法實現uuid型別的主鍵返回
LZ試了好多方法,最終找到了一個有效的分享給大家。 就是在你需要返回主鍵的這個實體的mapper.xml檔案中覆蓋原先InsertMapper<T>中int insert方法 @InsertProvider(type = BaseInsertProvide
避坑必看:很詳盡的MyBatis返回自增主鍵實驗(包括插入或更新SQL語句insert on duplicate key update的自增主鍵返回情況)
目錄 (7)介面 5. 總結 本篇文章對MyBatis操作MySQL時自增主鍵返回情況進行詳細的實驗,給出不同情況下Mybatis返回自增主鍵的不同行為,僅基於實驗結果,不做原始碼分
mybatis之主鍵返回
一、主鍵返回之MySQL自增主鍵 思路: MySQL自增主鍵,是指在insert之前MySQL會自動生成一個自增的主鍵。 我們可以通過MySQL的函式獲取到剛插入的自增主鍵: LAST_INSERT_ID() 這個函式是在insert語句之後去呼
spring boot 學習之路3( 集成mybatis )
sys pat min lba asn ria [] system emp 下面就簡單來說一下spring boot 與mybatiis的整合問題,如果你還沒學習spring boot的註解的話,要先去看spring boot的註解 好了,現在讓我們來搞一下與mybat
JS學習之路系列總結四象陣(此文猶如武林之中的易筋經,是你馳騁IT界的武功心法,學會JS五大陣法就學會了JS,博主建議先學三才陣)
元素 ins dom 命名 aslist element 多個 及其 nod 四象陣法: 增加 刪除 改變 查找 【為了便於記憶,減少占用大腦內存,我命名為JS心法為:道陣法,兩儀陣法,三才陣法,四象陣法,五行陣法,只需記住陣法的關鍵字,即可搜索大腦中相應的內容,學
mybatis主鍵返回
類型 查詢 bsp tis 結果 主鍵 sel last 插入語 Mybatis主鍵返回:在<insert>標簽裏添加下面的內容 <selectKey keyProperty="id" resultType="long" order="AFTER">
機器學習之路:python 特征降維 主成分分析 PCA
repo nts total python learning bsp ota spa 像素 python3 學習api使用 主成分分析方法實現降低維度 使用了網絡上的數據集,我已經下載到了本地,可以去我的git上參考 git:https://github.com/lin
【mybatis】mybatis中insert 主鍵自增和不自增的插入情況【mysql】
pro SQ class TE IV rop generate mys bat 主鍵不自增:返回值是插入的條數 <insert id="add" parameterType="EStudent"> insert into TStudent(name,
學習之路(五)淺談:三種語句結構,vim編輯器快捷鍵及使用方法,find命令使用
vim編輯器循環;forwhileuntil for 變量 in 列表; do 循環體 done e.g for I in ‘seq 1 $FILE‘ ; doecho "Hello,‘head -n $I