모든 사람은 기본적으로 mybatis를 사용하여 임의의 SQL을 실행하는 방법을 알고 있습니다. 예를 들어 xxmapper.xml에서 사용 방법은 매우 간단합니다.
<select id = "executeql"resulttype = "map"> $ {_ parameter} </select>다음과 같이 부를 수 있습니다.
sqlsession.selectList ( "executeql", "select *에서 sysuser에서 enabled = 1");
또는 xxmapper.java 인터페이스에서 다음 방법을 정의 할 수 있습니다.
List <map> executesQl (String SQL);
그런 다음 인터페이스를 사용하여 메소드를 호출하십시오.
xxmapper.executesql ( "sysuser에서 enabled = 1");
위의 모든 내용은 이에 근거하여 다음 내용이 약간 더 복잡합니다.
위의 SQL에서 매개 변수 메소드를 사용하여 값을 전달하려는 경우, 즉 enabled = #{enabled}로 작성하십시오. 그러한 요구가 발생하지 않은 경우 왜 이렇게 작성 해야하는지 이해하지 못할 수 있습니다. 예를 들어, 동적 쿼리를 구현하려면 전경에서 SQL을 구성하고 쿼리의 기능을 실현하기 위해 일부 쿼리 조건을 제공 할 수 있습니다 (안전을 위해서는 이러한 구성을 개발하거나 구현해야하며 사용자가 데이터베이스를 직접 작동 할 수 없습니다).
이 기능의 경우 Mybatis로 구현하기가 매우 쉽습니다. SQL 구성을 실행해야합니다. SQL은 위에서 언급 한 방법에서 실행될 수 있습니다. 매개 변수를 제공하는 방법? 매개 변수는 enabled = #{enabled}의 #{enabled} 부분입니다. 더 많은 조건이있는 경우 구성된 SQL은 다음과 같습니다.
enabled = #{enabled} 및 concat ( '%', #{username}, '%')와 같은 username에서 sysuser에서 *를 선택하십시오.이 경우 mybatis를 사용하여 구현하려면 어떻게해야합니까?
먼저 XML은 다음과 같이 수정됩니다.
<select id = "executeql"resulttype = "map"> $ {sql} </select>인터페이스의 메소드는 다음으로 수정됩니다.
List <map> executesQL (맵 맵);
그런 다음 방법을 호출하십시오.
MAP MAP = New HashMap (); // 여기서 SQL은 $ {SQL} map.put ( "SQL", "SELECT * FROM SYSUSER"+ "onabled =#{enabled}"+ "및 ANCITAT와 같은 사용자 이름에 해당합니다 ( '%',#{username}, '%'); 1); //#{username} map.put ( "username", "admin"); // 호출 목록 <map> list = xxmapper.executesql (map) 삽입; // sqlsession 메서드는 sqlsession.selectlist를 호출합니다 ( "executeql", map);이 SQL을 사용하면 사용자에게 조건으로 활성화 및 사용자 이름을 제공 할 수 있습니다. 이 두 조건은 분명히 필요합니다. 선택 사항이라면 어떻게 작성해야합니까?
어쩌면 누군가 mybatis에서 동적 SQL을 사용할 수 있는지, <if> 태그 등을 사용하는지에 대해 생각했을까요?
이 질문에 대답하기 전에 Dynamic SQL을 처리하는 DynamicsQLSource의 코드를 살펴 보겠습니다.
@override public boundsql getBoundsql (Object ParameterObject) {DynamicContext Context = New DynamicContext (구성, ParameterObject); rootsqlNode.Apply (컨텍스트); ? Object.Class : ParameterObject.getClass (); sqlsource sqlsource = sqlsourceparser.parse (context.getSql (), parametertype, context.getBindings ()); boundsql boundsql = sqlsource.getBoundSql (parameterObject); for (map.Entry <string, 객체> 항목 : context.getBindings (). entryset ()) {boundsql.setAdDitionalParameter (Entry.GetKey (), enther.getValue ());} return boundsql;}MyBatis가 동적 SQL을 처리하면 모든 동적 SQL 태그가 SQLNode (rootsqlnode) 객체로 처리되며 $ {}을 포함하는 태그는 TextSqlNode 객체로도 처리됩니다. 위의 방법의 처음 두 줄에서 MyBatis가 동적 SQL을 처리하는 곳입니다.
따라서 $ {sql}의 콘텐츠에 MyBatis가 XML을 SQLNODE 개체에 구문을 가질 때 $ {} 및 <if>, <where>와 같은 중첩 태그가 포함 된 경우 XML <SELECT> 요소에는 $ {SQL} 만 포함되며 $ {SQL} 만 포함됩니다. 런타임 에이 매개 변수 문자열에는 $ {} 및 <if>, <where> 등과 같은 태그가 포함될 수 있지만 MyBatis 구문 분석 후에 발생합니다. 따라서 이러한 내용이 문자열의 일부로 나타나면 특별히 처리되지 않습니다. 그것들은 SQL의 일부일 뿐이며, 데이터베이스가 그것을 인식하지 못하고 오류를보고 할 수 있기 때문에 (데이터베이스가 오류를보고하기 때문에) 출력입니다. 따라서 mybatis와 함께 제공되는 방법을 통해 동적 SQL을 쓸 수 없습니다.
힌트
위 코드에서 :
sqlsourceparser.parse (context.getSql (), parametertype, context.getBindings ());
이 코드는 동적 SQL 처리 후 동적 매개 변수 (#{})를 처리하므로 이러한 유형의 매개 변수는 SQL에서 사용할 수 있습니다.
mybatis 동적 SQL 메소드를 사용할 수 없으므로 동적 SQL을 구현하는 방법은 무엇입니까?
여기 간단한 아이디어가 있습니다. SQL에서 템플릿 마크 업 언어를 사용하여 동적 SQL (예 : 프리 마커)을 구현하십시오. SQL을 실행하기 위해 MyBatis에 양도되기 전에 템플릿을 사용하여 SQL을 처리하여 최종 실행 된 SQL을 생성하고 ( #{} 매개 변수를 처리하지 않아야 함),이 SQL을 MyBatis에 실행하려면 Execution.
프리 마커 템플릿의 예를 들어보고 위의 SQL은 다음을 기반으로합니다.
sysuser에서 *를 선택하십시오. && username! = ''> 및 concat ( '%',#{username}, '%')와 같은 사용자 이름 </#if>여기 <#if>는 프리 마커의 요소입니다. SQL 주입을 고려하지 않고 위의 SQL도 다음과 같이 기록 할 수 있습니다.
sysuser에서 *를 선택하십시오. && username! = ''> 및 '%$ {username}%'</#if>와 같은 사용자 이름프리 마커도 $ {username}을 처리하고 여기서 매개 변수를 실제 값으로 바꾸기 때문에 차이는 '%$ {username}%'입니다.
앞서 불리는 코드에서 수정은 다음과 같습니다.
//# {{{userName} map.put ( "username", "admin"); // 여기 SQL은 XML SQL의 $ {sql} 문자열에 해당합니다. MAP); // 처리 된 SQL을 맵 맵에 넣습니다 ( "SQL", "SELECT * FROM SYSUSER"+ "here = #{enabled}"+ "및 username with concat ( '%', #{username}, '%'); // execute method list = xxmapper.executesql (map);참고 : ProcessSQLBYFREEMARKER 방법은 맵의 데이터를 기반으로 SQL 문자열을 처리하는 것이며 구현 방법을 직접 검색 할 수 있습니다.
이 시점에서, 그다지 복잡하지 않은 동적 SQL 기능이 구현됩니다.
더 욕심 많은 사람들이 있는지 궁금합니다. 위의 반환 된 값이 모두 <map> 유형이라고 생각하십니까? 지정된 엔티티 클래스를 반환 할 수 있습니까?
예를 들어지도에서 :
map.put ( "class", "tk.mybatis.model.sysuser");
반환 값을 이런 식으로 Sysuser 유형으로 만들 수 있습니까? 이 기사가 너무 오래 걸렸으므로 심도 있지 않은 솔루션을 제공 할 것입니다.
인터셉터를 사용하여 구현할 수 있습니다. 매핑 스테이트를 얻은 후 사본을 복사 한 다음 resultMap에서 resultMap의 유형 속성을 수정하여 클래스 유형을 지정하십시오. 말하기는 쉽지만 실제 작동에서는 PageHelper 페이징 플러그인의 약 1/10을 가질 수 있습니다.
이 기사는 아내의 요청에 따라 작성되었으므로 아내가 마지막으로 필요하다면 아내 가이 플러그인을 구현 한 다음 공유하는 데 도움이 될 것입니다.
참고 : 동적 업데이트, 삽입, 삭제 명령문 인 경우 위의 <select>를 변경하여 업데이트 (<delete> 및 <insert>를 사용할 필요가 없음)를 변경하고 선택보다 훨씬 쉬운 리턴 값에 int를 사용할 수 있습니다.
위는 편집자가 소개 한 Mybatis Execution Dynamic SQL 문에 대한 자세한 설명입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!