Meparameterkan Klausa IN dalam JDBC: Pendekatan Komprehensif
Apabila bekerja dengan pertanyaan pangkalan data, parameter nilai input adalah penting untuk keselamatan dan prestasi. Klausa IN biasanya digunakan untuk menentukan berbilang nilai sebagai sebahagian daripada pertanyaan dan JDBC menyediakan mekanisme untuk parameterkan nilai ini untuk menghalang serangan suntikan SQL.
Walau bagaimanapun, tiada cara mudah untuk meparameterkan klausa IN secara langsung dalam JDBC . Pemacu JDBC tertentu mungkin menyokong PreparedStatement#setArray() untuk tujuan ini, tetapi ketersediaannya merentas pangkalan data berbeza-beza.
Untuk pendekatan yang serba boleh dan pangkalan data-agnostik, anda boleh menggunakan kaedah pembantu untuk menjana ruang letak dan menetapkan nilai secara dinamik:
<code class="java">public static String preparePlaceHolders(int length) { return String.join(",", Collections.nCopies(length, "?")); } public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { for (int i = 0; i < values.length; i++) { preparedStatement.setObject(i + 1, values[i]); } }
Begini cara anda boleh menggunakan kaedah ini:
<code class="java">private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)"; public List<Entity> find(Set<Long> ids) throws SQLException { List<Entity> entities = new ArrayList<>(); String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size())); try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(sql); ) { setValues(statement, ids.toArray()); try (ResultSet resultSet = statement.executeQuery()) { while (resultSet.next()) { entities.add(map(resultSet)); } } } return entities; }</code>
Perhatikan bahawa pangkalan data tertentu mungkin mengehadkan bilangan nilai yang dibenarkan dalam klausa IN. Sebagai contoh, Oracle mempunyai had 1000 item. Adalah penting untuk mempertimbangkan perkara ini semasa mereka bentuk pertanyaan anda dan berkemungkinan memecahkan senarai besar kepada bahagian yang lebih kecil.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengparameterkan Klausa IN dalam JDBC Dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!