JavaWeb中的多项查询
问题简介:
在做信息查询时,有多项条件可以选择。而其中的选择并不是每个都是必填的,需要根据自己的要求进行查询。
比如:
用户可以根据自己的需要,可以选择参数进行查询,全部的情况有以下多种
- 不需要参数,查询所有
- 姓名 + 籍贯 + 邮箱
- 姓名 + 籍贯
- 姓名 + 邮箱
- 籍贯 + 邮箱
- 姓名
- 籍贯
- 邮箱
如果使用固定的sql语句,将要使用8条不同的sql语句。而且要进行字符输入的判断,sql语句和判断语句在一起将出现很长的代码,不美观不已阅读。
解决办法:
思考:
- sql是变化的,因此想到使用StringBuilder。StringBuilder对字符串进行拼接‘
- 也要判断用户的输入,根据不同的输入进行不同的sql拼接
- 为了防止sql注入的问题,使用PreparedStatement的sql执行对象来执行sql
- 在拼接时需要记住拼接参数的顺序(姓名 + 籍贯 名字在前,籍贯在后),为了给sql的?赋值,使用list集合把参数存起来。
代码实现:
public class UserDao {
/**
* 根据参数来查询用户信息
* @param 姓名
* @param 籍贯
* @param 邮箱
* @return User对象
*/
public static User queryUser(String name, String address, String email){
// 1.处理sql
// 1.1判断用户输入的参数,并拼接sql语句
StringBuilder sql = new StringBuilder("select * from user where 1 = 1 "); // 1 = 1 是为了,不输入参数查询所有
List<String> list = new ArrayList<>()
if (name != null && !name.trim().isEmpty()) {
sql.append("and name = ? ");
list.add(name);
}
if (address != null && !address.trim().isEmpty()){
sql.append("and address = ? ");
list.add(address);
}
if (email != null && !email.trim().isEmpty() ) {
sql.append(and email = ?);
list.add(email);
}
sql.append(";");
// 2.操作数据库(使用的是Druid数据库连接池,写了自己的工具类,)
Connection conn = null;
PreparedStatment pstmt = null;
ResultSet rs =null;
User user = null;
try {
// 2.1获取数据连接对象
conn = JDBCUtil.getConnection();
// 2.2获取sql执行对象
pstmt = conn.prepareStatement(sql.toString());
// 2.3设置sql中的?的值
for (int i = 1; i <= list.size(); i++) {
pstmt.setString(i, list.get(i - 1));
}
// 2.4执行sql语句
rs = pstmt.executeQuery();
user = resultSetToUser(rs); // resultSetToUser()是自己写的从结果集到user对象转换的方法
} catch (省略) {
省略
} finally {
JDBCUtil.close(conn, pstmt, rs);
}
return user;
}
}
数据库连接池(Druid)的工具类: