الهوية من SQL إدراج عبر JDBCTEMPLATE
-
13-09-2019 - |
سؤال
هل من الممكن الحصول على الهوية @ من إدراج 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(
SqlParameterSource
parameterSource)
وصف نسخ من واجهة:
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" );
المادة الكريمة هنا.