关于mybatis用mysql时,插入返回自增主键的问题

  公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了。

其中涉及到插入实体要求返回主键id的问题,以前用ssh配合oracle很容易实现,因为有sequence,而且mysql也基本没用过,所以只好去百度了。

  这个内容还是比较好查的,如下:

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

<mapper namespace="com.dao.UserDao">
  <insert id="insertUser" parameterType="com.entity.User"> insert into sys_User(username,classes) values(#{username},#{classes}) </insert>
</mapper> 

  本来我们一般配置一个不需要返回主键的,并且id是自增的,只需要上述配置即可,values中的大括号内的字段和parameterType指向的实体类的字段大小写记得对应起来,然后namespace的路径与接口方法路径对应起来,然后调用这个sql的接口方法就只需如下:

public interface UserDao{
    
    /**
     * 新增学生
     * @param User 
     */
    public void insertUser(User user);

}

  如果需要返回插入时自增主键的值的话,上述方法就需要稍微更改下了,其中存放数据库语句的xml文件里需要相应更改配置,而接口方法的返回值类型也需要更改,如下:

xml方法:记得加上useGeneratedKeys和keyProperty配置即可,前者是指设置是否使用jdbc的getGenereatedKeys方法获取主键并赋值到keyProperty设置的属性中,后者即实体类主键字段
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userid" parameterType="com.entity.User">
    insert into sys_User(username,classes)
    values(#{username},#{classes})
</insert>

接口方法返回值改为int即可,因为mysql也只有int类型值支持自增,但是没试过返回值为string是不是能够成功返回,我猜想应该是可以的
  /**
     * 新增学生
     * @param User 
     */
    public int insertUser(User user);

  到这一步为止其实都没有什么问题,很容易就能百度到,具体是在调用时候,我不小心进了一个坑,我程序代码片段类似于这样的:

User user=new User();
user.setUsername("acfun");
user.setClasses("注孤生一班");
int id=userDao.insertUser(user);
system.out.println(id)

  结果我发现不管怎么样返回来的都是1,即便数据库中主键已经自增到10了。。。

  后来才知道是姿势不对,应该如下:

User user=new User();
user.setUsername("acfun");
user.setClasses("注孤生一班");
userDao.insertUser(user);
system.out.println(user.getUserid);

  这样才是返回的自增的id。

  只怪自己没理解意思,其实人家插入以后取回来的主键直接给赋值到你当做参数的实体的id里面去了,至于方法返回值返回的应该是受影响行数,那个useGeneratedKeys说的很清楚了,使用jdbc的getGenereatedKeys方法获取主键并赋值到keyProperty设置的属性中,但是由于比较紧急就草草的根据百度看人家怎么配置就怎么配置,想当然的去用了。

  话说这么初级的一个问题我也水了这么多字也真不好意思,因为知道自己水平有限,就写的详细一点,也没关乎什么原理性的东西,因为有些东西在熟悉的人看来实在简单不过,根本无需一提,但是实际上看你的博文的可能会是一个初入java的小白,就像我在找minasocket方面的使用方法时候就感觉深受其害,泪流满面,找到的基本都是说的各种原理源码啥的,我想看到的结果博主一句:此类代码实在简单,无需赘述。。。看的我当时就。。。也不怪人家,确实不同的位置不同的看法。

  现在项目太紧,都没时间去好好系统的学一下,基本都是需要用到什么赶紧去查使用方法,也不去管原理什么的,今天难得稍微闲下来一点发个毫无深度的博文,希望有些和我一样的小白别掉同样的坑里。

  已经连续一个多月加班到晚上9点半并且周末无休的初级程序猿留。。。

 可能代码会有些许错误,因为是直接从公司项目代码拷过来,然后改成User这种的,可能有些路径方面没改正确。以后等项目稍微告一段落,闲下来了,再去自己搭个ssm的框架,去稍微具体点的学习学习。

转载于:https://www.cnblogs.com/lilh/p/5521271.html

### 回答1: MyBatis 通过 JDBC API 来操作数据库,而 JDBC API 本身就提供了获取自增主键的方法。因此,MyBatis 返回自增主键的底层实现方式就是通过 JDBC API 获取自增主键。 具体来说,MyBatis 在执行插入操作,会将生成的 SQL 语句传递给 JDBC 驱动程序。JDBC 驱动程序会执行该 SQL 语句,并返回一个 ResultSet 对象。MyBatis 会通过 ResultSet 对象获取生成的自增主键值,并将其设置到对应的实体类或者参数对象中。 下面是一个示例代码,演示了如何在 MyBatis返回自增主键: ```java public interface UserMapper { // 使用 @Options 注解获取自增主键 @Insert("INSERT INTO user (name, age) VALUES (#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int addUser(User user); } ``` 在上面的示例代码中,`@Options` 注解配置了 `useGeneratedKeys` 属性为 `true`,表示使用自动生成的主键。`keyProperty` 属性指定了将自动生成的主键设置到哪个属性中,这里是 `id`。当执行 `addUser` 方法MyBatis 会自动获取自增主键并设置到 `User` 对象的 `id` 属性中。 ### 回答2: MyBatis返回自增主键的底层实现是通过数据库的底层支持来实现的。具体来说,MyBatis会在执行插入操作后获取数据库返回自增主键值,并将其赋值给相应的实体对象或者映射文件中的主键属性。 如果使用MySQL数据库MyBatis会在插入数据后执行`SELECT LAST_INSERT_ID()`语句,从数据库中获取最近插入自增主键值。然后,MyBatis返回自增主键值赋值给实体对象或者映射文件中的对应主键属性。 如果使用Oracle数据库MyBatis会在执行插入操作后,通过调用`Statement.getGeneratedKeys()`方法来获取生成的自增主键值。然后,MyBatis返回自增主键值赋值给实体对象或者映射文件中的对应主键属性。 总之,MyBatis通过底层数据库的支持,使用相应的语句或方法来获取插入操作后的自增主键值,并将其赋值给实体对象或者映射文件中的对应属性,以便后续的操作使用。 ### 回答3: MyBatis返回自增主键的底层实现是通过数据库自增主键功能来实现的。 在MyBatis中,可以使用数据库相关的插入语句来插入数据,并且使用<selectKey>元素来获取数据库生成的自增主键的值。这个元素可以放在insert语句的内部,用于将生成的主键返回给应用程序。 具体实现步骤如下: 1. 在insert语句中,设置<selectKey>元素,使用keyProperty属性指定将自增主键的值存储在哪个属性中。 2. 设置useGeneratedKeys属性为true,表示要使用数据库自动生成的主键值。 3. 设置keyColumn属性,指定数据库自动生成的主键所在的列。 4. 设置order属性,可以指定是在insert语句之前获取自增主键值,还是在insert之后获取。 当执行insert语句MyBatis会执行相应的数据库操作,获取自动生成的主键值,并将其存储在指定的属性中。随后,可以通过访问该属性来获取自增主键的值。 需要注意的是,不同的数据库有不同的自增主键实现方式。例如,MySQL使用AUTO_INCREMENT来生成自增主键,而Oracle使用序列(Sequence)来实现。MyBatis可以根据不同的数据库类型来自动选择适合的实现方式。 总之,MyBatis返回自增主键的底层实现是通过使用数据库自增主键功能实现的,并且在插入语句中使用<selectKey>元素来获取生成的自增主键的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值