MyBatis中如何获取自动生成的(主)键值

Mybatis中insert 方法总是返回一个int值 ,这个值代表的是插入所影响的行数。 如果id采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。那么我们可以在service中通过传入的对象来获得插入的id值。

mapper.xml文件

 <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.woniuxy.springbootmybatis.entity.User" useGeneratedKeys="true">
        insert into user
        ( id,user_name,tel
        ,password,age,create_date
        ,head_img,dept_id)
        values (#{id,jdbcType=INTEGER},#{userName,jdbcType=VARCHAR},#{tel,jdbcType=VARCHAR}
        ,#{password,jdbcType=VARCHAR},#{age,jdbcType=INTEGER},#{createDate,jdbcType=TIMESTAMP}
        ,#{headImg,jdbcType=VARCHAR},#{deptId,jdbcType=INTEGER})
    </insert>

service代码

 @Override
    public int insertSelective(User record) {
        int result = userMapper.insertSelective(record);
        log.info("当前行数据的ID为{}",record.getId());
        return result;
    }

日志文件为:

2023-04-06 15:45:09.813  INFO 15952 --- [nio-8080-exec-1] c.w.s.service.impl.UserServiceImpl       : 当前行数据的ID为107

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在MyBatis,可以通过两种方式获取自动生成键值: 1. 在Mapper.xml文件使用<selectKey>标签,该标签可以在执行插入语句之前或之后执行一个查询语句,获取自动生成键值。例如: ``` <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert> ``` 在这个例子,<selectKey>标签在插入语句之后执行一个查询语句,获取自动生成键值,并将其设置到User对象的id属性。 2. 在Mapper接口使用@Options注解,该注解可以在执行插入语句之后获取自动生成键值。例如: ``` @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user); ``` 在这个例子,@Options注解的useGeneratedKeys属性设置为true,表示要获取自动生成键值;keyProperty属性指定了键值要设置到User对象的哪个属性。 ### 回答2: MyBatis是一个开源的持久层框架,它提供了一种灵活的映射器方式来将数据库表映射成为Java对象。MyBatis支持自动生成键值,可以通过以下两种方式来获取自动生成键值: 1. 在Mapper.xml使用selectKey元素 selectKey元素是用来自动生成键值的,可以在Mapper.xml文件通过以下方式定义: ``` <insert id="insertUser" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user (username,password) VALUES (#{username},#{password}) </insert> ``` 其,keyProperty属性指定了从数据库获取到的键值要映射到Java对象的哪个属性上,resultType属性指定了键值的数据类型,order属性指定了selectKey元素执行顺序。在执行insert语句之前,会先执行selectKey语句获取自动生成键值,并将值设置到User对象的id属性。 2. 在Java代码使用@Options注解 @Options注解是MyBatis提供的另一种获取自动生成键值的方式,可以在Mapper接口的方法上使用@Options注解来启用自动生成键值的功能,示例如下: ``` @Insert("INSERT INTO user (username,password) VALUES (#{username},#{password})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user); ``` 其,useGeneratedKeys属性指定了是否启用自动生成键值的功能,keyProperty属性指定了从数据库获取到的键值要映射到Java对象的哪个属性上。在执行insertUser方法后,将会自动获取自动生成键值,并将值设置到User对象的id属性。 总之,MyBatis提供了多种获取自动生成键值的方式,可以根据具体的需求和实现方式选择相应的方法。 ### 回答3: MyBatis 是一种流行的 Java ORM 框架,它可以通过与数据库表的映射来实现数据的持久化。在使用 MyBatis 时,我们可以将传统的 SQL 语句与 Java 代码分离,通过 XML 配置文件或者注解来配置 SQL 和执行的逻辑。对于需要操作的记录,我们一般会指定一个唯一的键,用来标识该记录的唯一性。MyBatis 可以自动为我们生成键,但需要我们手动获取这个键值MyBatis 提供了两种获取自动生成键值的方式:在 SQL 语句获取并返回键值或者通过返回生成键值的方法获取。其,第一种方式要求数据库支持返回生成的键值,例如 MySQL 的 LAST_INSERT_ID() 函数。而第二种方式要求在映射文件配置键返回方式,并在对应的 INSERT 语句添加 keyProperty 属性来告诉 MyBatis 生成的键应该放在哪个对象的哪个属性。 下面是在映射文件配置获取自动生成键值的步骤: 1. 配置键生成方式:在映射文件的insert标签添加如下配置: ``` <insert id="insertUser" keyProperty="id" useGeneratedKeys="true"> INSERT INTO user(name, age) VALUES(#{name}, #{age}) </insert> ``` 在这个配置,keyProperty 属性用来指定键应该存放在哪个 Java 对象的哪个属性,useGeneratedKeys 属性用来告诉 MyBatis 是否使用自动生成键。 2. 获取键:在执行插入操作时,需要创建一个 Java 对象来保存插入的数据,然后调用 sqlSession 的 insert 方法来执行插入操作。执行完插入操作后,可以通过 getGeneratedKeys 方法来获取自动生成键值。 ``` User user = new User(); user.setName("test"); user.setAge(18); sqlSession.insert("insertUser", user); // 获取自动生成键值 Long id = user.getId(); ``` 在这个代码片段,我们通过 insertUser 的入参 user 来将要插入的数据传递给 MyBatis,在插入完成后,通过 user.getId() 方法来获取自动生成键值。 总结起来,获取自动生成键值有两种方式:在 SQL 语句获取并返回键值或者通过返回生成键值的方法获取。在 MyBatis ,我们可以通过配置键生成方式,来使得 MyBatis 能够自动为我们生成键,并通过 getGeneratedKeys 方法获取自动生成键值
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值