转自这里

http://blog.csdn.net/zhangwenan2010/article/details/7579191   介绍了MyBatis 3 的配置过程,

其中,Product 类的 id 属性,在真实项目中,它的值是唯一的,以便确定对应的数据。

要在Java 中自动生成这样的 id 值,必然要进行额外的运算来找到一个唯一的 id 值,那么一旦需要存储大量的数据,这个问题就有可能成为瓶颈。

那么,解决方案是?

其实大多数主流数据库都已经提供了自动生成唯一id 值的解决方案,我们只需要将这个值与我们的 Java 对象关联起来就可以了。

比如:

1、Mysql 数据库,AUTO_INCREMENT

2、MS SQL Server 数据库,IDENTITY

修改原先的代码

工具:

1、MyBatis 3.1.0 ( 原先使用的 MyBatis 3.0.4 有bug)

2、Mysql Java Connector 5.1

首先,修改数据库

  1. CREATE TABLE Product(id BIGINT NOT NULL AUTO_INCREMENT , brand VARCHAR(20),
  2. model VARCHAR(20), name VARCHAR(30) , PRIMARY KEY (id));

然后,修改配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.raistudies.services.ProductServices">
  5. <insert id="save" parameterType="product" useGeneratedKeys="true" keyProperty="id"  keyColumn="id">
  6. INSERT INTO Product (brand,model,name)
  7. VALUE (#{brand}, #{model}, #{name} )
  8. <selectKey keyProperty="id" resultType="long" order="AFTER">
  9. SELECT LAST_INSERT_ID();
  10. </selectKey>
  11. </insert>
  12. </mapper>

可以发现,我们对<insert/>标签作了以下修改:

1、增加了 useGeneratedKeys=”true” ,这一设置指定了 “id” 属性将会由数据库来自动生成,keyProperty ="id" 指定 Product 类中的 id 属性,keyColumn="id" 则指定了Product 表中的列名 id

2、使用<selectKey> 标签,就会在数据库自动生成 id 之后,将id 的值返回给 Java 程序中的对象,那么product 实例中的id 值就会被正确设置。

SELECT LAST_INSERT_ID() 这一语法,根据使用数据库类型的不同,有可能不同,本例中的语句仅适用与MySQL

    1. package com.raistudies.runner;
    2. import java.io.IOException;
    3. import java.io.Reader;
    4. import org.apache.ibatis.io.Resources;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    8. import com.raistudies.domain.Product;
    9. import com.raistudies.services.ProductServices;
    10. public class AppTester {
    11. private static SqlSessionFactory sessionFac = null;
    12. private static Reader reader;
    13. private static String CONFIGURATION_FILE = "sqlmap-config.xml";
    14. static{
    15. try {
    16. reader = Resources.getResourceAsReader(CONFIGURATION_FILE);
    17. sessionFac = new SqlSessionFactoryBuilder().build(reader);
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. public static void main(String[] args) {
    23. SqlSession session = sessionFac.openSession();
    24. try {
    25. ProductServices productServiceObj = session.getMapper(ProductServices.class);
    26. Product product = new Product();
    27. product.setBrand("LG");
    28. product.setModel("P500");
    29. product.setName("Optimus One");
    30. productServiceObj.save(product);
    31. System.out.println("The new id is : " + product.getId());
    32. session.commit();
    33. } finally {
    34. session.close();
    35. }
    36. }
    37. }

mybatis获得刚刚插入的自增的值的更多相关文章

  1. mybatis获取刚刚插入到数据库的数据的id(转载)

    原文地址:https://blog.csdn.net/hehuihh/article/details/82800739 我用的是第一种写法,直接把代码copy到insert标签里(id要是自增id) ...

  2. mysql获取插入时自增ID值的方法

    1.  LAST_INSERT_ID: LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变. LAST_INSERT_ID是 ...

  3. MyBatis 插入时返回刚插入记录的主键值

    MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java package cn.co ...

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

    公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题 ...

  5. 获取刚刚插入表格的这条信息的自增ID

    获取刚刚插入表格的这条信息的自增ID var conn=getConnection(); var msql="INSERT INTO " + table +" (&quo ...

  6. Mybatis 插入数据并返回刚刚插入的数据id

    1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名. 2.Mybat ...

  7. MyBatis+MySQL 返回插入的主键ID

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...

  8. (转)MyBatis+MySQL 返回插入的主键ID

    MyBatis+MySQL 返回插入的主键ID 需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如 ...

  9. myBatis获取批量插入数据的主键id

    在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...

随机推荐

  1. Magento产品批量导入方法?

    从事外贸的我们在工作中,经常需要添加成千上万个的产品,如果一个一个的去上传,要花费很多时间,有是很让人头痛,那么应该如何实现产品批量上传?如果使用的是Magento系统的话,那么你现在有福利了,因为M ...

  2. ci总结

    1.创建模型,在模型中加载$this->load->database();2.在模型中写入想实现的功能方法3.在控制器中加载辅助函数和模型,$this->load->model ...

  3. Python 如何跳出多重循环

    Python 如何跳出多重循环 抛异常 return

  4. 使用批处理文件,自动设置计算机IP地址

    WIN7批处理设置IP地址不成功,显示“The filename, directory name, or volume label syntax is incorrect.”错误, 解决方法:将“本地 ...

  5. 博客引索 - imsoft.cnblogs

    Java C Delphi 日常工具 图片处理 视频处理 系统工具 知识经验 奇思妙想 网站推荐

  6. JS网址正则验证

    function IsURL(str_url){ var strRegex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9 ...

  7. Spring MVC 属性文件读取注入到静态字段

    目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用   在项目中,有些参数需要配置到属性文件xxx.pr ...

  8. HTTP详解(3)-http1.0 和http1.1 区别

    HTTP详解(3)-http1.0 和http1.1 区别 分类: 网络知识2013-03-17 16:51 1685人阅读 评论(0) 收藏 举报   目录(?)[+]   翻了下HTTP1.1的协 ...

  9. HDU 5955 Guessing the Dice Roll

    HDU 5955 Guessing the Dice Roll 2016 ACM/ICPC 亚洲区沈阳站 题意 有\(N\le 10\)个人,每个猜一个长度为\(L \le 10\)的由\(1-6\) ...

  10. https那些事儿

    (一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...