mybatis數據輸出-insert操作時獲取自增列的值給對應的屬性賦值

jdbc-修改 水果庫存系統的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客

1、建庫建表

CREATE DATABASE `mybatis-example`;USE `mybatis-example`;CREATE TABLE `t_emp`(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id)
);INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);

2、pom.xml

    <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- MySQL驅動 mybatis底層依賴jdbc驅動實現,本次不需要導入連接池,mybatis自帶! --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--junit5測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

3、Employee.java(pojo)

package com.atguigu.mybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {private Integer empId;private String empName;private Double empSalary;
}

4、EmpMapper.java

package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Employee;
public interface EmpMapper {//演示在insert操作時同時獲取自增長鍵值void addEmp(Employee employee);
}

5、mybatis-config.xml(mybatis的總配置文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 具體配置 --><!-- 從org.apache.ibatis.session.Configuration類中可以查看能使用的配置項 --><!-- 將mapUnderscoreToCamelCase屬性配置為true,表示開啟自動映射駝峰式命名規則 --><!-- 規則要求數據庫表字段命名方式:單詞_單詞 --><!-- 規則要求Java實體類屬性名命名方式:首字母小寫的駝峰式命名 --><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeAliases><!--<typeAlias type="com.atguigu.mybatis.pojo.Employee" alias="emp"/>--><package name="com.atguigu.mybatis.pojo"/></typeAliases><!-- environments表示配置Mybatis的開發環境,可以配置多個環境,在眾多具體環境中,使用default屬性指定實際運行時使用的環境。default屬性的取值是environment標簽的id屬性的值。 --><environments default="development"><!-- environment表示配置Mybatis的一個具體的環境 --><environment id="development"><!-- Mybatis的內置的事務管理器 --><transactionManager type="JDBC"/><!-- 配置數據源 --><dataSource type="POOLED"><!-- 建立數據庫連接的具體信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!-- Mapper注冊:指定Mybatis映射文件的具體位置 --><!-- mapper標簽:配置一個具體的Mapper映射文件 --><!-- resource屬性:指定Mapper映射文件的實際存儲位置,這里需要使用一個以類路徑根目錄為基準的相對路徑 --><!-- 對Maven工程的目錄結構來說,resources目錄下的內容會直接放入類路徑,所以這里我們可以以resources目錄為基準 --><mapper resource="mapper/EmpMapper.xml"/></mappers></configuration>

6、EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口類的全限定名,這樣實現對應 -->
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper"><!--在insert操作時,獲取自增長鍵值--><insert id="addEmp" useGeneratedKeys="true" keyProperty="empId">insert into t_emp values(0,#{empName},#{empSalary})</insert></mapper>

7、MybatisTest.java

package com.atguigu.mybatis;
import com.atguigu.mybatis.mapper.EmpMapper;
import com.atguigu.mybatis.pojo.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest {SqlSessionFactory sqlSessionFactory;SqlSession sqlSession;EmpMapper empMapper;@BeforeEachpublic void setup() throws IOException {// 獲取資源流,讀取"mybatis-config.xml"文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 使用資源流創建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 使用SqlSessionFactory打開一個SessionsqlSession = sqlSessionFactory.openSession();//基于Mapper接口編程empMapper = sqlSession.getMapper(EmpMapper.class);}// 在每個測試用例之后執行的清理方法@AfterEachpublic void teardown() {sqlSession.commit();  // 提交事務sqlSession.close();  // 關閉SqlSession}@Testpublic void test01() {Employee employee = new Employee(0, "張三豐", 300.0);empMapper.addEmp(employee);System.out.println(employee);}
}

?8、useGeneratedKeys

? ? ?"useGeneratedKeys" 是一個選項,通常在數據庫插入操作中使用。當執行插入操作時,數據庫會自動為某些列(通常是主鍵列)生成值。這些列的值在插入語句中不需要指定,數據庫會為它們分配一個唯一且隨機的值。

? ? ? 使用 "useGeneratedKeys" 選項可以讓應用程序在插入操作完成后獲取這些自動生成的值。這對于需要獲取插入記錄的唯一標識符的情況非常有用,比如在插入后需要立即對記錄進行更新或查詢。

? ? ? 在 MyBatis 中,"useGeneratedKeys" 選項通常與 "keyProperty" 選項一起使用。通過將 "useGeneratedKeys" 設置為 true,并指定 "keyProperty" 來指定要將生成的值賦給的對象屬性,可以在插入操作完成后將自動生成的值賦給對應的屬性。

下面是一個示例,展示了如何在 MyBatis 中使用 "useGeneratedKeys" 和 "keyProperty" 選項:

<insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id">  INSERT INTO user (username, password) VALUES (#{username}, #{password})  
</insert>

? ? 在這個示例中,假設有一個名為 "User" 的類,其中包含 "id"、"username" 和 "password" 屬性。通過將 "useGeneratedKeys" 設置為 true,并指定 "keyProperty" 為 "id",插入操作完成后,自動生成的主鍵值將被賦給 User 對象的 "id" 屬性。

? ? 在 Mybatis 中,使用 useGeneratedKeys 屬性可以讓我們方便地獲取自動生成的主鍵值。在進行 INSERT 操作時,如果數據庫表啟用了自動生成主鍵的功能,我們可以通過在 Mybatis 的 Mapper XML 文件中設置 useGeneratedKeys="true",然后在對應的 SQL 語句中使用 SELECT LAST_INSERT_ID() 函數或其他數據庫支持的獲取自增長 ID 的方法來獲得新插入的記錄的 ID 值。

以下是一個示例:

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO t_user (username, age, address) VALUES (#{username}, #{age}, #{address})
</insert>

? ? ?在這個例子中,我們聲明了一個 id 為 insertUser 的 INSERT SQL 語句,設置了 useGeneratedKeys 屬性為 true,并指定了 keyProperty 為 id。這就意味著,當執行這個 SQL 語句時,數據庫會自動生成一個主鍵,并將其賦值給 User 對象的 id 屬性,使得我們可以在該語句執行后立即獲取到主鍵值。

這樣,我們就可以在執行插入操作后立即獲取自增長主鍵的值,而無需再次執行 SELECT 操作以獲取插入后的主鍵值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

王炸升級!PartyRock 10分鐘構建 AI 應用

前言 一年一度的亞馬遜云科技的 re:Invent 可謂是全球云計算、科技圈的狂歡&#xff0c;每次都能帶來一些最前沿的方向標&#xff0c;這次也不例外。在看完一些 keynote 和介紹之后&#xff0c;我也去親自體驗了一些最近發布的內容。其中讓我感受最深刻的無疑是 PartyRock 了。…

基于SSM的健身房預約系統設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…

網絡安全攻擊預警/態勢預測算法匯總

總結&#xff1a; 網絡安全攻擊預警/態勢預測算法眾多&#xff0c;主要包括&#xff1a; 基于統計學的算法&#xff1a;協方差矩陣、馬爾可夫模型等&#xff1b; 基于機器學習的算法&#xff1a;貝葉斯網絡、聚類算法、支持向量機SVM、遺傳算法、層次分析法AHP、決策樹等&am…

每日一道算法題 1

借鑒文章&#xff1a;Java-敏感字段加密 - 嗶哩嗶哩 題目描述 給定一個由多個命令字組成的命令字符串&#xff1b; 1、字符串長度小于等于127字節&#xff0c;只包含大小寫字母&#xff0c;數字&#xff0c;下劃線和偶數個雙引號 2、命令字之間以一個或多個下劃線_進行分割…

Proxmark3 Easy救磚-20231209

事情是這樣的&#xff0c;在淘寶買了個PM3&#xff0c;拿到手后刷固件的&#xff0c;一不小心刷成磚頭了&#xff0c;現象就是四個燈全亮&#xff0c;插上電腦USB不識別。問商家他也不太懂&#xff0c;也是個半吊子技術&#xff0c;遠程給我刷機搞了半天也沒有搞定&#xff0c;…

微表情檢測(三)----基于光流特征的微表情檢測

Micro-expression spotting based on optical flow features 基于光流特征的微表情檢測 Abstract 本文提出了一種高精度和可解釋性的自動微表情檢測方法。首先&#xff0c;我們設計了基于鼻尖位置的圖像對齊方法&#xff0c;以消除由頭部晃動引起的全局位移。其次&#xff0…

C語言中的一維數組與二維數組

目錄 一維數組數組的創建初始化使用在內存中的存儲 二維數組創建初始化使用在內存中的存儲 數組越界 一維數組 數組的創建 數組是一組相同類型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面這個數組能否成功創建&#xff1f; int count…

Linux上編譯和測試V8引擎源碼

介紹 V8引擎是一款高性能的JavaScript引擎&#xff0c;廣泛應用于Chrome瀏覽器和Node.js等項目中。在本篇博客中&#xff0c;我們將介紹如何在Linux系統上使用depot_tools工具編譯和測試V8引擎源碼。 步驟一&#xff1a;安裝depot_tools depot_tools是一個用于Chromium開發…

學習IO的第七天

作業&#xff1a;使用消息隊列完成兩個進程間的相互通信 #include <head.h>struct msgbuf {long mtype; //消息類型char mtext[1024]; //正文大小 };#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[]) {//1.創…

打印一個整數的每一位和求階乘(遞歸和非遞歸的C語言實現)

文章目錄 打印一個整數的每一位思考遞歸非遞歸 求階乘遞歸非遞歸證明0的階乘為1 寫代碼中遇到的VS輸出窗口提示信息為什么VS平臺32位和64位的long都是4字節&#xff1f;%zu是什么格式說明符VS下_int128為什么用不了 打印一個整數的每一位 思考 負數和0都是整數&#xff0c;我…

DevEco Studio將編輯器整體文本改為簡體中文

我們打開編輯器 隨便進入一個項目 這里 我們左上角目錄 選擇 File下面菜單中的 Settings… 打開配置界面 然后在設置窗口左側導航欄中 選擇 Plugins 插件 然后上方導航欄中 選擇 Installed 參考下圖 然后 找到這個Chinese(Simplified) Chinese是什么應該不用我多說吧 我們把…

區塊鏈擴容問題研究【06】

1.Plasma&#xff1a;Plasma 是一種基于以太坊區塊鏈的 Layer2 擴容方案&#xff0c;它通過建立一個分層結構的區塊鏈網絡&#xff0c;將大量的交易放到子鏈上進行處理&#xff0c;從而提高了以太坊的吞吐量。Plasma 還可以通過智能合約實現跨鏈交易&#xff0c;使得不同的區塊…

Python面經【8】- Python設計模式專題-上卷

Python面經【8】- Python設計模式專題-上卷 一、接口二、單例模式(1) 方法一&#xff1a;使用模塊(2) 方法二&#xff1a; 裝飾器實現【手撕 理解】&#xff08;單下劃線 閉包 裝飾器 類方法&#xff09;(3) 方法三&#xff1a;基于__new__方法【new和init 】 設計模式是一…

簡單的 u-popup 彈出框

uniapp中的popup組件可以用于彈出簡單的提示框、操作框、菜單等。它可以通過position屬性控制彈出框的位置&#xff0c;不同的position值會使得彈出框呈現不同的彈出形式 目錄 一、實現思路 二、實現步驟 ①view部分展示 ②JavaScript 內容 ③css中樣式展示 三、效果展示 …

Linux系統---基于Pipe實現一個簡單Client-Server system

顧得泉&#xff1a;個人主頁 個人專欄&#xff1a;《Linux操作系統》 《C/C》 《LeedCode刷題》 鍵盤敲爛&#xff0c;年薪百萬&#xff01; 一、題目要求 Server是一個服務器進程&#xff0c;只能進行整數平方運算。Client要計算一個整數的平方的平方的平方&#xff0c;即…

聊聊 Jetpack Compose 原理 -- 穿透刺客 CompositionLocal

Compose 官方說明一直很簡潔&#xff1a;CompositionLocal 是通過組合隱式向下傳遞數據的工具。 我們先來看一段代碼&#xff1a; class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

datav-輪播排名-對數據進行處理

前言 對于大屏需求我們排名數據輪播也是經常需要用到的需求&#xff0c;datav也是給我們提供了 不是說我們自己不能寫&#xff0c;而是提供好的輪子比我們自己 寫的&#xff0c;更全面&#xff0c;更周到&#xff0c; 沒有特殊需求的話&#xff0c;使用datav配置一下完成這個…

mysqlsh導入json,最終還得靠navicat導入json

工作需要將一個巨大的10G的json導入mysql數據庫。 看到mysql官方有對json導入的支持。 如下&#xff1a; MySQL :: Import JSON to MySQL made easy with the MySQL Shell $ mysqlsh rootlocalhost:33300/test --import /path_to_file/zips.json Creating a session to root…

產品經理進階:以客戶為中心的8個維度

目錄 簡介 以客戶為中心 流程和組織維度 產品維度 CSDN學院《硬件產品進階課》

python:六種算法(DBO、RFO、WOA、GWO、PSO、GA)求解23個測試函數(python代碼)

一、六種算法簡介 1、蜣螂優化算法DBO 2、紅狐優化算法RFO 3、鯨魚優化算法WOA 4、灰狼優化算法GWO 5、粒子群優化算法PSO 6、遺傳算法GA 二、6種算法求解23個函數 &#xff08;1&#xff09;23個函數簡介 參考文獻&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…