zoukankan      html  css  js  c++  java
  • mybatis获得刚刚插入的自增的值

    转自这里

    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

    首先,修改数据库

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



    然后,修改配置文件

    [html] view plaincopy
     
    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] view plaincopy
     
      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. }  
  • 相关阅读:
    Windows2003服务器IIS启用Gzip压缩
    使用CDN加速后网站不能使用HttpWebRequest提交数据
    隐藏其它数据库,只让用户能够看到自己拥有权限的数据库
    磁盘阵列的基本概念
    前端构建相关
    一个日志记录类
    手把手教你做个splash(屏幕启动)
    调试问题及解决方案集锦
    c#
    。net中各大编程网址
  • 原文地址:https://www.cnblogs.com/voctrals/p/4089516.html
Copyright © 2011-2022 走看看