MyBatis总结(十二)--获取非自增主键的值

本文介绍在MyBatis中通过两种方法获取Oracle数据库中非自增主键值的方法,包括在插入前查询序列及插入后查询当前序列值的方式,并提供了具体的XML映射文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

本文内容来自尚硅谷

代码从MyBatis总结(十一)--增加一条数据时,如何获取自动设置主键的id值

获取非自增主键值两种方式

 

方式一:在执行insert语句前查询出序列

映射文件如下写法

	<!-- 
	获取非自增主键的值:
		Oracle不支持自增;Oracle使用序列来模拟自增;
		每次插入的数据的主键是从序列中拿到的值;如何获取到这个值;
	 -->
	<insert id="addEmp" databaseId="oracle">
		<!-- 
		keyProperty:查出的主键值封装给javaBean的哪个属性
		order="BEFORE":当前sql在插入sql之前运行
			   AFTER:当前sql在插入sql之后运行
		resultType:查出的数据的返回值类型
		 -->
		<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
			select EMPLOYEES_SEQ.nextval from dual 
		</selectKey>
		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(#{id},#{lastName},#{email<!-- ,jdbcType=NULL -->}) 
	</insert>

说明一:databaseId=oracle:表示在oracle数据库时使用。此时在mybatis配置文件中已经配置了各个数据库厂商的别名 

	<databaseIdProvider type="DB_VENDOR">
		<!-- 为不同的数据库厂商起别名 -->
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>

说明二:selectKey标签中order=before表示再执行insert语句前就先执行该查询语句,查询出下一个序列

说明三:keyProperty:查出的主键值封装给javaBean的哪个属性

 

获取到主键值

	public void test03() throws IOException{
		
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//1、获取到的SqlSession不会自动提交数据
		SqlSession openSession = sqlSessionFactory.openSession();
		
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			//测试添加
			Employee employee = new Employee(null, "jerry4",null, "1");
			mapper.addEmp(employee);
			System.out.println(employee.getId());
			openSession.commit();
		}finally{
			openSession.close();
		}
		
	}

方式二:在执行insert语句后再查询出序列

映射文件方式如下

	<insert id="addEmp" databaseId="oracle">
		<selectKey keyProperty="id" order="AFTER" resultType="Integer">
			 select EMPLOYEES_SEQ.currval from dual
		</selectKey>

		insert into employees(EMPLOYEE_ID,LAST_NAME,EMAIL) 
		values(employees_seq.nextval,#{lastName},#{email})
	</insert>

 

说明一:这里的selectkey执行的查询语句与方式二不一样的放,order值为after,且获取的是当前序列值而不是nextval值

说明二:insert语句插入序列值,不再是#{id}而是直接employees_seq.nextval

 

 

这里建议使用方式一来获取非自增主键的值:因为在高并发的情况下,使用方式二很容易获取到的di值都是一样的

 

 

### MyBatis-Flex 获取主键的配置与使用方法 MyBatis-Flex 是 MyBatis强版,提供了更加灵活和强大的功能[^2]。在处理数据库自主键时,可以通过配置以及代码实现来获取插入后的自主键。 #### 1. 配置数据库支持自主键 确保数据库表设计中包含自主键字段。例如,在 MySQL 中可以这样定义表结构: ```sql CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自主键', name VARCHAR(50) NOT NULL COMMENT '用户名', age INT COMMENT '年龄' ) COMMENT='用户表'; ``` 上述 SQL 定义了 `id` 字段为自主键[^1]。 #### 2. 配置 MyBatis-Flex 的实体类 在 MyBatis-Flex 中,实体类需要与数据库表字段对应。以下是一个简单的实体类示例: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.mybatis.flex.annotation.FlexTable; @FlexTable("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; // Getter 和 Setter 方法 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } ``` 通过 `@TableId(type = IdType.AUTO)` 注解指定主键为自类型[^2]。 #### 3. Mapper 接口定义 定义一个 Mapper 接口用于操作数据库: ```java import com.mybatis.flex.mapper.FlexMapper; import org.apache.ibatis.annotations.Insert; public interface UserMapper extends FlexMapper<User> { @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})") int insertUser(User user); } ``` 上述代码中,`insertUser` 方法用于插入数据,而主键字段 `id` 由数据库自动生成[^1]。 #### 4. 获取主键 在插入数据后,可以通过实体对象直接获取主键。以下是具体示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public void addUser(String name, Integer age) { User user = new User(); user.setName(name); user.setAge(age); int result = userMapper.insertUser(user); if (result > 0) { System.out.println("插入成功,自主键为: " + user.getId()); } else { System.out.println("插入失败"); } } } ``` 当调用 `insertUser` 方法时,MyBatis-Flex 会自动将数据库生成的自主键填充到实体对象的 `id` 属性中[^3]。 ### 注意事项 - 确保数据库表的主键字段设置为自- 在实体类中正确配置 `@TableId` 注解,并指定 `IdType.AUTO`。 - 插入数据后,可通过实体对象直接获取主键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值