mybatis 返回主键的几个方法

在 MyBatis 中,处理插入操作时获取主键的返回值是一个常见的需求。MyBatis 提供了几种方法来获取插入操作后生成的主键(如自动递增的主键)。

1. 通过 useGeneratedKeys 获取主键

最常用的方式是使用 useGeneratedKeys 属性,它能够自动获取数据库插入操作生成的主键并将其返回。

步骤:
  1. 在 Mapper XML 中配置 useGeneratedKeys

    • <insert> 标签中,设置 useGeneratedKeys="true",并指定 keyProperty 属性,表示将生成的主键映射到哪个对象的属性上。
  2. 在实体类中定义一个主键字段,用来接收生成的主键值。

示例:

假设我们有一个 User 实体类和对应的 UserMapper

1. 实体类(User.java)
public class User { 
    private int id; 
    // 主键字段 private String name; 
    private int age; 
    // getters and setters 
    public int getId() { 
        return id; 
    } 
    public void setId(int id) { 
        this.id = id; 
    } 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
}
2. Mapper 接口(UserMapper.java)
public interface UserMapper { 
    // 插入用户,并返回生成的主键 
    int insertUser(User user); 
}
3. Mapper XML 配置(UserMapper.xml)

在 MyBatis 的 XML 映射文件中,配置 useGeneratedKeyskeyProperty 属性:

<mapper namespace="com.example.mapper.UserMapper"> 
        <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> 
            INSERT INTO users (name, age) VALUES (#{name}, #{age}) 
        </insert> 
</mapper>
  • useGeneratedKeys="true":表示 MyBatis 将自动获取插入操作生成的主键。
  • keyProperty="id":表示将生成的主键值返回并映射到 User 对象的 id 属性。
4. 调用插入操作并获取主键

在 Service 或 DAO 层调用 insertUser 方法:

public class UserService { 
    @Autowired 
    private UserMapper userMapper; 
    public void addUser(User user) { 
        userMapper.insertUser(user); 
        // 插入后,user.getId() 将包含自动生成的主键值 
        System.out.println("插入的用户 ID:" + user.getId()); 
    } 
}
总结:
  • 使用 useGeneratedKeys="true" 来启用主键返回。
  • 通过 keyProperty 来指定返回的主键映射到哪个实体类的属性。

2. 使用 @Options 注解获取主键

如果你使用的是注解方式定义 SQL 语句,可以通过 @Options 注解来指定主键返回。

示例:
public interface UserMapper { 
    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")         
    @Options(useGeneratedKeys = true, keyProperty = "id") 
    int insertUser(User user); 
}
  • @Options(useGeneratedKeys = true, keyProperty = "id"):表示插入操作生成的主键会自动回写到 User 对象的 id 属性。

3. 通过 SELECT LAST_INSERT_ID() 获取主键

如果你的数据库没有启用自动生成主键,或者你希望手动获取主键,你可以执行一个查询语句来获取最后插入的主键。这个方法通常与其他方法一起使用,但它不如 useGeneratedKeys 方法直接和高效。

示例:

在 MySQL 中,插入数据后可以通过 SELECT LAST_INSERT_ID() 获取最后插入的主键:

<mapper namespace="com.example.mapper.UserMapper"> 
    <insert id="insertUser"> INSERT INTO users (name, age) VALUES (#{name}, #{age});             
    </insert> 
    <select id="getLastInsertId" resultType="int"> SELECT LAST_INSERT_ID(); 
    </select> 
</mapper>

然后在代码中使用 getLastInsertId() 获取主键:

public interface UserMapper { 
    void insertUser(User user); 
    int getLastInsertId(); 
}

使用时,在插入数据后调用 getLastInsertId() 来获取主键:

public class UserService { 
    @Autowired 
    private UserMapper userMapper; 
    public void addUser(User user) { 
        userMapper.insertUser(user); 
        int id = userMapper.getLastInsertId(); 
        System.out.println("插入的用户 ID:" + id); 
} 
}

4. 通过返回值获取主键

某些情况下,如果你希望直接通过返回的 intlong 来获取主键(例如插入一条记录后,直接返回生成的主键),可以在 insert 方法中直接返回主键值。

示例:
<mapper namespace="com.example.mapper.UserMapper"> 
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
        INSERT INTO users (name, age) VALUES (#{name}, #{age}); 
    </insert> 
</mapper>
public interface UserMapper { 
    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")             
    @Options(useGeneratedKeys = true, keyProperty = "id") 
    int insertUser(User user); 
}

这里 insertUser 会返回生成的主键值(int 类型)。

总结

  • useGeneratedKeys 是最常用的方法,MyBatis 会自动处理主键生成并返回。
  • 使用 @Options 注解来配置返回主键(适用于注解方式)。
  • 通过 SELECT LAST_INSERT_ID() 或其他手动方式,可以在一些特定场景下获取主键。
### MyBatis主键生成策略及配置方法 #### JDBC 方式返回主键自增的值 当使用 MySQL 或其他支持自动增长列的数据库时,可以利用 `useGeneratedKeys` 属性让 MyBatis由数据库生成的主键。这通常用于表中有 AUTO_INCREMENT 的字段情况。 ```xml <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> ``` 此段代码展示了如何通过设置 `useGeneratedKeys=true` 和指定 `keyProperty` 来告知 MyBatis 将插入操作后的自动生成 ID 赋予 Java 对象相应的属性[^1]。 #### 自定义 SQL 语句获主键 对于那些不支持直接返回新插入行所使用的标识符的数据源来说,则可能需要执行额外查询来获得该信息: ```sql SELECT LAST_INSERT_ID(); -- or for Oracle databases: SELECT user_seq.CURRVAL FROM dual; ``` 这些查询可以在 `<selectKey>` 标签内实现,在实际 insert 前运行以预先分配唯一键值给待存入的对象实例成员变量。 #### 使用 UUID 作为主键 有时为了分布式系统的考虑或是出于性能上的优化目的,会选择采用全局唯一的字符串形式作为实体对象的身份识别码。此时可通过如下方式设定: ```java @SelectKey(statement="SELECT REPLACE(UUID(),'-','')", resultType=String.class, before=true, keyProperty="uuid") public void setUuid(String uuid){ this.uuid = uuid; } ``` 上述例子中,`statement` 参数指定了要调用的方法或函数名用来创建新的 GUID/UUID 并去掉其中连字符以便存储到 VARCHAR 类型字段里去;而 `before=true` 表明希望在真正写入之前就先确定好这个特殊编号[^4]。 #### 雪花算法(Snowflake Algorithm) 这是一种高效的分布式ID生成方案,尤其适合高并发场景下的应用开发需求。它能够保证生成出来的 long 类型数值既有序又不会重复发生冲突现象。MyBatis Plus 提供了对此机制的支持,默认情况下会启用这种模式除非另有更高优先级配置存在覆盖掉默认行为[^3]。 ```yaml mybatis-plus.global-config.db-config.id-type=snowflake ``` 以上就是在 MyBatis 及其扩展框架下几种常见的主键处理手段及其具体实践办法概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值