나는 ORM 프레임 워크 Mybatis를 사용해 왔으며 Mybatis에서 몇 가지 일반적인 기능을 사용했습니다. 오늘날 프로젝트 개발에는 특정 테이블의 필드 쿼리에서 사용자를 제한 해야하는 비즈니스가 있으며 특정 테이블의 특정 필드와 같은 특정 필드가 표시되는지 여부는 사용자가 쿼리 할 수 없습니다. 이 경우 테이블 이름과 필드 이름을 동적으로 전달하려면 SQL을 빌드해야합니다. 이제 솔루션을 요약하겠습니다. 같은 문제를 겪는 파트너에게 도움이되기를 바랍니다.
Dynamic SQL은 Mybatis의 강력한 특징 중 하나입니다. SQL 문을 사전 컴파일하기 전에 MyBatis는 SQL을 동적으로 구문 분석하고 바운드 QL 객체로 구문 분석하며 여기에서 처리됩니다. 먼저 mybatis에서 #{} 및 $ {}의 사용에 익숙해 봅시다.
동적 SQL 파싱 프로세스에서 #{} 및 $ {}의 효과는 다릅니다.
#{} JDBC 사전 컴파일 된 문의 매개 변수 마커로 구문 분석되었습니다.
다음 SQL 문에 표시된대로
이름 = #{name};다음과 같이 구문 분석됩니다.
선택 *에서 name =?;
#{}가 매개 변수 자리 표시 자로 구문 분석되는 것을 볼 수 있습니까? .
$ {}는 순수한 문자열 교체품입니다. 가변 교체는 다음 SQL 문과 같은 동적 SQL 구문 분석 단계에서 수행됩니다.
사용자 중에서 * name = $ {name}을 선택하십시오."Sprite"매개 변수를 전달하면 SQL은 다음과 같이 구문 분석됩니다.
이름 = "Sprite"를 선택하여 * 선택하십시오.
사전 컴파일 전에 SQL 문에는 더 이상 변수 이름이 포함되어 있지 않음을 알 수 있습니다.
요약하면, $ {} 변수의 교체 단계는 동적 SQL 구문 분석 단계에 있으며, #{} 변수의 교체는 DBMS에 있습니다.
#{}과 $ {}의 차이는 다음과 같이 요약 될 수 있습니다.
#{} 전달 된 매개 변수를 문자열로 취급하고 전달 된 매개 변수에 이중 견적을 추가합니다.
$ {}은 전달 된 매개 변수를 SQL에 직접 표시하며 인용문이 추가되지 않습니다.
#{}는 청두에서 SQL 주입을 방지 할 수 있지만 $ {}는 SQL 주입을 방지 할 수 없습니다.
$ {}는 사전 컴파일 전에 변수로 대체되어 SQL 주입의 위험이 있습니다. 다음과 같이 SQL
* $ {tableName}에서 * select where name = $ {name}전달 된 매개 변수 Tablemename이 사용자 인 경우; 사용자 삭제; -그런 다음 SQL 동적 파싱 후 사전 컴파일 전의 SQL이됩니다.
*에서 *를 선택하십시오. 사용자 삭제; - 여기서 이름 =?;
-후속 진술은 의견으로 작동하지 않을 것이며 친구와 나는 기절했습니다! ! ! 원래 쿼리 문에는 실제로 테이블 데이터를 삭제하는 SQL이 비밀리에 포함되어 있음을 알 수 있습니까? 삭제, 삭제, 삭제! ! ! 나는 중요한 말을 세 번 말했고,이 위험이 얼마나 큰지 상상할 수 있습니다.
$ {}는 일반적으로 데이터베이스의 테이블 이름, 필드 이름 등을 전송하는 데 사용됩니다.
#{}를 사용할 수있는 $ {}를 사용하지 마십시오.
위의 분석을 통해 주제로 이동하여 테이블 이름과 필드 이름을 동적으로 호출하는 방법에 대한 아이디어가있을 수 있습니다. 예는 다음과 같습니다.
<Select id = "getUser"resulttype = "java.util.map"parametertype = "java.lang.string"statementtype = "state"> select $ {columns} $ {tableName}} here_remark = $ {company} </select>동적 통화 테이블 이름과 필드 이름을 구현하려면 사전 컴파일을 사용할 수 없습니다. StateType = "Statement" "를 추가해야합니다.
StateGype : MyBatis에게 각각 진술, 준비된 상태 또는 호출 회의를 사용하도록 지시하는 모든 명령문 (비 컴파일). 기본값 : 준비. 분명히 여기에서 사전 컴파일을 사용할 수 없으므로 비 컴파일로 변경해야합니다.
둘째, SQL의 변수 값은 #{xxx}가 아닌 $ {xxx}입니다.
$ {}은 전달 된 매개 변수를 직접 표시하여 SQL을 생성하는 것입니다. 예를 들어 $ {xxx}에 전달되는 매개 변수는 문자열 데이터이며, 매개 변수가 전달되기 전에 다음과 같은 인용 표시가 추가되어야합니다.
문자열 이름 = "sprite"; name = " '" + name + "'";
요약
위는 Mybatis 동적 통화 테이블 이름과 편집자가 소개 한 필드 이름에 대한 솔루션입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!
이 기사는 http://www.yuanrengu.com/index.php/mybatis1021.html에서 재현됩니다