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

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

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

  这个内容仍是比较好查的,以下:sql

<?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文件里须要相应更改配置,而接口方法的返回值类型也须要更改,以下:mybatis

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);

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

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

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

  后来才知道是姿式不对,应该以下:框架

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

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

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

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

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

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

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

相关文章
相关标签/搜索