실제로 MyBatis의 강력한 기능 중 하나는 일반적으로 동적 SQL 기능입니다. JDBC 또는 기타 유사한 프레임 워크를 사용한 경험이 있다면 SQL 문자열을 동적으로 연결하는 것이 매우 엉키고 있음을 이해합니다. 목록 끝에서 공백을 잊거나 쉼표를 생략하지 않도록하십시오. mybatis의 동적 SQL은이 통증을 철저히 처리 할 수 있습니다. 동적 SQL의 경우, 가장 간단한 방법은 하드 코딩 할 때 다양한 동적 행동 판단을 제공하는 것입니다. Mybatis에서는 강력한 동적 SQL 언어 가이 상황을 개선하는 데 사용되며 SQL 문의 모든 매핑에 사용할 수 있습니다. 동적 SQL 요소는 JSTL 또는 기타 유사한 XML 기반 텍스트 프로세서를 사용하는 것과 유사합니다. Mybatis는 강력한 OGNL 기반 표현식을 사용하여 다른 요소를 제거합니다.
우리가 일반적으로 사용하는 몇 가지 노드 요소에는 if, 선택 (시기, 그렇지 않으면), 트림 (Wher, IF) 및 Foreach가 포함됩니다. 나는 XSLT의 사용과 비슷하다고 느낍니다 (기사의 뒷부분에서 언급 할 것입니다).
(1) IF 사용
VIISITMAPPER의 Pagination 구성에서 PageIndex> -1 및 Pagesize> -1 인 경우 해당 페이지 매김 SQL이 추가됩니다. 그렇지 않으면 다음과 같이 추가되지 않습니다 (기본값은 모두 가져옵니다).
<select id = "getListByPagenate"ParameterType = "pagEnateArgs"resultType = "Visitater"> select * from (<rucly refid = "getListSql" /> <orderbysql " />) t <!- #{{{{{}는 직접 운영을 수행하지 않음 직접 운영을 수행하지 않습니다. test = "pagestart> -1 및 pagesize> -1"> Limit #{pagestart}, #{pagesize} </if> </if> <sql id = "getListSql"> select * where where where where where where where where </sql> <sql id = "orderbysql"> ordert {ordertidttr} </sql>매개 변수 PageIndex 및 Pagesize는 둘 다 int 값이므로 이와 같은 직접적인 판단을 할 수 있습니다. 객체 인스턴스 인 경우 NULL 판단을 사용하여 동적 논리를 제어 할 수 있습니다. 특정 개발은 비즈니스 요구에 달려 있습니다. 여기에서 작성하기가 쉽지 않다는 점에 주목하는 것이 중요하다고 생각합니다. &&, 이것은 구성에서 인식되지 않을 것입니다 ~.
(2) 선택의 사용 (그렇지 않으면)
여러 조건에서 조건 중 하나만 충족하는 응용 프로그램 시나리오에서 주로 사용되는 경우 선택하십시오. 예를 들어, 다음은 각각 ID, 이름 및 CreateTime을 전달하는 쿼리 조건입니다. 방문자 테이블을 쿼리 할 때 VisitorID에 값이 있으면 ID 쿼리를 사용하고 VisitAname에 값이있는 경우 VisitName 쿼리를 사용한다고 가정하십시오. 다음과 같이, <visitor> getListChoosewHendemo (BasicQueryArgs Args) 메소드를 David.mybatis.demo.ivisitoroperation 인터페이스 클래스에 추가하십시오. VisitorMapper에서 해당 노드 구성을 추가하십시오.
package david.mybatis.demo; import java.util.list; import david.mybatis.model.basicqueryargs; import david.mybatis.model.pagenateargs; import david.mybatis.model.visitor; import david.mybatis.model.withrn; extface ivisouration { /* intface intface infface ivisitoration { /* intface intopface vistoration vistorone 추가 (방문자 방문자); /** 방문자 삭제*/ public int delete (int id); /** 업데이트 방문자*/ public int update (방문자 방문자); /** 쿼리 방문자*/ 공개 방문자 쿼리 (int id); / * * 쿼리 목록 */ public list <visitor> getList (); / * * Pagination Query List */ public list <visitor> getListBypagenate (pagenateargs args); / * * Pagination Query List (rownum 포함) */ public list <visitorwithrn> getListBypagenateWithrn (pagenateArgs args); /** 기본 쿼리*/ 공개 방문자 BasicQuery (int id); / * * 동적 조건 쿼리 (선택,시기) 인스턴스 */ 공개 목록 <visitor> getListChooseWhendemo (BasicQueryArgs Args); / * * 동적 조건 쿼리 (IF, IF) 인스턴스 */ 공개 목록 <Visitor> getListWheredEmo (BasicQueryArgs Args); / * * 동적 쿼리 (foreach) 인스턴스 */ public list <visitor> getListForeachDemo (list <integer> ids); } <? xml version = "1.0"encoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace ="David.dmopatis.dmo.dmo.dmo. 유형 = "visitor"id = "visitorrs"> <id column = "id"propertion = "id" /> <result column = "name"속성 = "이름" /> <결과 열 = "email"propertion = "email" /<result column = "status"속성 = "status" /> <result column = "createTime"속성 = "createTime"/> <sql id = getlists getlists getlists " </sql> <!-조건 중 하나가 충족 될 때 선택-> <select id = "getListChooseWhendemo"resultMap = "visitorrs"parametertype = "BasicQueryArgs"> <포함 refid = "getListSqlConditions"/> <<querystatus> 0 "{querystatus> 0"<querystatus> 0 "> test = "QueryId! = 0"> 및 id = #{queryId} </when> <test = "queryName! = null"> 및 #{QueryName} </elogy> <sytime> = #{QueryTime} </elure> </select> </select> </mapper>와 같은 이름(3) if (trim)의 사용
키워드의 장점은 해당 필터 조건이있는 경우 적절한 시간에 키워드를 삽입하는 것이 좋습니다. 또한 주로 다음 시나리오를 다루는 해당 및 및 또는 커넥터를 제거 할시기를 알고 있습니다.
< "findActiveBlog like ="blog "> blog <if test ="state! = null "> state} </if> <if test ="title! = null "> 및 #{title} </if> <"author! = null 및 author.null! = null "을 선택하십시오. </if> </select>모든 조건의 실패의 결과가되지는 않습니다.
<select id = "findActiveBlog like"resulttype = "blog"> blog where </select>에서 선택 * 선택 *
또는 첫 번째 조건이 충족되지 않기 때문에 후속 조건은 충족됩니다.
<select id = "findActiveBlog like"resultType = "blog"> blog where and title like 'sititle'</select> 선택 * 선택 *
따라서이를 위해 조건 예제를 선택하고 해당 메소드 공개 목록 <visitor> getListWheredemo (BasicQueryArgs Args)를 ivisitorOperation 인터페이스 클래스에 추가하고 다음과 같이 visisormapper 구성 파일에 해당 구성을 추가 할 수 있습니다.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace ="David.dmoplis.dmo.dmo. id = "getListsqlConditions"> select * from visitater < /sql> <!-조건이 충족되면 작업 추가-> <select id = "getListWheredEmo"visiorrs "parameterType ="basicqueryArgs "> include refid ="getListSqlConditions " /<query <querystats"> </if> <if test = "QueryId> 0"> 및 id =####{QueryId} </if> <if test = "QueryName! = null"> 및 이름과 같은 =#{QueryName} </if> <if test = "queryTime! = null"> 및 createTime> =##{QueryTime} </</where> < " prefixoverrides = "및 | 또는"> <if test = "QueryStatus> 0"> 상태> 0 </if> <if test = "QueryId> 0"> 및 id =#{queryId} </if> <test = "queryName! = null"> 및 name like =#{QueryName} </if> <queryTime = "QueryTime! = null"> CreateTime> =#{QueryTime} </if> </trim> -> </select> </mapper>(4) Foreach의 사용
일반적으로 사용되는 Dynamic SQL에는 큰 ID의 ID가있는 비즈니스 시나리오가 있습니다. 이 경우 ID 문자열을 연결하기 위해 열심히 작업하지 않고도 Foreach를 사용할 수 있습니다. 동일한 단계는 해당 메소드를 ivisitoroperation 인터페이스 클래스 공개 목록에 추가하는 것입니다. getListForeachDemo (getListForeachDemo) (list <integer> ids)에 해당 모자 요소 정보를 구성하는 것입니다.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace ="David.dmoplis.dmo.dmo. id = "getListSqlConditions"> SELECT *에서 선택 * </sql> <!-foreach 루프 조건-> <select id = "getListForeachDemo"resultMap = "visitorrs"> <포함 refid = "getListSqlConditions"/> where in index = "index"= "" "", "" "", id index. close = ")"> $ {item} </foreach> </select> </mapper>마지막으로 Demorun에서 해당 테스트 방법 만 설정하면 MyBatis의 동적 SQL이 완료됩니다. 아래 테스트에 사용 된 Demorun 방법
/** Dynamic Query foreach instance*/ public static void getListForeachDemo (list <integer> ids) {sqlsession session = mybatisutils.getSqlsession (); ivisitoroperation voperation = session.getMapper (ivisitorOperation.class); 목록 <visitor> ls = voperation.getListForeachDemo (IDS); for (방문자 방문자 : ls) {system.out.println (방문자); }} /** 인스턴스 인 경우 동적 쿼리 인스턴스* / public static void getListWhereCondition (int id, 문자열 이름, 날짜 createTime) {name = name == ""? NULL : 이름; sqlsession 세션 = mybatisutils.getSqlsession (); BASICQUERYARGS ARGS = NEW BASIC QUERYARGS (ID, 이름, CreateTime); ivisitoroperation voperation = session.getMapper (ivisitorOperation.class); 목록 <visitor> ls = voperation.getListWheredemo (args); if (ls.size () == 0) system.out.println ( "일치하지 않음!"); else {for (방문자 방문자 : ls) {system.out.println (방문자); }}} /** 동적 쿼리 인스턴스* / public static void getListChooseWhendemo (int id, 문자열 이름, 날짜 createTime) {name = name == ""? NULL : 이름; sqlsession 세션 = mybatisutils.getSqlsession (); BASICQUERYARGS ARGS = NEW BASIC QUERYARGS (ID, 이름, CreateTime); ivisitoroperation voperation = session.getMapper (ivisitorOperation.class); 목록 <visitor> ls = voperation.getListChooseWhendemo (args); if (ls.size () == 0) system.out.println ( "일치하지 않음!"); else {for (방문자 방문자 : ls) {system.out.println (방문자); }}}
추신 : Ognl에 대해
Ognl은 객체 그래프 탐색 언어의 약어입니다. 언어 관점에서 : Java 객체의 특성을 얻고 설정하는 데 사용되는 강력한 표현 언어입니다. Java 객체 그래프를 탐색하기 위해 더 높은 추상화 구문을 제공하는 것을 목표로합니다. OGNL에는 다음과 같은 여러 곳에서 응용 프로그램이 있습니다.
GUI 요소 (Textfield, Combobox 등)로 언어를 바인딩하는 객체를 모델링합니다.
Swing의 Tablemodel의 데이터 소스 언어에 대한 데이터베이스 테이블.
웹 구성 요소 및 배경 모델 객체 (Webognl, Tapestry, Webwork, WebObjects)의 바인딩 언어.
자카라타 커먼즈 Beanutils 또는 JSTL Expression Language에 대한보다 표현적인 대안으로.
또한 Java에서 수행 할 수있는 많은 작업이 있으며, 목록 매핑 및 선택과 같이 OGONL을 사용하여 수행 할 수 있습니다. 개발자의 경우 OGNL을 사용하여 간결한 구문을 사용하여 Java 객체의 탐색을 완료 할 수 있습니다. 일반적으로 객체 정보의 탐색은 "경로"를 통해 완료됩니다. 이 "경로"는 get 또는 set 메소드를 직접 사용하지 않고 컬렉션에 인덱싱 된 객체 인 Java Bean의 속성 일 수 있습니다.