JDBC는 동적 쿼리를 어떻게 구현합니까?

零下一度
풀어 주다: 2017-07-21 14:12:56
원래의
1084명이 탐색했습니다.

네트워크 개발에서는 이러한 비즈니스 요구 사항을 처리하기 위해 일반적으로 다음과 같은 방법을 사용하여 여러 조건을 포함하는 포괄적인 쿼리를 수행합니다.
1 매개변수 값을 SQL 문에 직접 연결합니다. 그런 다음 쿼리하십시오.
이 방법의 보안은 상대적으로 열악하며 실수로 SQL에 의해 주입될 수 있습니다. 매개변수 값에서 특수 문자를 먼저 필터링할 수 있지만 항상 매우 우아한 느낌을 주는 것은 아닙니다.
2. 자리 표시자를 먼저 사용하시겠습니까? '라는 SQL을 스플라이싱한 후, 조건부 판단을 통해 preparedStatement를 작성합니다.
이런 방식으로 TX를 사용해 본 사람이라면 누구나 이 방법의 복잡성을 알고 있을 것입니다. SQL을 작성하려고 할 때 먼저 판단을 하고, PST를 작성할 때 다시 판단을 해야 하는 번거로움이 있습니다.
3. 프로시저 스토리지
저는 항상 저장 프로시저에 만족하지 않았습니다. 한 번은 프로젝트를 MySQL에서 MSSQL로 마이그레이션한 후 결국에는 다른 버전의 제품이 다른 데이터베이스에서 실행될 뻔했습니다. 시간. .
사실 제가 하고 싶은 말은 비교적 우아하고 간단한 쿼리 방법을 원한다는 것 뿐입니다. 이전 문단에서 .NET에서 제공하는 SQLHelper에 영감을 받아 이렇게 비슷한 컴포넌트를 작성했습니다(실제로 구글링해서 찾아봤습니다). 30분 동안 요구 사항을 충족하는 기반이 발견되지 않았습니다.

1. 동적 쿼리란 무엇입니까?

여러 쿼리 조건을 무작위로 선택하여 쿼리용 DQL 문을 구성합니다. 2. 동적 쿼리의 어려움

선택할 수 있는 쿼리 조건도 많고, 조합도 많아 다 나열하기는 어렵습니다.

3. 최종 쿼리문의 구성

사용자가 쿼리 조건 데이터를 입력하면 쿼리 조건이 최종 조건의 일부가 됩니다.

두 가지 기본 원칙

1 SQL 기본 프레임워크

쿼리 조건에 관계없이 쿼리 필드와 데이터베이스는 고정되어 있으며 변경된 내용은

select column... from table。
로그인 후 복사
2와 같은 SQL 문의 기본 프레임워크를 형성하여 요청이 있는 경우 DQL

을 구성합니다. 매개변수가 비어 있지 않으면 "name=?", "age>?"와 같은 요청 매개변수를 기반으로 쿼리 조건이 생성됩니다. 이때 쿼리 조건을

기본 프레임워크에 추가합니다. 시간이 지나면 생성된 쿼리 조건에 "and"를 추가해야 하는지 어떻게 판단할 수 있나요?

이 쿼리 조건이 첫 번째 쿼리 조건이면 "and"를 추가할 필요가 없습니다. 그렇지 않으면 문제가 됩니다. 복잡합니다. 쿼리 조건을 생성할 때마다 이전 쿼리 조건
이 존재하는지 확인해야 합니다. 이 쿼리 조건의 존재는 쿼리에 영향을 미치지 않습니다. 쿼리 조건을 추가할 때 "and"를 추가해야 하는지 여부를 동적으로 결정하지 않기 위한 자리 표시자 역할만 합니다. 이러한 요구 사항에 따르면 이 쿼리 조건은 항상 "1=1"이어야 하며 기본은 다음과 같습니다. SQL 프레임워크는

select column...from table where 1=1
로그인 후 복사
각 동적 쿼리 조건 앞에 "and"를 추가합니다 3. .List 컬렉션은 자리 표시자에 값을 할당합니다

DQL 문을 사용하면 다음을 수행해야 합니다. 자리 표시자에 값을 할당하는 방법을 고려하여 자리 표시자에 해당하는 매개 변수를 수집하고 쿼리 조건을 생성하는 동안 여기에 저장할 수 있으므로 자리 표시자가 순차적으로 구성됩니다. n번째 자리 표시자는 n번째 요소에 해당합니다.

자리 표시자에 값을 할당할 때 데이터를 자리 표시자에 전달해야 할 뿐만 아니라 또한 필드와 일치하는 데이터 유형을 선택해야 합니다. 목록 컬렉션은 더 이상 데이터를 저장하는 것만으로는 요구 사항을 충족할 수 없습니다. 여기에서 다양한 필드를 구별하고 다른 데이터 유형을 선택하려면 필드 정보를 추가해야 합니다. "열+데이터" 형식입니다.

세 가지 데모1. 데이터베이스
2.

3.服务器端(Servlet)

"/dynamicQueryServlet"  DynamicQueryServlet     serialVersionUID = 1L "text/html;charset=UTF-8"String name = request.getParameter("name"= request.getParameter("sex"= request.getParameter("age"= request.getParameter("depNo"String baseSQL = "select name,sex,age,depNo from tb_employee where 1=1"=  StringBuilder();List<String> params =  ArrayList<String>" and name=? ""name," + name);" and sex=? ""sex," +" and age=? ""age," +" and depNo=?""depNo," += = = = == ( i = 0; i < params.size(); i++== str.split(","); (arr[0].equals("age" a = Integer.parseInt(arr[1+ 1+ 1, arr[1== res.getString("name"= res.getString("sex" targetAge = res.getInt("age"= res.getString("depNo"= "name=" + targetName + "--" + "sex=" + targetSex + "--" + "age=" + targetAge + "--"
                        + "depNo=" ++ "<br>" (ClassNotFoundException | (res !=  (ps !=  (conn != = length = (length == 0"查询为空"+ "<br>" +   (str ==  | str.equals(""    Connection getConnection() "com.mysql.jdbc.Driver" DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123"
로그인 후 복사

위 내용은 JDBC는 동적 쿼리를 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!