我嘗試在春節後插入以檢索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);
我嘗試在春節後插入以檢索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);
對於每個JDBC訪問,Spring使用一個連接爲它的連接池。
因此,它可以使用其池中的一個連接進行插入,併爲last_insert_id查詢使用另一個連接。
問題是,last_insert_id查詢綁定到實際進行插入的連接。
爲了強制Spring JdbcTemplate使用相同的連接,所有代碼的一部分是在插入之前啓動事務,並在last_insert_id查詢之後提交它。
使用@Transactional
謝謝,現在我試試吧.. – 2014-11-04 11:49:17
@AntonioBalduzzi很高興能幫到你:D – Xstian 2014-11-04 12:00:48
作品!謝謝!! – 2014-11-04 16:40:16
爲了更好地解釋由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;
}
看到這個問題,看看是否使用jdbctemplace with語句幫助HTTP://計算器.com/questions/19095994/insert-row-and-get-generated-id – borjab 2014-11-04 09:51:23