博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis获得刚刚插入的自增的值
阅读量:5167 次
发布时间:2019-06-13

本文共 2538 字,大约阅读时间需要 8 分钟。

转自

在   介绍了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

 

首先,修改数据库

 

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

 

然后,修改配置文件

 

[html] 
 
  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.   
  5. <mapper namespace="com.raistudies.services.ProductServices">  
  6.   
  7.     <insert id="save" parameterType="product" useGeneratedKeys="true" keyProperty="id"  keyColumn="id">  
  8.         INSERT INTO Product (brand,model,name)  
  9.         VALUE (#{brand}, #{model}, #{name} )  
  10.         <selectKey keyProperty="id" resultType="long" order="AFTER">  
  11.             SELECT LAST_INSERT_ID();  
  12.         </selectKey>  
  13.     </insert>  
  14.   
  15. </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

 

 

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

转载于:https://www.cnblogs.com/voctrals/p/4089516.html

你可能感兴趣的文章
背景透明
查看>>
Linux命令详解----ln
查看>>
Combination Sum
查看>>
ZigZag Conversion
查看>>
svn图标不显示的解决方案
查看>>
javascript中的表结构
查看>>
javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
查看>>
一些 CSS 框架
查看>>
5.13 工作笔记
查看>>
Unicode和多字节字符集 (MBCS) 杂谈
查看>>
left 和 margin-left
查看>>
WOW! I have a TOFEL BLOG!
查看>>
PAT (Basic Level) Practise (中文)- 1016. 部分A+B (15)
查看>>
应用程序利用回调向表现层实时推送数据
查看>>
网络编程-UDP
查看>>
[JAVA] Tcp客户端和服务器简单代码
查看>>
管道和FIFO 二
查看>>
JAVA Synchronized (三) volatile 与 synchronized 的比较
查看>>
UIView的layoutSubviews和drawRect方法何时调用
查看>>
Android事件分发机制浅析(2)
查看>>