栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java 使用JDBC参数化IN子句的最佳方法是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 使用JDBC参数化IN子句的最佳方法是什么?

在JDBC中,确实没有直接的方法可以做到这一点。某些 JDBC驱动程序似乎支持

PreparedStatement#setArray()
该IN子句。我只是不确定那是哪个。

你可以仅使用带有

String#join()
和的辅助方法,并
Collections#nCopies()
为IN子句生成占位符,使用另一个辅助方法来使用设置循环中的所有值
PreparedStatement#setObject()

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]);    }}

使用方法如下:

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<Entity>();    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;}private static Entity map(ResultSet resultSet) throws SQLException {    Enitity entity = new Entity();    entity.setId(resultSet.getLong("id"));    entity.setName(resultSet.getString("name"));    entity.setValue(resultSet.getInt("value"));    return entity;}

请注意,某些数据库在该

IN
子句中具有允许的值数量限制。例如,Oracle对1000个项目有此限制。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431941.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号