Mybatis 获取自增主键值(Mysql,Oracle)

在某些场景下,我们需要使用mybatis返回生成的主键值。Mybatis在insert和update标签中就提供了这种功能。

<insert id=”indetifyId”  useGeneratedKeys=”true” keyProperty=”id” keyColumn="id">

</insert>

useGeneratedKeys: 是否自动生成主键,默认false
keyProperty :返回的主键值赋给哪个属性
keyColumn: 数据库中的自增主键的列名,默认是数据库表的第一列。当主键列不是表中的第一列的时候需要设置,PostgreSQL必须设置。
主键自动生成,取决于数据库是否支持自增主键。实际上当设置了useGeneratedKeys=“true”,Mybatis会调用JDBC的getGeneratedKeys方法,并将获取的主键值赋值给keyProperty 指定的属性。

准备
Mysql数据库

create table user(
USER_ID bigint  not null auto_increment,
USER_NAME varchar(50) not null,
USER_PASSWORD varchar(30) not null,
CREATE_TIME datetime,
....
primary key(USER_ID)
)



实体

package com.test.User

public class User{
private Long userId;
private String userName;
private String userPassword;
...
setter getter....
}


Mapper

public interface UserMapper{
    int insertUser(User user); //新增用户
}



Service

@Service
public UserServiceImple implements UserService{
    @Autowired
    UserMapper userMapper;
    
    public Long inserUser(User user){
        //user数据操作,例如加密
        int inserts=userMapper.insertUser(user);
        if(inserts == 0)//插入失败
            return -1L;
        return user.getUserId();//返回主键值
    }
}



获取主键值
mysql
对于支持主键自增的数据库(MySql)

<insert id=”insertUser”  useGeneratedKeys=”true” keyProperty=”userId” >
insert into user( 
user_name, user_password, create_time) 
values(#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
</insert>



parameterType 可以不写,Mybatis可以推断出传入的数据类型。
如果想要访问主键,那么应当parameterType 应当是javabean或者Map。这样数据在插入之后 可以通过javavbean或者Map 来获取主键值。上例中就是通过 getUserId获取主键

    user.getUserId()
    map.get("userId")



Oracle
对于像Oracle这样的没有提供主键自增的功能的数据库而言,通常使用序列的方式获取自增主键。可以使用<selectKey>标签来获取主键的值,这种方式不仅适用于不提供主键自增功能的数据库,也适用于提供主键自增功能的数据库。
selectKey 一般的用法

    <selectKey keyColumn="id" resultType="long" keyProperty="userId" order="BEFORE">
            
    </selectKey> 



属性    描述
keyProperty    selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn    匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType    结果的类型,MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order    值可为BEFORE 或 AFTER。如果是 BEFORE,那么它会先执行selectKey设置 keyProperty 然后执行插入语句。如果为AFTER则相反。
statementType    使用何种语句类型,默认PREPARED。 有STATEMENT,PREPARED 和 CALLABLE 语句的映射类型。
创建 Oracle 序列:

-- 创建序列, 计数开始值: 1 ; 步长:1 ; 没有最大值, 当超过最大值时 开始从头开始计数
create sequence USER_ID INCREMENT by 1 START WITH 1 NOMAXVALUE CYCLE;
-- 获取当前序列号加 +1
select USER_ID.nextval from dual;
-- 获取当前序列号
select USER_ID.currval from dual;



获取主键(序列号),并插入

<insert id=”insertUser” >
        <selectKey keyColumn="id" resultType="long" keyProperty="userId" order="BEFORE">
            SELECT  USER_ID.nextval as id from dual 
        </selectKey> 
        insert into user( 
        user_id,user_name, user_password, create_time) 
        values(#{userId},#{userName}, #{userPassword} , #{createTime, jdbcType= TIMESTAMP})
</insert>



此时会将Oracle生成的主键值赋予 userId(keyProperty对应变量)。这个userId 就是USER对象的属性,这样就可以将生成的主键值返回了。如果仅仅是在insert语句中使用但是不返回,此时keyProperty=“任意自定义变量名”。

Long id = user.getUserId();

注意:

Oracle 数据库中的值要设置为 BEFORE ,这是因为 Oracle中需要先从序列获取值,然后将值作为主键插入到数据库中。
虽然说Mybatis 官方文档说 可以推断出 resultType类型,但是实际操作过程中。 使用实体类的属性字段去接受selectKey的查询结果, 没有指明resultType 的话抛出了类似如下的异常:A query was run and no Result Maps were found for the Mapped Statement 'insertXXXX!selectKey
扩展:
如果Mysql 使用selectKey的方式获取主键,需要注意下面两点:

order : AFTER
获取递增主键值 :SELECT LAST_INSERT_ID()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 中,执行插入操作时获取自增键值可以通过以下几种方式: 1. 在插入 SQL 语句中使用 `useGeneratedKeys` 和 `keyProperty` 属性:在插入语句中添加 `useGeneratedKeys="true"`,然后指定 `keyProperty` 属性来映射键的值到对应的实体类属性。示例: ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert> ``` 这样,在插入完成后,会将自动生成的键值赋给 `keyProperty` 指定的属性。 2. 使用 `selectKey` 元素:在插入语句之前使用 `selectKey` 元素,通过调用数据库的函数或序列来获取自增键值,并将其赋给对应的实体类属性。示例: ```xml <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="Long" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user (username, password) VALUES (#{username}, #{password}) </insert> ``` 这样,在插入完成后,会执行 `SELECT LAST_INSERT_ID()` 来获取自增键值,并将其赋给 `keyProperty` 指定的属性。 3. 使用数据库特定的函数或语句:根据数据库的不同,可以使用相应的函数或语句来获取自增键值。例如,在 MySQL 中可以使用 `LAST_INSERT_ID()` 函数,而在 Oracle 中可以使用 `RETURNING` 语句。具体的方法可以参考对应数据库的文档或官方示例。 以上是在 MyBatis获取自增键值的常用方法,根据实际情况选择适合的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值