>Java >java지도 시간 >mybatis 동적 SQL 사용법 알아보기

mybatis 동적 SQL 사용법 알아보기

巴扎黑
巴扎黑원래의
2017-07-20 09:47:101451검색

MyBatis의 강력한 기능 중 하나는 동적 SQL입니다.

JDBC 또는 기타 유사한 프레임워크를 사용해 본 경험이 있다면 서로 다른 조건에 따라 SQL 문을 연결하는 것이 얼마나 고통스러운지 이해하게 될 것입니다. 접합 시 필요한 공백을 잊지 않도록 주의하고, 열 목록 끝에 쉼표를 생략하도록 주의하세요. 이러한 어려움을 완전히 없애려면 동적 SQL 기능을 활용하십시오.

일반적으로 동적 SQL을 사용하는 것은 독립적인 부분이 될 수 없습니다. MyBatis는 확실히 이러한 상황을 개선하기 위해 강력한 동적 SQL 언어를 사용합니다.

동적 SQL 요소는 JSTL 또는 기타 유사한 XML 기반 텍스트 프로세서를 사용하는 것과 유사합니다. 이전 버전의 MyBatis에서는 이해해야 할 요소가 많았습니다. MyBatis 3에서는 이러한 기능이 크게 향상되어 이제 원래 요소의 절반 미만을 사용할 수 있습니다. MyBatis는 강력한 OGNL 기반 표현식을 사용하여 다른 요소를 제거합니다.

Mybatis의 동적 SQL 문은 OGNL 표현식을 기반으로 합니다. 일반적으로 mybatis 동적 SQL 문에는 다음과 같은 범주가 포함됩니다.

1. if 문(단순 조건 판단)
2. 선택(when, otherwize) java 언어는 jstl에서 선택하는 것과 매우 유사합니다.
3. 트림(포함된 내용에 접두사, 접미사 등을 추가)
4. where(주로 SQL 문에서 where를 단순화하는 데 사용됨) , 지능적으로 처리할 수 있으며 중복 구문 오류에 대해 걱정할 필요가 없습니다.)
5. set(주로 업데이트에 사용됨)
6. foreach(특히 명령문 쿼리에서 mybatis를 구현할 때 유용함)
처리 방법은 다음과 같습니다.

1.mybaits if 문 처리

<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">select * from t_blog where 1 = 1
        <if test="title != null">and title = #{title}</if>
        <if test="content != null">and content = #{content}</if>
        <if test="owner != null">and owner = #{owner}</if>
    </select>

이 문의 의미는 매우 간단합니다. 제목 매개변수를 제공하는 경우에도 마찬가지로 title=#{title }을 충족해야 합니다. Content 및 Owner를 제공하는 경우 해당 조건을 충족해야 하며 이러한 조건을 충족하는 모든 블로그를 반환해야 합니다. 이는 과거에는 다른 유형의 프레임워크를 사용하거나 JDBC를 직접 사용하는 경우도 있습니다. 동일한 선택 효과를 얻으려면 SQL 문을 자세히 설명해야 하는데, 이는 매우 번거로운 작업입니다. 이에 비해 위의 동적 SQL은 훨씬 간단합니다. Java 언어로 전환하는 것과 같습니다 요소는 조건이 충족되면 내용이 출력됩니다. 조건이 충족되면 선택이 튀어 나오는 JAVA의 스위치와 유사합니다. all when 및 else 조건. 하나만 출력되고, 모든 조건이 충족되지 않으면 나머지의 내용이 출력됩니다. 따라서 위 명령문의 의미는 매우 간단합니다. title!=null이면 출력 및 titlte = #{title}이며, title이 비어 있고 content!=null이면 출력 및 content = #{content입니다. }, 모든 조건이 충족되지 않으면 그렇지 않은 경우의 내용이 출력됩니다.

3.trim (포함된 내용에 접두사, 접미사 등을 추가, 접두사, 접미사)

<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">select * from t_blog where 1 = 1 
        <choose>
            <when test="title != null">and title = #{title}</when>
            <when test="content != null">and content = #{content}</when>
            <otherwise>and owner = "owner1"
            </otherwise>
        </choose>
    </select>

트림 요소의 주요 기능은 앞에 일정량을 추가하는 것입니다. 일부 접두사는 일부 접미사 뒤에 추가될 수 있으며 해당 속성은 접두사 및 접미사입니다. 포함된 콘텐츠의 헤더에 있는 일부 콘텐츠는 덮어쓸 수 있습니다. 즉, 꼬리의 일부 콘텐츠는 무시될 수 있습니다. 또한 속성은 prefixOverrides 및 suffixOverrides입니다.

4. where(주로 SQL 문에서 where 조건을 쉽게 판단하는 데 사용되며 및/또는 조건을 지능적으로 처리할 수 있습니다.

    <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">select * from t_blog <trim prefix="where" prefixOverrides="and |or">
            <if test="title != null">title = #{title}</if>
            <if test="content != null">and content = #{content}</if>
            <if test="owner != null">or owner = #{owner}</if>
        </trim>
    </select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:


 ...

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

 

where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。

5.set (主要用于更新时)

   <update id="dynamicSetTest" parameterType="Blog">update t_blog<set>
            <if test="title != null">title = #{title},</if>
            <if test="content != null">content = #{content},</if>
            <if test="owner != null">owner = #{owner}</if>
        </set>where id = #{id}</update>

set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。

6. foreach (在实现 mybatis in 语句查询时特别有用) 
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

  1.1.单参数List的类型

<select id="dynamicForeachTest" resultType="Blog">select * from t_blog where id in<foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

 

  上述collection的值为list,对应的Mapper是这样的:  public List dynamicForeachTest(List ids); 

  2.数组类型的参数

  

<select id="dynamicForeach2Test" resultType="Blog">select * from t_blog where id in<foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

  对应的Mapper:   public List dynamicForeach2Test(int[] ids); 

  3.Map 类型的参数

<select id="dynamicForeach3Test" resultType="Blog">select * from t_blog where title like "%"#{title}"%" and id in<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

  对应的Mapper:    public List dynamicForeach3Test(Map params);

 

위 내용은 mybatis 동적 SQL 사용법 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.