سؤال

هل من الممكن الحصول على الهوية @ من إدراج SQL في مكالمة قالب JDBC الربيع؟ إذا كان الأمر كذلك، كيف؟

هل كانت مفيدة؟

المحلول

ال JDBCTemplate.update يتم تحميل الطريقة لتحمل كائن يسمى ostedKeyholder الذي يمكنك استخدامه لاسترداد المفتاح الحسابي. على سبيل المثال (الرمز مأخوذ من هنا):

final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps =
                connection.prepareStatement(INSERT_SQL, new String[] {"id"});
            ps.setString(1, name);
            return ps;
        }
    },
    keyHolder);
// keyHolder.getKey() now contains the generated key

نصائح أخرى

ماذا عن SimpleJdbcInsert.executeAndReturnKeyب يتطلب الأمر شكلين، اعتمادا على المدخلات:

(1) المدخلات هي Map

public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)

وصف نسخ من واجهة: SimpleJdbcInsertOperations

تنفيذ إدراج استخدام القيم المرة في وإرجاع المفتاح الذي تم إنشاؤه. هذا يتطلب تحديد اسم الأعمدة مع المفاتيح التي تم إنشاؤها تلقائيا. هذه الطريقة سوف تعيد دائما KeyHolder ولكن يجب على المتصل التحقق من أنه يحتوي بالفعل على المفاتيح التي تم إنشاؤها.

المحدد من قبل:

executeAndReturnKey في واجهة SimpleJdbcInsertOperations

حدود:

args - Map containing column names and corresponding value

عائدات:

the generated key value

(2) المدخلات هي SqlParameterSource

public java.lang.Number executeAndReturnKey(SqlParameterSourceparameterSource)

وصف نسخ من واجهة: SimpleJdbcInsertOperations

تنفيذ إدراج استخدام القيم المرة في وإرجاع المفتاح الذي تم إنشاؤه. هذا يتطلب تحديد اسم الأعمدة مع المفاتيح التي تم إنشاؤها تلقائيا. هذه الطريقة سوف تعيد دائما KeyHolder ولكن يجب على المتصل التحقق من أنه يحتوي بالفعل على المفاتيح التي تم إنشاؤها.

المحدد من قبل:

executeAndReturnKey في واجهة SimpleJdbcInsertOperations

حدود:

parameterSource - SqlParameterSource containing values to use for insert

عائدات:

القيمة الرئيسية التي تم إنشاؤها.

إضافة ملاحظات مفصلة / نموذج التعليمات البرمجية إلى TODD.Pierzina الإجابة

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
                "Primary_key");
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("Column_NAME1", bean.getval1());
        parameters.put("Column_NAME2", bean.getval2());
        // execute insert
        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
                parameters));
           // convert Number to Int using ((Number) key).intValue()
            return ((Number) key).intValue();

لا أعرف إذا كان هناك "بطانة واحدة"، لكن يبدو أن هذا يفعل الخدعة (MSSQL على الأقل):

// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );

المادة الكريمة هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top