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 configuration PUBLIC "-//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 mapper PUBLIC "-//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; @BeforeEach public void setup() throws IOException { // 获取资源流,读取"mybatis-config.xml"文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 使用资源流创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 使用SqlSessionFactory打开一个Session sqlSession = sqlSessionFactory.openSession(); //基于Mapper接口编程 empMapper = sqlSession.getMapper(EmpMapper.class); } // 在每个测试用例之后执行的清理方法 @AfterEach public void teardown() { sqlSession.commit(); // 提交事务 sqlSession.close(); // 关闭SqlSession } @Test public 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 操作以获取插入后的主键值。