7

JdbcTemplateSpring のクラスを使用して、という名前の MySQL テーブルに行を挿入しtransaction、生成された ID を取得しようとしています。関連するコードは次のとおりです。

public Transaction insertTransaction(final Transaction tran) {

    // Will hold the ID of the row created by the insert
    KeyHolder keyHolder = new GeneratedKeyHolder();

    getJdbcTemplate().update(new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

            PreparedStatement ps = connection.prepareStatement(INSERT_TRAN_SQL);
            ps.setString(1, tran.getTransactionType().toString());

            Date sqlDate = new Date(tran.getDate().getTime());
            ps.setDate(2, sqlDate);
            ps.setString(3, tran.getDescription());

            return ps;
        }
    }, keyHolder);

    tran.setId(keyHolder.getKey().longValue());
    return tran;
}

しかし、次の例外はへの呼び出しによってスローされますgetJdbcTemplate().update

java.sql.SQLException: 生成されたキーが要求されていません。Statement.executeUpdate() または Connection.prepareStatement() に Statement.RETURN_GENERATED_KEYS を指定する必要があります。

行を挿入して、生成された ID を放棄せずに取得できますJdbcTemplateか? Spring 2.5、MySQL 5.5.27、および MySQL Connector 5.1.26 を使用しています。

4

3 に答える 3

9

その動作を取得する簡単な方法があります。

protected JdbcTemplate            jdbcTemplate;
private SimpleJdbcInsert          insert;

    this.jdbcTemplate = new JdbcTemplate(this.databaseSetup.getDataSource());
    this.insert = new SimpleJdbcInsert(this.jdbcTemplate).withTableName(this.tableName).usingGeneratedKeyColumns(this.pkColumn);

次に、テーブルの各列名の値を含む parameters と呼ばれるマップを作成し、次のようなレコードを挿入します。

    final Map<String, Object> parameters = new HashMap<>();
    parameters.put("empName", employee.getName()); // store the String name of employee in the column empName
    parameters.put("dept", employee.getDepartment()); // store the int (as Integer) of the employee in the column dept
    final Number key = this.insert.executeAndReturnKey(parameters);
    final long pk = key.longValue();
于 2013-09-30T14:05:51.317 に答える
8

Statement次のように準備するだけです

PreparedStatement ps = connection.prepareStatement(
                           INSERT_TRAN_SQL, Statement.RETURN_GENERATED_KEYS);

基礎となる JDBC ドライバー (JdbcTemplateここでは Spring を介して間接的に使用) には、生成されたキーを取得するヒントが必要です。PreparedStatementこれは、 asの準備中に行うことができます。

connection.prepareStatement(strSQL, Statement.RETURN_GENERATED_KEYS);

Statementまたは、 asの実行時に

statement.executeUpdate(strSQL, Statement.RETURN_GENERATED_KEYS);

これはあなたjava.sql.SQLExceptionが指しているものでもあります。

于 2013-09-30T14:05:23.897 に答える
0

ステップ 1 のように次のシーケンス番号を取得し、ステップ 2 のように挿入ステートメントで渡すことができます。

1-

Integer nextSeq = (Integer) getJdbcTemplate().queryForObject(
        "select SEQ_CUSTOMER_ID.nextVal from dual", new Object[] {}, Integer.class);

2-

getJdbcTemplate().update(
        "INSERT INTO customer "
        + "(CUST_ID, NAME, UPDATED) VALUES (?, ?, ?)",
        new Object[] { nextSeq ,customer.getName(),
                customer.getUpdated() });
于 2014-09-03T05:19:50.263 に答える