mybatis中 insert后返回 主键值

本文介绍了使用MyBatis框架进行数据库操作时,如何通过两种不同的XML映射文件配置实现插入数据后返回自动生成的主键。第一种方式利用useGeneratedKeys属性配合keyProperty设置;第二种方式采用selectKey标签与LAST_INSERT_ID()函数结合。

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

转载自:https://www.cnblogs.com/xingyunblog/p/6243179.html

类似下面这段代码一样获取插入后的主键

User user = new User();
user.setUserName(“chenzhou”);
user.setPassword(“xxxx”);
user.setComment(“测试插入数据返回主键功能”);

System.out.println(“插入前主键为:”+user.getUserId());
userDao.insertAndGetId(user);//插入操作
System.out.println(“插入后主键为:”+user.getUserId());
经过查询网上资料,发现大致有两种方式。

方式一:

在实体类的映射文件 “*Mapper.xml” 这样写:

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
    insert into user(userName,password,comment)
    values(#{userName},#{password},#{comment})
</insert>

Tips:

useGeneratedKeys=”true” 表示给主键设置自增长
keyProperty=”userId” 表示将自增长后的Id赋值给实体类中的userId字段。
parameterType=”com.chenzhou.mybatis.User” 这个属性指向传递的参数实体类
这里提醒下, 中没有resultType属性,不要乱加。
实体类中uerId 要有getter() and setter(); 方法

由于我在MySQL数据库中建表时候已经设置了字段自增长,故最终我选择了第二种方式。

第二种方式:

同样在实体类的映射文件 “*Mapper.xml” 但是要这样写:

复制代码

    <!-- 插入一个商品 -->
    <insert id="insertProduct" parameterType="domain.model.ProductBean" >
       <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
          SELECT LAST_INSERT_ID()
      </selectKey>
        INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
    </insert>

复制代码
Tips:

中没有resultType属性,但是 标签是有的。

order=”AFTER” 表示先执行插入语句,之后再执行查询语句。

可被设置为 BEFORE 或 AFTER。

如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
keyProperty=”userId” 表示将自增长后的Id赋值给实体类中的userId字段。

SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.

实体类中uerId 要有getter() and setter(); 方法

### MyBatis Insert 返回主键 ID 示例 对于希望在执行插入操作后获取生成的主键ID的情况,MyBatis 提供了简洁而有效的解决方案。当使用MySQL作为数据库时,在Mapper XML文件中定义`<insert>`语句时应指定两个重要属性:`useGeneratedKeys="true"`以及`keyProperty`指向实体类中的相应字段名称[^2]。 下面是一个具体的实例展示如何配置: ```xml <!-- RoleMapper.xml --> <mapper namespace="com.example.mapper.RoleMapper"> <!-- 插入角色信息并返回新创建的角色ID --> <insert id="addRole" parameterType="com.example.model.Role" useGeneratedKeys="true" keyProperty="roleId"> INSERT INTO roles (role_name, description) VALUES (#{name}, #{description}) </insert> </mapper> ``` 这段代码片段展示了向名为`roles`的数据表内添加一条记录的同时利用`useGeneratedKeys=true`指示MyBatis启用JDBC驱动程序提供的自动生成键功能;并通过设定`keyProperty="roleId"`告知框架将产生的主键赋给传入对象里的`roleId`成员变量。 为了验证此过程是否成功完成,可以在Java服务层编写如下测试案例: ```java // RoleService.java public class RoleService { @Autowired private RoleMapper roleMapper; public void addNewRole(Role newRole){ // 调用 Mapper 方法之前 roleId 应该为空或默认 System.out.println("Before insertion, the generated ID is: " + newRole.getRoleId()); try{ roleMapper.addRole(newRole); // 成功插入后的newRole 对象应当已经包含了由数据库分配的新主键 System.out.println("After successful insertion, the generated ID is now: " + newRole.getRoleId()); } catch(Exception e){ // 处理异常... } } } ``` 上述示例说明了通过适当配置MyBatis映射文件,并配合合理的编程实践,能够轻松实现在插入操作结束后立即访问所生成的主键的功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值