最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记。

类似下面这段代码一样获取插入后的主键

User user = new User();
user.setUserName("chenzhou");
user.setPassword("xxxx");
user.setComment("测试插入数据返回主键功能");  System.out.println("插入前主键为:"+user.getUserId());
userDao.insertAndGetId(user);//插入操作
System.out.println("插入后主键为:"+user.getUserId());  

经过查询网上资料,发现大致有两种方式。

方式一:

在实体类的映射文件 "*Mapper.xml" 这样写:

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">insert into user(userName,password,comment)values(#{userName},#{password},#{comment})
</insert>

Tips:

useGeneratedKeys="true" 表示给主键设置自增长
keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。
parameterType="com.chenzhou.mybatis.User" 这个属性指向传递的参数实体类

这里提醒下,<insert></insert> 中没有resultType属性,不要乱加。
实体类中uerId 要有getter() and setter(); 方法

由于我在MySQL数据库中建表时候已经设置了字段自增长,故最终我选择了第二种方式。

第二种方式:

同样在实体类的映射文件 "*Mapper.xml" 但是要这样写:

    <!-- 插入一个商品 --><insert id="insertProduct" parameterType="domain.model.ProductBean" ><selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});</insert>

Tips:

<insert></insert> 中没有resultType属性,但是<selectKey></selectKey> 标签是有的。

order="AFTER" 表示先执行插入语句,之后再执行查询语句。

可被设置为 BEFORE 或 AFTER。

如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。

如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
keyProperty="userId"  表示将自增长后的Id赋值给实体类中的userId字段。
SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.

实体类中uerId 要有getter() and setter(); 方法
实现需求,上面那些就足够了。

这里如果有兴趣的,请继续听我讲一个Mybatis中可能误入的坑。

为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功并且也能读取插入的数据,但是当你打开数据库后就是看不到插入的数据?

如果在实现上述需求时,想插入后返回主键的话,切记不要这样写。
    @Overridepublic Long insertProduct(ProductBean productBean) {// TODO Auto-generated method stubSqlSession session = MybatisJDBCUtil.currentSession();ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class// 必须对应DAO的接口层return productIDao.insertProduct(productBean);}

Why?

因为如果你是像上面这样写,那么执行后返回的也不是你想要的主键Id,而是执行数据库语句后受影响的行数。

而且,当你执行后你会发现提示插入成功,你用代码也可以读取出插入的数据,但是永远只有一条记录。

并且,你打开数据库会发现,数据库中没有插入成功任何数据。

我在这里郁闷了N久,终于发现了关键所在。

有返回值和没返回值的区别在于:

有返回值的只是对数据库只读模式访问数据库,对数据库数据不会有任何修改,比如各种方式的查询。

无返回值的则会以读写模式访问数据库,会对数据库中的数据进行修改,比如删除,增加。

除此之外,根据个人理解应该mybatis在执行插入语句时会先缓存到构造的一个类似session集合中,然后才去调用底层驱动去操作修改数据库。

session.commit(); MybatisJDBCUtil.closeSession();

没有返回值得才有上面这两条语句,也就是说执行了这两条语句才会真正执行插入到数据库,对数据库的数据进行修改。

相反,有返回值的就没有执行这两条语句,所以只是在自己构造的session中执行了添加语句,但是并没有提交到数据库中,故数据库中是没有任何记录的。

这也就解释了为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功,但是当你打开数据库看不到插入的数据。

Mybatis中插入语句方法种不要有返回值,像这样写是正确的。

    @Overridepublic void insertProduct(ProductBean productBean) {// TODO Auto-generated method stubSqlSession session = MybatisJDBCUtil.currentSession();ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class// 必须对应DAO的接口层productIDao.insertProduct(productBean);        session.commit(); MybatisJDBCUtil.closeSession();    }


参考资料一:https://my.oschina.net/crazybird/blog/379635?p=1

参考资料二:http://blog.csdn.net/jbgtwang/article/details/7307687
参考资料三:http://blog.csdn.net/after_you/article/details/53844908

MyBatis 插入数据库返回主键相关推荐

  1. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  2. Mybatis批量插入,返回主键ID不成功,巨坑

    一.场景说明 批量插入,返回主键ID报错 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibati ...

  3. MyBatis—insert语句返回主键和selectKey标签

    本文已同步至个人博客liaosi's blog - MyBatis-insert语句返回主键和selectKey标签 往数据库中插入一条记录后,有时候我们需要这条记录的主键,用于后续的操作.如果在插入 ...

  4. oracle 导入数据时主键丢失,Oracle 插入数据 返回主键

    场景:解决getJdbcTemplate往oracle数据库中插入数据返回主键出错有关问题 解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题 我们使用Spring中的J ...

  5. mybatis+postgresql+insert返回主键,action,service侧

    mybatis+postgresql+insert返回主键,action,service侧 在网上找了很久主要的内容如下: <insert id="insertDynaVisitInf ...

  6. MyBatis——insert并返回主键ID解决方案

    问题描述 添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值. 问题分析 暂无. ...

  7. Mybatis 插入时获取主键的方式

    mybatis 作为一个主流的 ORM 框架,深受广大开发者的喜爱.有人的地方就有江湖,有代码的地方自然有坑,下面来说说获取 mybatis 的插入后返回的主键. 我们可以想一下自动增长的主键特性,在 ...

  8. mysql批量插入没有返回主键id

    在大批量新增数据的时候往往会采用批量插入来提高效率,但是经常遇到没有返回主键的情况. 一般会有以下几种可能: 1.升级Mybatis版本到3.3.1.官方在这个版本中加入了批量新增返回主键id的功能 ...

  9. 160613、MyBatis insert操作返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能,针对Sequence主键而言,在执行 ...

最新文章

  1. 模板页显示Excel数据Gridview增删改查
  2. 多线程之Java内存模型(JMM)(一)
  3. 每输入四个字符添加一个中划线
  4. 计算机专业的学生该选择日后的人生道路?继续从事IT还是考公务员……
  5. 【转载】为了我们的SZ4J代码
  6. 有什么手机python编辑器_好用的Python编辑器有哪些?
  7. ubuntu12.04 qtcreate支持中文输入
  8. 创建数据账号只有个别表的权限_创建MySQL用户 赋予某指定库表的权限
  9. Atitit 收入理论大总结 4位一体 4象限理论 财政收入理论 6位一体
  10. 计算机组成原理课后答案(唐朔飞第三版) 第四章
  11. 路由器安装教程和使用方法
  12. 两个一一对应的txt文本去重
  13. 配置计算机系统doc,计算机的基本配置.doc
  14. 普渡大学计算机科学师生比,公立常春藤高校普渡大学,附申请要求+录取难度!...
  15. html5在线俄罗斯方块,html5网页版俄罗斯方块小游戏代码
  16. (八)RHEL系统之红帽8操作系统基础环境配置及软件安装
  17. iOS真机测试详细步骤及图解
  18. 【读书笔记】商业自传-阿里巴巴/淘宝/阿里云/支付宝,亚洲电子商务教父:马云传_2019.10.25
  19. 提升算法数据结构的几个网站
  20. 透明表——ABAP程序创建透明表

热门文章

  1. C语言 · 计算时间
  2. C#学习基本概念之关键字---delegate(委托)
  3. 微信聊天和朋友圈可以拍摄和分享大视频?
  4. 从反编译的角度去观察C#6.0
  5. Linux多线程实践(3) --线程属性
  6. java表达式类型自动提升
  7. mybatis配置mysql数据源_springboot+mybatis+Druid配置多数据源(mysql+postgre)
  8. Kali Linux发布2020.1a版本
  9. Playmaker全面实践教程之playMaker编辑器
  10. mysql去除输入的字符串中的中文_Sql得到(去除)字符串中所有汉字,字母,数字的函数...