【问题标题】:Get id after insert in Spring在 Spring 中插入后获取 id
【发布时间】:2014-11-05 02:00:45
【问题描述】:

我尝试在 Spring 中插入后检索 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);

【问题讨论】:

标签: java sql spring jdbctemplate


【解决方案1】:

对于每个 jdbc 访问,Spring 为其连接池使用一个连接。

因此它可以使用其池中的一个连接进行插入,并使用另一个连接进行 last_insert_id 查询。

问题在于 last_insert_id 查询与实际进行插入的连接绑定。

为了强制 Spring JdbcTemplate 一直使用相同的连接,部分代码是在插入之前启动一个事务,并在 last_insert_id 查询之后提交。

使用@Transactional

Reference

【讨论】:

  • @AntonioBalduzzi 很高兴为您提供帮助:D
【解决方案2】:

为了更好地解释 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;      
  }

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2013-07-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多