使用mybatis进行数据插入时如何返回自增的id

具体问题

当我们存储数据时,有时候id是选择让数据库自增的 。但前端如果需要当前添加数据的id时,我们在代码上就无法返回了。

解决办法

在 MyBatis 中,可以通过配置来确保数据库操作成功。具体方式是在 Mapper.xml 文件中使用 useGeneratedKeys 和 keyProperty 属性来获取自增主键的值,以判断插入操作是否成功。

下面是实现方法:

1、在 Mapper.xml 中的插入操作中,添加 useGeneratedKeys 和 keyProperty 属性。

<insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(username, password) VALUES(#{username}, #{password})
</insert>

2、在 Java 代码中,调用 UserMapper 接口的插入方法时,需要判断插入是否成功。插入成功后,User 对象的 id 属性将被自动赋值为插入记录的主键值。

	User user = new User();
	user.setUsername("username");
	user.setPassword("password");
	int result = userMapper.insertUser(user);
	if (result > 0) {
	    System.out.println("插入成功,主键为:" + user.getId());
	} else {
	    System.out.println("插入失败");
	}

在插入操作成功后,user.getId() 返回的就是插入记录的主键值,否则返回的是 null 或 0。因此,通过判断 user.getId() 的值是否为 null 或 0 可以判断插入操作是否成功。

其中useGeneratedKeys 和 keyProperty 是 MyBatis 中用于处理自增主键的两个重要属性。

  • useGeneratedKeys 属性表示是否使用自动生成的主键。如果该属性为 true,则表示使用数据库自动生成的主键;如果该属性为 false,则表示不使用自动生成的主键。默认值为 false。
  • keyProperty 属性表示实体类的属性名,用于接收自动生成的主键值。在执行插入操作时,如果使用了自动生成的主键,那么数据库会为新插入的记录自动生成一个主键值,这个值会被保存到 keyProperty 属性指定的实体类属性中。

注意点

需要注意的是,不同的数据库可能需要不同的配置和语法,需要根据实际情况进行调整。

  • Oracle数据库(跟mysql一样)
  • SQL Server
    在 SQL Server 数据库中,使用属性进行自动生成主键的配置方法稍有不同。需要在 insert 标签中添加 useGeneratedKeys 属性,将其设置为 false,同时在 selectKey 标签中指定自动生成主键的方式和接收主键值的实体类属性,如下所示:
<insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="false">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
        SELECT @@IDENTITY AS id
    </selectKey>
    INSERT INTO user(username, password) VALUES(#{username}, #{password})
</insert>

在上面的配置中,useGeneratedKeys 属性被设置为 false,表示不使用自动生成主键的方式。而是在 selectKey 标签中使用 @@IDENTITY 函数获取自动生成的主键值,并将其设置到实体类的 id 属性中。需要注意的是,在 SQL Server 中,@@IDENTITY 函数用于获取最近插入的标识列的值,因此只能在插入后使用。

MyBatis Plus 中,插入数据返回自增 ID 可以通过以下步骤实现: 1. 创建一个实体类,用于映射数据库表的字段和属性。 2. 在实体类中,标注 `@TableName` 注解,指定对应的数据库表名。 3. 在实体类中,使用 `@TableId` 注解标注主键字段,并设置 `@TableId(type = IdType.AUTO)`,表示使用数据库自增主键。 4. 调用 MyBatis Plus 提供的 `insert` 方法插入数据插入成功后,自增 ID 将会被赋值到实体类对应的字段上。 以下是一个示例代码: ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; @Repository public interface UserMapper extends BaseMapper<User> { } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public boolean saveUser(User user) { return save(user); } } @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; // 省略 getter 和 setter } ``` 在上述示例中,`User` 类是一个实体类,对应数据库中的 `user` 表。`id` 字段使用 `@TableId(type = IdType.AUTO)` 注解标注为自增主键。 在 `UserServiceImpl` 类中,调用 `save` 方法插入数据插入成功后,自增 ID 将会被赋值到 `user` 对象的 `id` 字段上。 你可以根据你的需求在 `UserServiceImpl` 类中添加其他方法,如查询、更新等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值