mybatis使用自动生成的key值

这篇博客介绍了如何在MyBatis中配置mapper.xml文件,利用`useGeneratedKeys`和`keyProperty`属性实现自动生成并设置自增主键的值。在测试用例中展示了插入数据后,emp对象的eid属性会自动填充生成的主键。

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

1.mapper.xml中配置

<mapper namespace="com.xzb.mapper.ParamMapper">
    
	<!-- 使用自动生成的key值,key值放在user的属性eid中 -->
	<insert id="insertEmp" useGeneratedKeys="true" keyProperty="eid">
		insert into emp value(null, #{ename}, #{age}, #{sex})
	</insert>	
</mapper>

2.emp.getEid()则存放自动生成的key

public class TestParam {
	@Test
	public void testCRUD() throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
		SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
		SqlSession sqlSession = ssf.openSession(true); // 自动处理
		ParamMapper mapper = sqlSession.getMapper(ParamMapper.class);
		Emp emp = new Emp(null, "admin", 23, "男");
		mapper.insertEmp(emp);
		// emp中的eid存放的是自动生成的值
		System.out.println(emp.getEid());
		
	}
}

### MyBatis 主键自动生成配置及使用 #### 配置 `useGeneratedKeys` 实现主键自动生成 当希望在插入记录之后立即获得由数据库生成的主键时,可以在映射文件中的 `<insert>` 标签内设置 `useGeneratedKeys="true"` 和 `keyProperty` 属性。前者告知 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来获取主键;后者指定将返回的主键赋给实体类中哪个字段。 对于 MySQL 数据库而言,在执行完 insert 操作后,MyBatis 可以自动填充新创建的对象实例的 ID 字段[^1]: ```xml <insert id="insertPerson" parameterType="com.example.Person" useGeneratedKeys="true" keyProperty="id"> INSERT INTO person (name, age) VALUES (#{name}, #{age}) </insert> ``` 这段 XML 定义了一个名为 `insertPerson` 的 Insert 映射语句,并指定了它应该接收一个 Person 类型参数。同时启用了 `useGeneratedKeys=true` 来指示 MyBatis 获取数据库产生的主键,并将其存储到传入对象的 `id` 属性里。 #### 利用 Sequence 或者其他方式预先分配主键 如果使用的不是支持自增列特性的数据库(比如 Oracle),则可以采用定义 sequence 序列的方式来自增长主键。此时可以通过添加 `order="BEFORE"` 参数让 MyBatis 在实际执行插入操作前先取得新的主键并填入待插数据之中[^2]。 下面是一个例子展示如何结合 selectKey 元素以及 order 属性实现这一点: ```xml <insert id="insertStudent" parameterType="java.util.Map"> <selectKey resultType="int" keyProperty="student.studId" order="BEFORE"> SELECT seq_student.NEXTVAL FROM DUAL </selectKey> INSERT INTO STUDENT(STUDID, NAME, AGE) VALUES(#{student.studId}, #{student.name}, #{student.age}); </insert> ``` 这里展示了针对 Oracle 数据库的一个场景,其中 `seq_student` 是预设好的序列名称用于生产唯一的 studId 。此代码片段会在真正做插入动作之前就准备好要插入的新纪录所需的唯一标识符。 #### 自定义主键生成器 除了上述两种常见情况外,还可以通过编写自己的 TypeHandler 并注册至 MyBatis 中去处理更复杂的业务逻辑下的主键生成需求。这种方式允许开发者完全掌控主键是如何被计算出来的过程,甚至可以从外部服务调用来决定最终的结果[^3]。 例如,假设有一个基于 UUID 的全局唯一识别码的需求,则可能需要如下所示的方式来构建相应的处理器: ```java public class UuidGenerator implements TypeHandler<String> { @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { if(parameter == null){ ps.setNull(i,jdbcType.TYPE_CODE); }else{ ps.setString(i,UUID.randomUUID().toString()); } } // ... other methods ... } ``` 随后就可以像这样应用这个 type handler : ```xml <resultMap id="baseResultMap" type="com.example.EntityWithUuid"> <!-- fields mapping --> <id column="uuid_column_name" property="uuidField" javaType="String" jdbcType="VARCHAR"/> </resultMap> <insert id="insertEntity" parameterType="com.example.EntityWithUuid"> INSERT INTO entity_table(uuid_column_name,...) VALUES (<foreach item="item" collection="list" separator=",">#{item.uuidField}</foreach>,...) </insert> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值