这使用的mysql数据库,下面这种方式(没有给mysql设置自动增长)是插入主键方式:

  1. <insert id="insertBook" parameterType="com.test.entity.Book">
  2. <selectKey keyProperty="id" resultType="int" order="BEFORE">
  3. select max(id)+1 from book
  4. </selectKey>
  5. INSERT INTO book (id,bookname,author,price)
  6. VALUES (#{id},#{bookname, jdbcType=VARCHAR},#{author, jdbcType=VARCHAR},#{price, jdbcType=FLOAT})
  7. </insert>
  1.  
  2. 下面是参考:http://www.cnblogs.com/xingyunblog/p/6243179.html
  3.  
  4. 下面是插入后返回主键:
  1. //这是平常的一种方式
    System.out.println("插入前主键为:"+user.getUserId());
  2. userDao.insertAndGetId(user);//插入操作
  3. System.out.println("插入后主键为:"+user.getUserId());

方式一:

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

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

Tips:

  1. useGeneratedKeys="true" 表示给主键设置自增长
  1. keyProperty="userId" 表示将自增长后的Id赋值给实体类中的userId字段。
  1. parameterType="com.chenzhou.mybatis.User" 这个属性指向传递的参数实体类
  2.  
  3. 这里提醒下,<insert></insert> 中没有resultType属性,不要乱加。
  1. 实体类中uerId 要有getter() and setter(); 方法

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

第二种方式:

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

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

Tips:

  1. <insert></insert> 中没有resultType属性,但是<selectKey></selectKey> 标签是有的。
  2.  
  3. order="AFTER" 表示先执行插入语句,之后再执行查询语句。
  4.  
  5. 可被设置为 BEFORE 或 AFTER。
  6.  
  7. 如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。
  8.  
  9. 如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用
  1. keyProperty="userId" 表示将自增长后的Id赋值给实体类中的userId字段。
  1. SELECT LAST_INSERT_ID() 表示MySQL语法中查询出刚刚插入的记录自增长Id.
  2.  
  3. 实体类中uerId 要有getter() and setter(); 方法
  1. 为什么Mybatis 中修改添加方法为有返回值后,虽然提示插入数据库成功并且也能读取插入的数据,但是当你打开数据库后就是看不到插入的数据?
  2.  
  3. 如果在实现上述需求时,想插入后返回主键的话,切记不要这样写。
  1. @Override
  2. public Long insertProduct(ProductBean productBean) {
  3. // TODO Auto-generated method stub
  4. SqlSession session = MybatisJDBCUtil.currentSession();
  5.  
  6. ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class
  7. // 必须对应DAO的接口层
  8. return productIDao.insertProduct(productBean);
  9.  
  10. }

Why?

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

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

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

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

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

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

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

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

  1. session.commit();
  2.  
  3. MybatisJDBCUtil.closeSession();

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

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

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

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

  1. @Override
  2. public void insertProduct(ProductBean productBean) {
  3. // TODO Auto-generated method stub
  4. SqlSession session = MybatisJDBCUtil.currentSession();
  5.  
  6. ProductIDao productIDao = session.getMapper(ProductIDao.class);// 这里*.class
  7. // 必须对应DAO的接口层
  8. productIDao.insertProduct(productBean);

  9. session.commit();
  10.  
  11. MybatisJDBCUtil.closeSession();
  12. }
  1.  

  1. 参考资料一:https://my.oschina.net/crazybird/blog/379635?p=1
  2.  
  3. 参考资料二:http://blog.csdn.net/jbgtwang/article/details/7307687 这个文章非常好
  1. 参考资料三:http://blog.csdn.net/after_you/article/details/53844908

MyBatis 插入主键方式和返回主键的更多相关文章

  1. Mybatis之MySql批量insert后返回主键

    需求:使用批量插入后,需要insert之后的每一条记录的ID 注意:Mybatis3.3.1的版本以后支持批量插入后返回主键ID 示例: domin.java: public class User { ...

  2. MyBatis在insert插入操作时返回主键ID的配置

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

  3. springboot + mybatis plus使用insert 语句并返回主键

    mapper文件 映射文件中在insert中设置useGeneratedKeys为true,keyProperty设置为主键名称 <insert id="addEmployees&qu ...

  4. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...

  5. Mybatis useGeneratedKeys无法返回主键解决

    1.项目环境--SpringBoot下的SSM+Maven 2.问题出现位置--Dao层和Mapper文件 错误代码如下图: dao层: mapper文件: 错误代码分析: 使用useGenerate ...

  6. JDBC 返回主键

    转载至:https://www.liyongzhen.com/ 上一节课里我们学习通过PreparedStatement对象执行带参数的查询SQL和修改SQL. 这节课我们学习使用 PreparedS ...

  7. MyBatis插入记录时返回主键id的方法

    有时候插入记录之后需要使用到插入记录的主键,通常是再查询一次来获取主键,但是MyBatis插入记录时可以设置成返回主键id,简化操作,方法大致有两种. 对应实体类: public class User ...

  8. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  9. MyBatis insert返回主键(sqlserver2008)

    mybatis insert返回主键(sqlserver2008)   MyBatisXML配置,下面两种方式都行 方式1: <insert id="insert" para ...

随机推荐

  1. Fortify SCA 分析代码漏洞全解

    上次介绍了用FindBugs辅助分析代码漏洞.这次换了一个工具:Fortify SCA Demo 4.0.0.Fortify是一个在安全方面挺出名的公司,这里就不多说了.先介绍一下主角:Fortify ...

  2. 使用树莓派制作一套“NAS+私有云盘+下载机”

    ‍ ‍‍原创作者:HackLiu‍‍ ‍ 0×00 前言 ‍‍如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼.当然,已经有很多厂商包括新晋的小米.360在内的互联网公司 ...

  3. oracle之 Got minus one from a read call 与 ORA-27154: post/wait create failed

    在部署应用的时候,有时候应用可以直接启动,但偶尔应用却无法启动,报错信息是: java.sql.SQLRecoverableException: IO Error: Got minus one fro ...

  4. CentOS 6.5 下Nginx服务的安装与配置

    参考网站: http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3118061.html http://www.cnblogs.com/jilia ...

  5. create index 与 alter table add index 区别

    众所周知,MySQL创建索引有两种语法,即:ALTER TABLE HeadOfState ADD INDEX (LastName, FirstName);CREATE INDEX index_nam ...

  6. TS流解析 一

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  7. java get post 请求

    package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  8. 1021 docker初识

    docker与虚拟机相比,没有虚拟化内核,转而使用宿主机的内核.因此docker更轻更快 docker缺点:后端兼容性测试需求.把软件安装在不同的操作系统上进行测试,观察软件运行是否良好. 不能用do ...

  9. python3调用阿里云短信服务

    #!/usr/bin/env python#-*- coding:utf-8 -*-#Author:lzd import uuidimport datetimeimport hmacimport ba ...

  10. Maven的依赖机制介绍

    以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_manage_dependencies.html: ...