자바 에서 JDBC 가 동적 조 회 를 실현 하 는 실례 상세 설명

8381 단어 jdbc동적 조회
개술
1.동적 조회 란 무엇 입 니까?
여러 개의 조회 조건 에서 무 작위 로 여러 개의 조합 을 하나의 DQL 문 구 를 선택 하여 조회 하 는데 이 과정 을 동적 조회 라 고 한다.
2.동적 조회 의 난점
선택 할 수 있 는 조회 조건 이 많 고 조합 상황 이 많아 일일이 열거 하기 어렵다.
3.최종 검색 어의 구성
사용자 가 조회 조건 에 데 이 터 를 입력 하면 이 조회 조건 은 최종 조건 의 일부분 이 된다.
이 기본 원리
1.SQL 기본 프레임 워 크
조회 조건 이 어떻든 간 에 조회 필드 와 데이터 베 이 스 는 고정 적 으로 변 하지 않 는 다.이런 고정 적 이 고 변 하지 않 는 내용 은 SQL 문장의 기본 구 조 를 구성한다.예 를 들 어

select column... from table。
2.StringBuilder 형성 DQL
폼 입력 을 가 져 옵 니 다.요청 매개 변수 가 비어 있 지 않 으 면 이 요청 매개 변수 에 따라 조회 조건 을 생 성 합 니 다.예 를 들 어"name=?","age>?”,검색 조건 을 기본 프레임 워 크 에 추가 합 니 다.StringBuilder 를 이용 하여 조회 조건 을 추가 합 니 다.이 때 문제 가 발생 했 습 니 다.생 성 된 조회 조건 에'and'를 추가 해 야 하 는 지 어떻게 판단 합 니까?
이 조회 조건 이 첫 번 째 조회 조건 이 라면"and"를 추가 할 필요 가 없습니다.그렇지 않 으 면"and"를 추가 해 야 합 니 다.문제 가 복잡 해 지면 서 매번 조회 조건 이 생 성 될 때마다 앞 에 조회 조건 이 있 는 지 판단 해 야 한다.
우 리 는 SQL 기본 프레임 워 크 에 조회 조건 을 추가 하 는 것 을 고려 할 수 있 습 니 다.이 조회 조건 의 존 재 는 조회 결과 에 영향 을 주지 않 고 차지 하 는 역할 만 하 며 동적 으로 조회 조건 을 추가 할 때'and'를 추가 해 야 하 는 지 여 부 를 판단 할 수 있 습 니 다.이러한 요구 에 따라 이 조회 조건 은 반드시 진실 이 어야 한다.여기 서 우 리 는'1=1'을 취하 면 SQL 기본 프레임 워 크 가 된다.

select column...from table where 1=1
모든 동적 조회 조건 전단 에"and"를 추가 합 니 다.
3.List 집합 은 자리 표시 자 할당 값 입 니 다.
DQL 문구 가 생 겼 으 니 자리 표시 자 에 값 을 부여 하 는 방법 을 고려 해 야 합 니 다.조회 조건 을 생 성 하 는 동시에 자리 표시 자 에 대응 하 는 매개 변 수 를 수집 하여 질서 있 는 집합 에 저장 할 수 있 습 니 다.여기 서 List 집합 을 선택 하면 자리 표시 자 는 List 집합 중의 요소 와 순서 적 인 대응 관 계 를 형성 하고 n 번 째 자리 표시 자 는 n 번 째 요소 에 대응 하 며 집합 을 옮 겨 다 니 면 자리 표시 자 에 값 을 부여 할 수 있 습 니 다.
자리 표시 자 에 값 을 부여 할 때 데 이 터 를 자리 표시 자 에 전달 해 야 할 뿐만 아니 라 필드 와 일치 하 는 데이터 형식 도 선택해 야 합 니 다.List 집합 은 데이터 만 저장 하 는 것 으로 요 구 를 만족 시 킬 수 없 으 며 필드 정 보 를 추가 하여 서로 다른 필드 를 구분 하고 서로 다른 데이터 형식 을 선택해 야 합 니 다.이 집합 에 있 는 요 소 는"column+data"형식 을 사용 합 니 다.
삼 데모
1.데이터베이스
2.페이지

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
span {
  display: inline-block;
  width: 75px;
  margin-bottom: 15px;
}
</style>
<title>    </title>
</head>
<body>
  <form action="http://localhost:8080/JavaSETest/dynamicQueryServlet">
    <div>
      <span>  :</span><input type="text" name="name">
    </div>
    <div>
      <span>  :</span><input type="text" name="sex">
    </div>
    <div>
      <span>  :</span><input type="text" name="age">
    </div>
    <div>
      <span>    :</span><input type="text" name="depNo">
    </div>
    <div>
      <input type="submit"value="  ">&nbsp;<input type="reset"value="  ">
    </div>
  </form>
</body>
</html>
3.서버 쪽(Servlet)

package com.javase.jdbc;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/dynamicQueryServlet")
public class DynamicQueryServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    //       
    String name = request.getParameter("name");
    String sex = request.getParameter("sex");
    String age = request.getParameter("age");
    String depNo = request.getParameter("depNo");
    //    "where 1=1",                    and,       and
    String baseSQL = "select name,sex,age,depNo from tb_employee where 1=1";
    StringBuilder builder = new StringBuilder();//     SQL  
    //                 ,                   ,  name     SQL      ,name     
    //       。
    List<String> params = new ArrayList<String>();
    builder.append(baseSQL);
    if (isNotEmpty(name)) {
      builder.append(" and name=? ");
      params.add("name," + name);//               ,       ,               
    }
    if (isNotEmpty(sex)) {
      builder.append(" and sex=? ");
      params.add("sex," + sex);
    }
    if (isNotEmpty(age)) {
      builder.append(" and age=? ");
      params.add("age," + age);
    }
    if (isNotEmpty(depNo)) {
      builder.append(" and depNo=?");
      params.add("depNo," + depNo);
    }
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet res = null;
    StringBuilder resStr = new StringBuilder();
    try {
      conn = getConnection();
      ps = conn.prepareStatement(builder.toString());
      for (int i = 0; i < params.size(); i++) {
        String str = params.get(i);
        String[] arr = str.split(",");//arr[0]      ,      ;arr[1]    ,        
        //          ,              ,        
        if (arr[0].equals("age")) {
          int a = Integer.parseInt(arr[1]);
          ps.setInt(i + 1, a);
        } else {
          ps.setString(i + 1, arr[1]);
        }
      }
      res = ps.executeQuery();
      while (res.next()) {
        String targetName = res.getString("name");
        String targetSex = res.getString("sex");
        int targetAge = res.getInt("age");
        String targetDepNo = res.getString("depNo");
        String temp = "name=" + targetName + "--" + "sex=" + targetSex + "--" + "age=" + targetAge + "--"
            + "depNo=" + targetDepNo;
        resStr.append(temp + "<br>");
      }
    } catch (ClassNotFoundException | SQLException e) {
      e.printStackTrace();
    } finally {
      if (res != null)
        try {
          res.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      if (ps != null)
        try {
          ps.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      if (conn != null)
        try {
          conn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
    }
    PrintWriter out = response.getWriter();
    int length = resStr.length();
    if (length == 0)
      out.write("    ");
    else
      out.write(builder.toString() + "<br>" + resStr.toString());
  }
  /**
   *           ,       
   * 
   * @param str
   * @return
   */
  private boolean isNotEmpty(String str) {
    if (str == null | str.equals("")) {
      return false;
    }
    return true;
  }
  public static Connection getConnection() throws ClassNotFoundException, SQLException {
    Class.forName("com.mysql.jdbc.Driver");
    return DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123");
  }
}
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 자바 에서 JDBC 가 동적 조 회 를 실현 하 는 실례 에 대한 상세 한 설명 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.만약 에 궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기