JavaWeb中的多项查询

问题简介:

在做信息查询时,有多项条件可以选择。而其中的选择并不是每个都是必填的,需要根据自己的要求进行查询。

比如:

 

 

 

 

 

 

 用户可以根据自己的需要,可以选择参数进行查询,全部的情况有以下多种

  1. 不需要参数,查询所有
  2. 姓名 + 籍贯 + 邮箱
  3. 姓名 + 籍贯 
  4. 姓名 + 邮箱
  5. 籍贯 + 邮箱
  6. 姓名
  7. 籍贯
  8. 邮箱

如果使用固定的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)的工具类:

 

 

 

posted @ 2019-09-04 10:08  南京的萝卜  阅读(546)  评论(0编辑  收藏  举报