MyBatis 동적 SQL 태그 의 사용법 상세 설명

1.MyBatis 동적 SQL
MyBatis 의 강력 한 특성 중 하 나 는 바로 동적 SQL,즉 SQL 문자열 을 연결 하 는 것 입 니 다.JDBC 나 다른 유사 한 프레임 워 크 를 사용 한 경험 이 있다 면 조건 에 따라 SQL 문 구 를 맞 추 는 것 이 얼마나 고 통 스 러 운 지 알 수 있 을 것 이다.연결 할 때 필요 한 빈 칸 을 잊 지 않도록 해 야 하 며,열 목록 의 마지막 쉼표 를 줄 여야 한다.동적 SQL 이라는 특성 을 이용 하면 이러한 고통 에서 완전히 벗 어 날 수 있다.
일반적으로 동적 SQL 을 사용 하 는 것 은 독립 된 일부분 일 수 없습니다.MyBatis 는 당연히 강력 한 동적 SQL 언어 를 사용 하여 이러한 상황 을 개선 합 니 다.이런 언어 는 임의의 SQL 매 핑 문 에 사용 할 수 있 습 니 다.
동적 SQL 요 소 는 JSTL 이나 XML 기반 텍스트 프로세서 와 비슷 합 니 다.MyBatis 이전 버 전에 서 는 알 아야 할 요소 가 많 았 다.MyBatis 3 는 그것들 을 크게 향상 시 켰 는데,지금 은 원래 의 절반 도 사용 하지 못 하면 된다.MyBatis 는 OGNL 기반 표현 식 을 사용 하여 다른 요 소 를 제거 합 니 다.
2.동적 SQL 태그:if,choose(when,otherwise),trim(where,set),foreach
2.1 if 태그:코드 바로 올 리 기

<select id="queryByIdAndTitle"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE 1=1 
  <if test="id!= null and title!=null">
    AND id=#{id} and title=#{title}
  </if>
</select>
주:if 탭 은 일반적으로 비 어 있 는 인증 에 사 용 됩 니 다.예 를 들 어 id 가 비어 있 으 면 if 탭 의 코드 가 실행 되 지 않 고 반대로 실 행 됩 니 다.
2.2 choose(when,otherwise)태그:코드 직접 올 리 기

<select id="queryBy"
     resultType="Blog">
  SELECT * FROM BLOG WHERE 1=1
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <otherwise>
      AND id= 1
    </otherwise>
  </choose>
</select>
주:choose(when,otherwise)탭 은 switch(case,default)에 해당 합 니 다.예 를 들 어 title 이 비어 있 으 면 when 탭 의 코드 는 실행 되 지 않 습 니 다.otherwise 탭 의 코드 를 기본적으로 실행 합 니 다.
2.3 trim(where,set)태그:코드 를 직접 올 립 니 다.

<select id="queryBy" resultType="com.scme.pojo.User" parameterType="com.scme.pojo.User">
                 select * from user 
                 <where>
                         <if test="username!=null and password!=null">
                             and username=#{username} and password=#{password}
                         </if>
                 </where>
</select>
주:지난번 에 들 어 온 username 을 가정 하면 password 가 비어 있 지 않 으 면 코드 가 실 행 될 수 있 습 니 다!하지만 여러분 은 의문 이 있 을 수 있 습 니 다.실제로 실 행 된 sql 문 구 는 무엇 입 니까?사실,sql 은:select*from user
 where username=? and password=?  여러분,where 태그 가 sql 의 where 키 워드 를 대 체 했 지만 if 의 and 가 없어 진 것 을 발견 하 셨 습 니까?사실 where 탭 은"AND"또는"OR"로 시작 하 는 sql 의"AND"또는"OR"키 워드 를 자동 으로 제거 할 수 있 습 니 다.
만약 where 요소 가 정상 적 인 방식 으로 카드 를 내지 않 았 다 면,우 리 는 사용자 정의 trim 요 소 를 통 해 sql 을 맞 추고 where 태그 의 효 과 를 실현 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다:

<select id="queryBy" resultType="com.scme.pojo.User" parameterType="com.scme.pojo.User">
                 select * from user 
                 <trim prefix="WHERE" prefixOverrides="AND |OR ">
                          <if test="username!=null and password!=null">
                             and username=#{username} and password=#{password}
                         </if>
                </trim>
                 <!--     
          <where>
                         <if test="username!=null and password!=null">
                             and username=#{username} and password=#{password}
                         </if>
                 </where> -->
         </select>
set 태그,코드 는 다음 과 같 습 니 다:

<update id="updateUser" parameterType="com.scme.pojo.User">
                 update user 
                 <set>
                     <if test="username!=null">
                             username=#{username}
                     </if>
                 </set>
                 <where> 
                     <if test="id!=null">
                             id=#{id}
                     </if>
                 </where>
         </update>
주:set 탭 기능 과 where 탭 의 차이 가 많 지 않 습 니 다.set 탭 은 sql 의 set 키 워드 를 대체 합 니 다.set 탭 은 sql 의 남 은 것 을 자동 으로 제거 할 수 있 습 니 다."
마찬가지 로 trim 태그 도 set 태그 의 기능 을 실현 할 수 있 습 니 다.

<update id="updateUser" parameterType="com.scme.pojo.User">
                 update user 
         <trim prefix="set" prefixOverrides=",">
              <if test="username!=null"> username=#{username} </if> 
        </trim>
  
         <where> 
    
            <if test="id!=null"> id=#{id} </if> 
          
        </where>
 </update>
2.4 foreach 태그:foreach 라벨 은 대량 삭 제 를 실현 하고 코드 를 직접 올 립 니 다.

<delete id="batchDelete" parameterType="java.lang.String">
  delete from user
  where id in
  <foreach item="id" index="index" collection="list"
      open="(" separator="," close=")">
        #{id}
  </foreach>
</delete >
주:foreach 라벨 은 모든 대상(예 를 들 어 목록,집합 등)과 그 어떠한 사전 이나 배열 대상 을 foreach 에 집합 매개 변수 로 전달 할 수 있 습 니 다.교체 가능 한 대상 이나 배열 을 사용 할 때 index 는 현재 교체 횟수 이 고 item 의 값 은 이번 교체 에서 얻 은 요소 입 니 다.사전(또는 Map.Entry 대상 의 집합)을 사용 할 때 index 는 키 이 고 item 은 값 입 니 다.collection 탭 은 작성 할 수 있 습 니 다('list','array','map').
foreach 요소 의 속성 은 주로 item,index,collection,open,separator,close 가 있 습 니 다.
item 은 집합 중의 모든 요소 가 교 체 될 때의 별명 을 나타 낸다.
index 는 교체 과정 에서 매번 교체 되 는 위 치 를 나타 내 는 이름 을 지정 합 니 다.
open 은 이 문 구 를 무엇으로 시작 하 는 지 표시 합 니 다.
separator 는 매번 교체 할 때마다 어떤 기 호 를 구분자 로 하 는 지 표시 합 니 다.
close 는 무엇으로 끝 나 는 지 를 나타 낸다.
3.bind
bind 요 소 는 OGNL 표현 식 에서 변 수 를 만 들 고 컨 텍스트 에 연결 할 수 있 습 니 다.예 를 들 면:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>
4.Multi-db vendor support
하나 설정"databaseId'변수의 databaseIdProvider 는 동적 코드 에 사용 할 수 있 습 니 다.그러면 서로 다른 데이터베이스 업 체 에 따라 특정한 문 구 를 구축 할 수 있 습 니 다.예 를 들 어 다음 의 예:

<insert id="insert">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    <if test="_databaseId == 'oracle'">
      select seq_users.nextval from dual
    </if>
    <if test="_databaseId == 'db2'">
      select nextval for seq_users from sysibm.sysdummy1"
    </if>
  </selectKey>
  insert into users values (#{id}, #{name})
</insert>
동적 SQL 에서 삽입 가능 한 스 크 립 트 언어
MyBatis 는 3.2 부터 삽입 가능 한 스 크 립 트 언어 를 지원 하기 때문에 한 언어의 드라이버(language driver)를 삽입 한 후에 이 언어 를 기반 으로 하 는 동적 SQL 조 회 를 쓸 수 있 습 니 다.
다음 인 터 페 이 스 를 실현 하 는 방식 으로 언어 를 삽입 할 수 있 습 니 다.

public interface LanguageDriver {
  ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
  SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
  SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}
사용자 정의 언어 구동 이 있 으 면 my batis-config.xml 파일 에서 기본 언어 로 설정 할 수 있 습 니 다.

<typeAliases>
  <typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
  <setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>
기본 언어 를 설정 하 는 것 외 에 도 특수 한 문장 에 대해 특정한 언어 를 지정 할 수 있 습 니 다.이것 은 다음 과 같은 lang 속성 을 통 해 완성 할 수 있 습 니 다.

<select id="selectBlog" lang="myLanguage">
  SELECT * FROM BLOG
</select>
또는 사용 하고 있 는 맵 에 주석@Lang 을 추가 하여 완성 합 니 다:

public interface Mapper {
  @Lang(MyLanguageDriver.class)
  @Select("SELECT * FROM BLOG")
  List<Blog> selectBlog();
Apache Velocity 를 동적 언어 로 사용 할 수 있 음 을 주의 하 십시오.자세 한 내용 은 MyBatis-Velocity 프로젝트 를 참고 하 십시오.
마 이 바 티 스 동적 SQL 태그 의 사용법 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 마 이 바 티 스 동적 SQL 태그 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기