主要思路为:
1.思考所需sql语句,在数据库中运行,尝试,查看返回结果集类型;
2.用StringBuffer类对sql语句根据所需条件进行编辑,并封装相应数据;
3.对编译好的String类型sql语句和封装的数据交给PreparedStatement,封装运行sql 得到结果集
1.确定sql语句
首先我们要先了解的问题是多条件查询所需要的sql语句
举例:
select count(1) from table_name where name like '%key%' and ...
然后在数据库运行,进行验证sql语句的可行性
如图,返回值的主键为
cout(1)
,这里很重要!!
2.在java对应类中编辑sql语句,并对相应的数据进行封装
//使用StringBuffer类来对sql语句进行重组
StringBuffer sql =new StringBuffer();
//用于存放数据
ArrayList<Object> list =new ArrayList<Object>();
sql.append("select count(1) from student");
//判断"reason"字符串是否为空,不为空就添加对应的sql语句,作为其中一个条件
if (reason!=null && reason.length()>0){
sql.append(" where reason like ? ");
list.add("%" + reason + "%");
//注意,这里对sql中and字符进行分离,防止and出现在不合适的位置
if (name!=null && name.length()>0){
sql.append(" and name like ?");
list.add("%" + name + "%");
name=null;
}
}
//判断"reason"条件是否为空,不为空就添加对应的sql语句
if (name!=null && name.length()>0){
sql.append(" where name like ?");
list.add("%" + name + "%");
}
//对sql语句进行输出,查看是否正确
System.out.println("SQL-> 语句:" +sql);
//对list数组转换为Object数组,便于封装preparedStatement
Object[] objects = list.toArray();
注意:一定要输出sql,防止出现空格缺失等问题,很重要
3.将sql封装成PreparedStatement对象,进行sql查询
PreparedStatement pstm =null;
try {
pstm = connectionn.prepareStatement(sql.toString());
if (resultSet.next())
count = resultSet.getInt("count(1)");
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
BaseDao.closeResource(connectionn,pstm,null);
}
//调用preparedStatement来运行sql语句
for (int i = 0; i < objects.length; i++) {
preparedStatement.setObject(i+1, objects[i]);
}
//返回结果集resultSet,完成查询
ResultSet resultSet = preparedStatement.executeQuery();
4.取出result中的值
以上方法,查询的结果集中需要数据为count(1)
if (resultSet.next())
count = resultSet.getInt("count(1)");