자바 에서 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=" "> <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 가 동적 조 회 를 실현 하 는 실례 에 대한 상세 한 설명 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.만약 에 궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 애플리케이션을 모든 SQL 데이터베이스와 연결그래서 오늘 이 기사를 통해 JDBC를 통해 Java 애플리케이션을 SQL 데이터베이스에 연결하기 위해 작성할 수 있는 각 줄을 설명하는 심층 가이드를 제공하여 그들과 모든 커뮤니티를 도우려고 합니다. JDBC는 J...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.