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 操作以獲取插入后的主鍵值。