Java eption(欧洲){ se.printStackTrace(); } }
您可以使用下面javadoc中提到的Java eption(欧洲){ se.printStackTrace(); } },java,jdbc,prepared-statement,in-clause,Java,Jdbc,Prepared Statement,In Clause,您可以使用下面javadoc中提到的setArray方法: 代码: 您不希望在动态查询中使用PreparedStation,至少您可以确保始终小于5个变量或这样的小值,但即使如此,我认为这是一个坏主意(不可怕,但不好)。由于元素的数量很大,情况会更糟(也更糟糕) 想象一下你的in条款中有成百上千种可能性: 这会适得其反,因为每次新请求时都会缓存,所以会损失性能和内存,而PreparedStatement不仅仅用于SQL注入,它还与性能有关。在这种情况下,语句更好 您的池有PreparedSt
setArray
方法:
代码:
您不希望在动态查询中使用PreparedStation,至少您可以确保始终小于5个变量或这样的小值,但即使如此,我认为这是一个坏主意(不可怕,但不好)。由于元素的数量很大,情况会更糟(也更糟糕) 想象一下你的in条款中有成百上千种可能性:
for( int i = 0 ; i < listField.size(); i++ ) {
i < listField.size() - 1 ? request.append("?,") : request.append("?");
}
例如:
List<String> listField = new ArrayList<String>();
listField.add("test1");
listField.add("test2");
listField.add("test3");
StringBuilder request = new StringBuilder("SELECT * FROM TABLE WHERE FIELD IN (");
for( int i = 0 ; i < listField.size(); i++ ) {
request = i < (listField.size() - 1) ? request.append("?,") : request.append("?");
}
DNAPreparedStatement statement = DNAPreparedStatement.newInstance(connection, request.toString);
int i = 1;
for (String field : listField) {
statement.setString(i++, field);
}
ResultSet rs = statement.executeQuery();
List listField=new ArrayList();
添加(“test1”);
添加(“test2”);
添加(“test3”);
StringBuilder请求=新建StringBuilder(“从表中选择*字段(”);
对于(int i=0;i
公共静态结果集getResult(连接,列表值){
试一试{
String queryString=“从列名称所在的表名称中选择*”;
StringBuilder参数builder=新建StringBuilder();
parameterBuilder.append(“”);
对于(int i=0;ii+1){
parameterBuilder.append(“,”);
}
}
parameterBuilder.append(“)”;
PreparedStatement=connection.prepareStatement(queryString+parameterBuilder);
对于(int i=1;i
使用Java 8 API,
List empNoList=Arrays.asList(123476782432975565563354646);
列表参数=新的ArrayList();
empNoList.forEach(empNo->parameters.add(“?”);//使用forEach添加所需数量的“?”
String commaSepParameters=String.join(,,参数);//使用字符串将“?”与“,”连接起来
StringBuilder selectQuery=new StringBuilder().append(“从EMP\U ID所在的员工中选择计数(EMP\U ID)”).append(CommasePPAParameters.append(“)”);
尝试使用此代码
String ids[] = {"182","160","183"};
StringBuilder builder = new StringBuilder();
for( int i = 0 ; i < ids.length; i++ ) {
builder.append("?,");
}
String sql = "delete from emp where id in ("+builder.deleteCharAt( builder.length() -1 ).toString()+")";
PreparedStatement pstmt = connection.prepareStatement(sql);
for (int i = 1; i <= ids.length; i++) {
pstmt.setInt(i, Integer.parseInt(ids[i-1]));
}
int count = pstmt.executeUpdate();
stringids[]={“182”、“160”、“183”};
StringBuilder=新的StringBuilder();
for(int i=0;i 对于(int i=1;i大量重复:,根据列表的最大长度,这可能会导致大量准备好的语句,可能会影响数据库性能。此外,似乎缺少括号…我听说过一种好的做法,其中有几个SQL语句带有不同数量的问号-例如,10、40、160,800.其余部分用零(通常不使用零作为ID)或任何给定参数填充。这减少了存储在DB缓存中的准备语句的数量。添加“,?”更容易一些
然后删除第一个字符。我认为这是一个坏主意,可能会破坏你在大公司的生产。池中有最大数量的准备语句(ofc不使用-1),你可以用这个技巧使最大数量饱和。对我来说,这个答案是危险的,也可能是邪恶的。太多的new StringBuilder()
调用。如果您直接将用户输入放入SQL字符串中,SQL注入变得容易,那么这不是违背了PreparedStatement的要点吗?SQL注入的工作方式高度依赖于数据库。您可能希望包括您使用的数据库+驱动程序。此解决方案听起来不错,但我得到了一个java.SQL.sqlfeaturenotsupportedExceptionmysql驱动程序5.1.39中的n也不适用于Oracle。不适用于H2,在第2条中,这适用于哪个数据库?适用于PostgreSQL。但是您必须编写WHERE field=ANY(?)
而不是WHERE field IN(?)
,cf.不要这样做!这将打开您的程序进行SQL注入。如果您是通过用户输入进行此操作,他们可以让查询执行任何他们想执行的操作。添加到David的注释中:不要这样做!准备这样的语句是毫无价值和有害的。使用此处发布的其他解决方案之一,包括?占位符,或者,如果您不介意的话关于SQL注入攻击,则只需使用语句对象,而无需准备。
int index = 1;
for( Object o : values ) {
pstmt.setObject( index++, o ); // or whatever it applies
}
String tmptable = "tmp" + UUID.randomUUID();
sql = "create table " + tmptable + "(pagelist text not null)";
cnn.createStatement().execute(sql);
cnn.setAutoCommit(false);
stmt = cnn.prepareStatement("insert into "+tmptable+" values(?);");
for(Object o : rmList){
Path path = (Path)o;
stmt.setString(1, path.toString());
stmt.execute();
}
cnn.commit();
cnn.setAutoCommit(true);
stmt = cnn.prepareStatement(sql);
stmt.execute("delete from filelist where path + page in (select * from "+tmptable+");");
stmt.execute("drop table "+tmptable+");");
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("helow");
String where="where task in ";
where+="(";
// where+="'task1'";
int num[]={1,2,3,4};
for (int i=0;i<num.length+1;i++) {
if(i==1){
where +="'"+i+"'";
}
if(i>1 && i<num.length)
where+=", '"+i+"'";
if(i==num.length){
System.out.println("This is last number"+i);
where+=", '"+i+"')";
}
}
System.out.println(where);
}
}
int paramSizeInClause = 10; // required to be greater than 0!
String color = "FF0000"; // red
String name = "Nathan";
Date now = new Date();
String[] ids = "15,21,45,48,77,145,158,321,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,358,1284,1587".split(",");
// Build sql query
StringBuilder sql = new StringBuilder();
sql.append("UPDATE book SET color=? update_by=?, update_date=? WHERE book_id in (");
// number of max params in IN clause can be modified
// to get most efficient combination of number of batches
// and number of parameters in each batch
for (int n = 0; n < paramSizeInClause; n++) {
sql.append("?,");
}
if (sql.length() > 0) {
sql.deleteCharAt(sql.lastIndexOf(","));
}
sql.append(")");
PreparedStatement pstm = null;
try {
pstm = connection.prepareStatement(sql.toString());
int totalIdsToProcess = ids.length;
int batchLoops = totalIdsToProcess / paramSizeInClause + (totalIdsToProcess % paramSizeInClause > 0 ? 1 : 0);
for (int l = 0; l < batchLoops; l++) {
int i = 1;
pstm.setString(i++, color);
pstm.setString(i++, name);
pstm.setTimestamp(i++, new Timestamp(now.getTime()));
for (int count = 0; count < paramSizeInClause; count++) {
int param = (l * paramSizeInClause + count);
if (param < totalIdsToProcess) {
pstm.setString(i++, ids[param]);
} else {
pstm.setNull(i++, Types.VARCHAR);
}
}
pstm.addBatch();
}
} catch (SQLException e) {
} finally {
//close statement(s)
}
Connection connection = ConnectionManager.getConnection();
PreparedStatement pstmt = null;
//if the field values are in ArrayList
List<String> fieldList = new ArrayList();
try {
StringBuffer sb = new StringBuffer();
sb.append(" SELECT * \n");
sb.append(" FROM TEST \n");
sb.append(" WHERE FIELD IN ( \n");
for(int i = 0; i < fieldList.size(); i++) {
if(i == 0) {
sb.append(" '"+fieldList.get(i)+"' \n");
} else {
sb.append(" ,'"+fieldList.get(i)+"' \n");
}
}
sb.append(" ) \n");
pstmt = connection.prepareStatement(sb.toString());
pstmt.executeQuery();
} catch (SQLException se) {
se.printStackTrace();
}
}
PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();
for( int i = 0 ; i < listField.size(); i++ ) {
i < listField.size() - 1 ? request.append("?,") : request.append("?");
}
int i = 1;
for (String field : listField) {
statement.setString(i++, field);
}
List<String> listField = new ArrayList<String>();
listField.add("test1");
listField.add("test2");
listField.add("test3");
StringBuilder request = new StringBuilder("SELECT * FROM TABLE WHERE FIELD IN (");
for( int i = 0 ; i < listField.size(); i++ ) {
request = i < (listField.size() - 1) ? request.append("?,") : request.append("?");
}
DNAPreparedStatement statement = DNAPreparedStatement.newInstance(connection, request.toString);
int i = 1;
for (String field : listField) {
statement.setString(i++, field);
}
ResultSet rs = statement.executeQuery();
public static ResultSet getResult(Connection connection, List values) {
try {
String queryString = "Select * from table_name where column_name in";
StringBuilder parameterBuilder = new StringBuilder();
parameterBuilder.append(" (");
for (int i = 0; i < values.size(); i++) {
parameterBuilder.append("?");
if (values.size() > i + 1) {
parameterBuilder.append(",");
}
}
parameterBuilder.append(")");
PreparedStatement statement = connection.prepareStatement(queryString + parameterBuilder);
for (int i = 1; i < values.size() + 1; i++) {
statement.setInt(i, (int) values.get(i - 1));
}
return statement.executeQuery();
} catch (Exception d) {
return null;
}
}
Using Java 8 APIs,
List<Long> empNoList = Arrays.asList(1234, 7678, 2432, 9756556, 3354646);
List<String> parameters = new ArrayList<>();
empNoList.forEach(empNo -> parameters.add("?")); //Use forEach to add required no. of '?'
String commaSepParameters = String.join(",", parameters); //Use String to join '?' with ','
StringBuilder selectQuery = new StringBuilder().append("SELECT COUNT(EMP_ID) FROM EMPLOYEE WHERE EMP_ID IN (").append(commaSepParameters).append(")");
String ids[] = {"182","160","183"};
StringBuilder builder = new StringBuilder();
for( int i = 0 ; i < ids.length; i++ ) {
builder.append("?,");
}
String sql = "delete from emp where id in ("+builder.deleteCharAt( builder.length() -1 ).toString()+")";
PreparedStatement pstmt = connection.prepareStatement(sql);
for (int i = 1; i <= ids.length; i++) {
pstmt.setInt(i, Integer.parseInt(ids[i-1]));
}
int count = pstmt.executeUpdate();