>  기사  >  데이터 베이스  >  MyBatis 동적 SQL 알아보기

MyBatis 동적 SQL 알아보기

coldplay.xixi
coldplay.xixi앞으로
2020-12-09 17:46:132751검색

sql tutorialSQL의 강력한 기능 소개 MyBatis SQL

MyBatis 동적 SQL 알아보기

권장(무료): sql tutorial

Dynamic SQL

MyBatis의 강력한 기능 중 하나는 동적 SQL입니다. JDBC 또는 기타 유사한 프레임워크를 사용해 본 경험이 있다면 다양한 조건에 따라 SQL 문을 연결하는 데 따른 어려움을 이해하게 될 것입니다. 예를 들어, 스플라이스할 때 필요한 공백을 추가하는 것을 잊지 않도록 주의하고, 목록의 마지막 열 이름에서 쉼표를 제거하도록 주의하십시오. 이러한 어려움을 완전히 없애려면 동적 SQL 기능을 활용하십시오.

과거에는 동적 SQL을 사용하는 것이 쉽지 않았지만 마이바티스는 어떤 SQL 매핑 문에서도 사용할 수 있는 강력한 동적 SQL 언어를 제공하여 이러한 상황을 개선했습니다.

동적 SQL 요소는 JSTL 또는 XML 기반 텍스트 프로세서와 유사합니다. 이전 버전의 MyBatis에서는 이해하는 데 시간이 걸리는 요소가 많았습니다. MyBatis 3에서는 요소 유형이 크게 단순화되었습니다. 이제 원래 요소의 절반만 배우면 됩니다. MyBatis는 강력한 OGNL 기반 표현식을 사용하여 대부분의 다른 요소를 제거합니다.

준비

먼저 User 엔터티 클래스를 생성합니다

public class User {
    private Integer id;
    private String username;
    private String userEmail;
    private String userCity;
    private Integer age;}

사용자 테이블을 생성합니다

CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(255) DEFAULT NULL,
    user_email varchar(255) DEFAULT NULL,
    user_city varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
  PRIMARY KEY (id))

if

인터페이스 메소드 정의

public List<User> findByUser(User user);

해당 Mapper.xml 인터페이스 정의는 다음과 같습니다

<select id="findByUser" resultType="com.example.mybatis.entity.User">
    select
    id, username, user_email userEmail, user_city userCity, age
    from user
    where    <if test="username != null and username != &#39;&#39;">
        username = #{username}    </if>
    <if test="userEmail != null and userEmail != &#39;&#39;">
        and user_email = #{userEmail}    </if>
    <if test="userCity != null and userCity != &#39;&#39;">
        and user_city = #{userCity}    </if></select>

if 태그 테스트가 true이면 if 태그의 SQL 문이 연결됩니다.

username, userEmail, userCity가 비어 있지 않으면 아래와 같이 SQL이 splicing됩니다

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ? and user_email = ? and user_city = ?

username만 비어 있지 않으면 SQL이 다음과 같이 splicing됩니다

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ?

하지만 이 방법의 문제 단점, 현재 사용자 이름이 비어 있다고 가정하면 userEmail과 userCity 모두 비어 있지 않습니다.

동적 SQL 코드를 분석해 보겠습니다. username에 할당된 값이 없습니다. 즉, username==null이므로 "username=#{username}" 코드는 SQL 문에 추가되지 않습니다. ​동적 SQL은 다음과 같습니다:

select id, username, user_email userEmail, user_city userCity, age 
from user where and user_email = ? and user_city = ?

where 바로 뒤에 and가 옵니다. 이는 명백한 문법 오류입니다. 이때 where 바로 뒤에는 and가 있어야 합니다. 삭제되었습니다. 이 문제를 해결하려면 where 태그를 사용하면 됩니다. where后面的and删掉。为了解决这个问题,可以使用where标签。

where

将上面的SQL改成如下所示

    <select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age        from user
        <where>
            <if test="username != null and username != &#39;&#39;">
                username = #{username}
            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}
            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                and user_city = #{userCity}
            </if>
        </where>
    </select>

如果where标签里面的if标签有满足条件的,那么where标签就会被拼接成where语句,若if标签拼接的SQL最前面有and语句,那么这个and将会被删除。使用这种方法, 会自动删除SQL中不需要的关键字,所以一般 if 标签和 where 标签会组合起来使用。

trim

trim标签中的 prefixsuffix属性会被用于生成实际的 SQL 语句,会和标签内部的语句拼接。

如果语句的前面或后面遇到 prefixOverridessuffixOverrides属性中指定的值,MyBatis 会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的 SQL 连接在一起。

prefix:给拼接的SQL语句加一个前缀

suffix:给拼接的SQL语句加一个后缀

prefixOverrides:拼接的SQL语句前面遇到 prefixOverrides,MyBatis 会自动将它们删除

suffixOverrides:拼接的SQL语句后面遇到 suffixOverrides,MyBatis 会自动将它们删除

下面使用trim标签来实现where标签的功能

<select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <trim prefix="where" prefixOverrides="and">
            <if test="username != null and username != &#39;&#39;">
                username = #{username}            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                and user_city = #{userCity}            </if>
        </trim>
    </select>

如果username为空,userEmail和userCity不为空,那么if 标签拼接的SQL语句如下所示

and user_email = #{userEmail} and user_city = #{userCity}

因为trim标签设置了prefixOverrides=”and”,而上面的SQL前面有and语句,所以需要将上面的and语句删掉,又因为trim标签设置了prefix=”where”,所以需要在拼接的SQL语句前面加一个where语句

最后trim

where

위의 SQL을 다음과 같이 변경합니다.

where user_email = #{userEmail} and user_city = #{userCity}
where 태그의 if 태그가 조건을 충족하면 where 태그는 where 문으로 연결됩니다. <code>if 태그와 연결된 SQL의 앞에 and 문이 있으면 and가 삭제됩니다. 이 방법을 사용하면 SQL에서 불필요한 키워드가 자동으로 삭제되므로 일반적으로 태그와 where 태그를 조합하여 사용하는 경우가 많습니다.

trim

trim 태그의 prefixsuffix 속성은 실제 SQL 문을 생성하는 데 사용됩니다. 태그 문장 접합 내부와 결합됩니다.

prefixOverrides 또는 suffixOverrides 속성에 지정된 값이 명령문 전후에 발견되면 MyBatis는 자동으로 해당 값을 삭제합니다. 여러 값을 지정할 때 후속 SQL과 연결되지 않도록 각 값 뒤에 공백을 두는 것을 잊지 마십시오.

접두사: 연결된 ​​SQL 문에 접두사 추가

접미사: 연결된 ​​SQL 문에 접미사 추가

prefixOverrides Strong>: 스플라이스 SQL 문 이전에 prefixOverrides가 발견되면 MyBatis는 자동으로 이를 삭제합니다

suffixOverrides: 스플라이스 이후에 suffixOverrides가 발견되면 ​​SQL 문, MyBatis가 자동으로 삭제합니다

아래 trim 태그를 사용하여 where 태그의 기능을 구현하세요

<select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <where>
            <choose>
                <when test="username != null and username != &#39;&#39;">
                    username = #{username}                </when>
                <when test="userEmail != null and userEmail != &#39;&#39;">
                    and user_email = #{userEmail}                </when>
                <when test="userCity != null and userCity != &#39;&#39;">
                    and user_city = #{userCity}                </when>
            </choose>
        </where>
    </select>
사용자 이름이 비어 있으면 userEmail 및 userCity 비어 있지 않으면 태그 접합을 위한 SQL 문이 다음과 같습니다🎜<pre class="brush:php;toolbar:false">public int updateUser(User user);</pre>🎜<code>trim 태그가 prefixOverrides="and"로 설정되어 있고 위의 SQL에 and 문이 있으므로 앞에 있으므로 위와 문을 삭제해야 하며 trim 태그가 prefix="where"로 설정되어 있으므로 접합된 문 앞에 where 문을 추가해야 합니다. ​SQL 문🎜🎜마지막으로 trim 태그의 SQL 문이 아래와 같이 이어집니다🎜
<update id="updateUser" parameterType="com.example.mybatis.entity.User">
       update user       <set>
           <if test="username != null and username != &#39;&#39;">
               username=#{username},           </if>
           <if test="userEmail != null and userEmail != &#39;&#39;">
               user_email=#{userEmail},           </if>
           <if test="userCity != null and userCity != &#39;&#39;">
               user_city=#{userCity},           </if>
           <if test="age != null">
              age=#{age}           </if>
       </set>
       where id=#{id}    </update>
🎜🎜🎜choose🎜🎜때때로 모든 조건문에 적용하고 싶지 않고 그냥 적용하고 싶을 때가 있습니다. 그 중 하나를 선택합니다. 이러한 상황을 위해 MyBatis는 Java의 스위치 문과 약간 유사한 choose 요소를 제공합니다. 🎜
public List<User> getUsersByIds(List<Integer> ids);
🎜🎜🎜set🎜🎜set 태그는 업데이트 작업에 사용되며 매개변수 선택에 따라 자동으로 SQL 문을 생성합니다. 🎜🎜인터페이스는 다음과 같이 정의됩니다🎜
<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select id="getUsersByIds"
        resultType="com.example.mybatis.entity.User">
    select * from user
    where id in    <foreach collection="list" item="id" open="(" close=")" separator=",">
        #{id}    </foreach></select>
🎜해당 Mapper.

接口定义如下所示

public List<User> getUsersByIds(List<Integer> ids);

接口对应的 Mapper.xml 定义如下所示

<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select id="getUsersByIds"
        resultType="com.example.mybatis.entity.User">
    select * from user
    where id in    <foreach collection="list" item="id" open="(" close=")" separator=",">
        #{id}    </foreach></select>

用于批量插入

接口定义如下所示

public int addUserList(List<User> users);

接口对应的 Mapper.xml 定义如下所示

<insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    insert into user
    (username, user_email, user_city, age)
    values    <foreach item="user"  collection="list" separator=",">
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--返回自增主键--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User"
        useGeneratedKeys="true"
        keyProperty="id">
    insert into user
    (username, user_email, user_city, age)
    values    <foreach item="user"  collection="list" separator=",">
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--还可以这样写--><!--
    这种方式需要数据库连接属性设置allowMultiQueries=true
    这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除
--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    <foreach item="user"  collection="list" separator=";">
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    <foreach item="user" open="begin" close="end;"  collection="list">
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age});    </foreach></insert>

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

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:SQL 고급 고급 이해다음 기사:SQL 고급 고급 이해