如何根据输入字段值动态形成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条件中使用更多列,则可以通过引入辅助方法来删除代码中的一些重复项。