2014-11-04 114 views
1

我嘗試在春節後插入以檢索ID,但這個解決方案不起作用:獲取後插入ID春

String sqlquery2 = "INSERT into tab (attr1,attr2) VALUES (?,?)"; 
String sql1 ="select last_insert_id()"; 

jdbcTemplateObject.update(sqlquery2, value1, value2); 
int id = jdbcTemplateObject.update(sql1); 
+0

看到這個問題,看看是否使用jdbctemplace with語句幫助HTTP://計算器.com/questions/19095994/insert-row-and-get-generated-id – borjab 2014-11-04 09:51:23

回答

5

對於每個JDBC訪問,Spring使用一個連接爲它的連接池。

因此,它可以使用其池中的一個連接進行插入,併爲last_insert_id查詢使用另一個連接。

問題是,last_insert_id查詢綁定到實際進行插入的連接。

爲了強制Spring JdbcTemplate使用相同的連接,所有代碼的一部分是在插入之前啓動事務,並在last_insert_id查詢之後提交它。

使用@Transactional

Reference

+0

謝謝,現在我試試吧.. – 2014-11-04 11:49:17

+0

@AntonioBalduzzi很高興能幫到你:D – Xstian 2014-11-04 12:00:48

+0

作品!謝謝!! – 2014-11-04 16:40:16

1

爲了更好地解釋由Xstian舉的例子,也有一些說明現在已經過時。 你需要這樣做:

在beans.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:ldap="http://www.springframework.org/schema/ldap" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/ldap 
     http://www.springframework.org/schema/ldap/spring-ldap.xsd"> 


    <context:property-placeholder location="/config/application.properties" /> 



    <!-- Initialization for data source JDBC --> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <!-- Definition for studentJDBCTemplate bean --> 
    <bean id="studentJDBCTemplate" class="com.balduzzi.database.StudentJDBCTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="transactionManager" ref="transactionManager"></property> 
    </bean> 

    <!-- Initialization for TransactionManager --> 
    <bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
    ... 

和Java方法:

public void insertStudent1(String name, String lastname, String password,String hashpass,String studentype,String codfac) { 

      TransactionDefinition def = new DefaultTransactionDefinition(); 
      TransactionStatus status = transactionManager.getTransaction(def); 

     try { 
     String sqlinsertab1l = "INSERT into tab1 (type, cod)" 
          +"VALUES (?, ?)"; 

     jdbcTemplateObject.update(sqlinsertabl, studentype, codfac); 


     String sqlgetlastidtab1 = "select max(id) from tab1"; 

     tab1last_id = jdbcTemplateObject.queryForObject(sqlgetlastidtab1,Integer.class); 

     String sqlinsertab2 = "INSERT into tab2 (password,hashpassword) VALUES (?,?)"; 

     jdbcTemplateObject.update(sqlinsertab2, password, hashpass); 

     String sqlgetlastidtab2 = "select max(id) from tab2"; 

     tab2last_id = jdbcTemplateObject.queryForObject(sqlgetlastidtab2,Integer.class); 

     String sqlinsertstud = "INSERT into tab3 (tab1_id,tab2_id,name,lastname) " + "VALUES (?, ?, ?, ?)"; 

     jdbcTemplateObject.update(sqlinsertstud, tab1last_id, tab2last_id, name, lastname); 


     transactionManager.commit(status); 
     } 
      catch (DataAccessException e) { 
       System.out.println("Error in creating record, rolling back"); 
       transactionManager.rollback(status); 
       throw e; 
     } 
      return;  
    }