mybatis向mysql中插入数据返回自增id 注解+xml方式

本文详细介绍了在MyBatis中如何通过注解和XML配置方式,实现在插入数据后自动获取并设置自增ID到实体对象的过程。无论是使用注解的@SelectKey还是XML的useGeneratedKeys属性,都能确保在插入操作完成后,原对象的ID属性被正确地填充为数据库自动生成的ID。

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

介绍

当我们准备向两张有关联的表中(父、子)插入完整数据时,就需要在第一次插入父表数据后获取自增id,之后在子表中关联此id

返回的自增id会设置为原对象的id,也就是插入之前用户id为null或者0,插入之后该用户的id为自增id

注解方式

说明

@SelectKey(keyProperty = "id"//对应要返回的实体属性
		,keyColumn = "id"//对应数据库中的自增列名称
		,before = false//在更新语句执行之前返回还是之后返回
		,resultType = Integer.class//和id类型相匹配
		,statement = "select last_insert_id()")//查询插入后的自增id

还有一个属性为 statementType,默认值为StatementType.PREPARED
也就是预编译PreparedStatement

使用

UserDao

	@Insert("insert into user values(null,#{username},#{password})")
    @SelectKey(keyProperty = "id",keyColumn = "id",before = false,resultType = Integer.class,statement = "select last_insert_id()")
    int addUserTest(User user);

    @Select("select * from user")
    List<User> getUsers();

测试类

	@Test
    public void testSelectUser(){
        List<User> user = userDao.getUsers();
        System.out.println("lastUser = " + user);//数据库中上一个用户
        User user1=new User();
        user1.setUsername("小明");
        user1.setPassword("123456");
        System.out.println("userBeforeInsert = " + user1);//插入之前的用户
        userDao.addUserTest(user1);
        System.out.println("userAfterInsert = " + user1);//插入之后的用户
    }

为了便于结果比较,数据库在插入之前只有一条数据

在这里插入图片描述

xml方式

说明

useGeneratedKeys 只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回至原对象。

使用

UserDao

	int addUserTest(User user);
	
    @Select("select * from user")
    List<User> getUsers();

UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--引入DTD约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.ahy.dao.UserDao">
    <insert id="addUserTest" useGeneratedKeys="true" keyProperty="id" parameterType="com.ahy.pojo.User">
        insert into user values(null,#{username},#{password})
    </insert>
</mapper>

测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值