如何根据输入字段值动态形成SQL查询
我有三个领域
String stateID = ""; String districtID = ""; String talukaID = "";
这三个字段可以为空或可以有价值
表的描述是
desc tbl_dealer contactName phone1 stateID districtID talukMandalID
基于重新设置的值,我必须动态编写SQL查询
基于重新设置的值,我必须动态编写SQL查询
例如
如果这三个都是空的
select contactName , phone1 from tbl_dealer
如果stateID为空,则(从查询中删除状态)
select contactName , phone1 from tbl_dealer where districtID = "'+districtID+'" AND talukaID = "'+talukaID+'"
同样适用于所有情况
能告诉我怎样才能有效地扭转这个问题,
我建议,首先创建一个方法:
private void appendFilter(StringBuilder sb, String fieldName, String fieldValue) { if(fieldValue != null && !fieldValue.trim().equalsIgnoreCase("")) { sb.append("AND "+fieldName+"='"+fieldValue+"'"); } }
然后使用此方法:
StringBuilder sb = new StringBuilder(); sb.append("select contactName , phone1 from tbl_dealer where 1=1 "); appendFilter(sb, "districtID", districtID); appendFilter(sb, "stateID", stateID); appendFilter(sb, "talukaID", talukaID); final String query=sb.toString();
您应该使用带有绑定变量的PreparedStatement
来消除SQL注入的可能性(以及使DB能够缓存查询):
PreparedStatement ps = null; try { List bindVariables = new ArrayList<>(); StringBuilder query = new StringBuilder( "select contactName, phone1 from tbl_dealer WHERE 1=1"); if (stateID.length > 0) { query.append(" AND stateID = ?"); bindVariables.add(stateID); } if (districtID.length > 0) { query.append(" AND districtID = ?"); bindVariables.add(districtID); } if (talukaID.length > 0) { query.append(" AND talukaID = ?"); bindVariables.add(talukaID); } ps = myConnection.prepareStatement(query.toString()); for (int i = 0; i < bindVariables.size(); i++) { // variables are indexed from 1 in JDBC ps.setString(i+1, bindVariables.get(i)); } ResultSet rs = ps.executeQuery(); // iterate over the result set here rs.close(); } finally { if (ps != null) { ps.close(); } }
如果要在WHERE
条件中使用更多列,则可以通过引入辅助方法来删除代码中的一些重复项。