查询:采用SQL语句,使用限定词语在数据库中查询满足条件的数据
多条件查询:根据查询的参数拼接SQL语句,使用AND把多个条件拼接起来,表示同时满足
多条件查询的步骤:
①:先在DAO接口中定义高级查询的方法
②:在IMPL包中实现DAO接口中的方法
③:创建一个测试类进行测试(这步还是很关键的,能确保每一步的测试通过可以把做成之后的错误率降到最低)
关于SQL语句的拼接问题
①:第一种是采用WHERE TRUE的方法,采用直接拼接的方法,创建一个StringBuilder对象,调用append方法来拼接。
String basicsql = "SELECT * FROM t_name WHERE TRUE ";
List<Object> list = new ArrayList<>();
StringBuilder sb = new StringBuilder(basicsql);
if(exist != null){
sb.append(" AND <span style="font-family:KaiTi_GB2312;">t_name_xx</span> like ?");//like可以换成其他的限制条件
list.add(exist);
}
②:第二种方法就是去掉 WHERE TRUE的方法
String basicsql = "SELECT * FROM t_name ";
List<Object> list = new ArrayList<>();
boolean flag = true;
StringBuilder sb = new StringBuilder(basicsql);
if(flag){
sb.append(" WHERE ");
flag = false;
} else {
sb.append(" AND ")
}
sb.append(" t_name_xx like ?");//like可以换成其他的限制条件
list.add(exist);
}
以上的代码都是最简单的,主要叙述了逻辑关系,可以进一步的抽取重构,直接上一个简单点的代码
public class SqlBuilder {
private String basesql = "SELECT * FROM ";
private String tableName;//谁用才知道这个是什么表
private String whereCase;//where语句的部分
private Map<String, Object> map;//用于保存
public SqlBuilder(String tableName, Map<String, Object> map) {
this.tableName = tableName;
this.whereCase = "";
this.map = map;
}
//获取多条件查询的语句
public String getQuerySql(){
StringBuilder sb = new StringBuilder(basesql);
sb.append(tableName);
addWhereCase();
sb.append(whereCase);
return sb.toString();
}
private void addWhereCase() {
//如果map不为空,则需要添加WHERE
if (map != null && map.size() > 0) {
//强制第一个拼接WHERE
StringBuilder sb = new StringBuilder(" WHERE ");
for (String str : map.keySet()) {
sb.append(str);
sb.append(" AND ");//为每一个条件添加AND
}
//循环结束后删除最后一个AND
sb.delete(sb.lastIndexOf(" AND"), sb.length());
whereCase = sb.toString();
}
}
//获取SQL语句对应的参数
public Object[] getParams(){
//将map集合转换成数组
Object[] params = map.values().toArray();
return params;
}
}
这是一个简单的SQL语句拼接的工具类,然后就可以在你的DAO实现类中进行调用了