Metode queryforInt / queryforLong di JdbcTemplate tidak digunakan lagi di Spring 3.2. Saya tidak dapat mengetahui mengapa atau apa yang dianggap praktik terbaik untuk mengganti kode yang ada menggunakan metode ini.
Metode tipikal:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK cara diatas perlu ditulis ulang sebagai berikut:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Jelas penghentian ini membuat kelas JdbcTemplate lebih sederhana (atau bukan?). QueryForInt selalu merupakan metode praktis (saya kira) dan sudah ada sejak lama. Mengapa telah dihapus. Akibatnya, kode menjadi lebih rumit.
java
spring
jdbc
jdbctemplate
Dan MacBean
sumber
sumber
@Deprecated
null
(bukan kasus dalam contoh Anda). Saya tidak menemukan cara lain selain menduplikasi sekarang kode cek nol dari queryForInt / Long.Jawaban:
Apa yang saya pikirkan adalah seseorang menyadari bahwa metode queryForInt / Long memiliki semantik yang membingungkan, yaitu, dari kode sumber JdbcTemplate Anda dapat melihat implementasinya saat ini:
yang mungkin membuat Anda berpikir bahwa jika set hasil kosong, ia akan mengembalikan 0, namun ia mengeluarkan pengecualian:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
jadi implementasi berikut pada dasarnya sama dengan yang sekarang:
Dan kemudian kode yang tidak digunakan lagi sekarang harus diganti dengan yang jelek:
atau ini (lebih bagus):
sumber
Saya setuju dengan poster asli bahwa mencabut metode kenyamanan queryForLong (sql) adalah ketidaknyamanan.
Saya telah mengembangkan aplikasi menggunakan Spring 3.1 dan baru saja memperbarui ke versi Spring terbaru (3.2.3) dan menyadari bahwa aplikasi tersebut sudah usang.
Untungnya, itu adalah perubahan satu baris untuk saya:
diubah menjadi
Dan beberapa Tes Unit tampaknya menunjukkan, perubahan di atas berhasil.
sumber
Tidak berlaku lagi mendukung
queryForObject(String, Class)
.sumber
Mengganti kode tersebut:
Dengan kode ini:
sangat berbahaya karena jika kolom memiliki nilai null queryForObject mengembalikan null dan seperti yang kita ketahui tipe primitif tidak bisa null dan Anda akan memiliki NullPointerException. Kompilator tidak memperingatkan Anda tentang hal ini. Anda akan tahu tentang kesalahan ini saat runtime. Kesalahan yang sama akan Anda alami jika Anda memiliki metode yang mengembalikan tipe primitif:
Metode queryForLong yang tidak digunakan lagi di JdbcTemplate pada Spring 3.2.2 memiliki isi berikut:
Anda lihat sebelum mereka mengembalikan nilai primitif ada pemeriksaan bahwa ini bukan null dan jika null mereka mengembalikan 0. By the way - Harus 0L.
sumber
JdbcTemplate#queryForInt
mengembalikan 0 jika nilai kolom adalah SQL NULL atau 0. Tidak ada cara untuk membedakan satu kasus dari yang lain. Saya rasa ini adalah alasan utama mengapa metode ini tidak digunakan lagi. BTW,ResultSet#getInt
berperilaku serupa. Padahal, kita dapat membedakan kedua kasus ini denganResultSet#wasNull
.sumber
sumber