1. 程式人生 > >mybatis學習之路----insert主鍵返回 selectKey使用

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

點滴記載,點滴進步,願自己更上一層樓。

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

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

這裡主要說的是selectKey標籤

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

首先說自增型別的主鍵。

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

    <!--新增資訊,並拿到新增資訊的表主鍵資訊。
        新增資料,得到主鍵的外層寫法沒什麼特別,跟普通的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>
2 介面 UserDao
    /**
     * 新增使用者資訊,並得到新增資料的主鍵
     *      主鍵自增
     * @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學習----動態sqlif條件判斷各種使用方式

點滴記載,點滴進步,願自己更上一層樓。 由於需要看到效果,所以這節最好可以將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學習----動態sqlchoose when otherwise

點滴記載,點滴進步,願自己更上一層樓。 choose節點,用法跟java中的switch 語法相似(官方文件這麼說,事實也是這樣)。 節點用法。 <choose>

Mysql學習06-外來

外來鍵 外來鍵的作用,主要有兩個: 一個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性 對子表的約束:子表進行寫操作的時候,如果對應的外來鍵欄位在父表找不到對應的匹配,那麼操作失敗(約束子表資料操作) 對父表的約

mybatis學習----動態sqlforeach 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

mybatismybatisinsert 自增和不自增的插入情況【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