찾다
데이터 베이스SQLMyBatis 동적 SQL 알아보기

MyBatis 동적 SQL 알아보기

Dec 09, 2020 pm 05:46 PM
mybatissql

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);</user>

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

<select>
    select
    id, username, user_email userEmail, user_city userCity, age
    from user
    where    <if>
        username = #{username}    </if>
    <if>
        and user_email = #{userEmail}    </if>
    <if>
        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>
        select
        id, username, user_email userEmail, user_city userCity, age        from user
        <where>
            <if>
                username = #{username}
            </if>
            <if>
                and user_email = #{userEmail}
            </if>
            <if>
                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>
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <trim>
            <if>
                username = #{username}            </if>
            <if>
                and user_email = #{userEmail}            </if>
            <if>
                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

위의 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 문에 접두사 추가 prefixOverrides Strong>: 스플라이스 SQL 문 이전에 prefixOverrides가 발견되면 MyBatis는 자동으로 이를 삭제합니다

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

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

<select>
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <where>
            <choose>
                <when>
                    username = #{username}                </when>
                <when>
                    and user_email = #{userEmail}                </when>
                <when>
                    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>
       update user       <set>
           <if>
               username=#{username},           </if>
           <if>
               user_email=#{userEmail},           </if>
           <if>
               user_city=#{userCity},           </if>
           <if>
              age=#{age}           </if>
       </set>
       where id=#{id}    </update>
🎜🎜🎜choose🎜🎜때때로 모든 조건문에 적용하고 싶지 않고 그냥 적용하고 싶을 때가 있습니다. 그 중 하나를 선택합니다. 이러한 상황을 위해 MyBatis는 Java의 스위치 문과 약간 유사한 choose 요소를 제공합니다. 🎜
public List<user> getUsersByIds(List<integer> ids);</integer></user>
🎜🎜🎜set🎜🎜set 태그는 업데이트 작업에 사용되며 매개변수 선택에 따라 자동으로 SQL 문을 생성합니다. 🎜🎜인터페이스는 다음과 같이 정의됩니다🎜
<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select>
    select * from user
    where id in    <foreach>
        #{id}    </foreach></select>
🎜해당 Mapper.

接口定义如下所示

public List<user> getUsersByIds(List<integer> ids);</integer></user>

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

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

用于批量插入

接口定义如下所示

public int addUserList(List<user> users);</user>

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

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

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

성명
이 기사는 learnku에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
MySQL : SQL의 특정 구현MySQL : SQL의 특정 구현Apr 13, 2025 am 12:02 AM

MySQL은 표준 SQL 기능 및 확장을 제공하는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 한계 조항을 작성, 삽입, 업데이트, 삭제 및 확장과 같은 표준 SQL 작업을 지원합니다. 2) Innodb 및 Myisam과 같은 스토리지 엔진을 사용하여 다양한 시나리오에 적합합니다. 3) 사용자는 테이블 작성, 데이터 삽입 및 저장 프로 시저를 사용하는 것과 같은 고급 기능을 통해 MySQL을 효율적으로 사용할 수 있습니다.

SQL : 모든 사람이 데이터 관리에 액세스 할 수 있도록합니다SQL : 모든 사람이 데이터 관리에 액세스 할 수 있도록합니다Apr 12, 2025 am 12:14 AM

sqlmakesdatamanagementaCcessibletoallbyprovingasimpleyetpooltooltoolforqueryinganddatabases.1) itworkswithrelationalDatabases.2) sql'sstrengthliesinfiltering, andjoiningdata, andjoiningdata, andjoiningdata

SQL 인덱싱 전략 : 쿼리 성능 향상 순서SQL 인덱싱 전략 : 쿼리 성능 향상 순서Apr 11, 2025 am 12:04 AM

SQL 인덱스는 영리한 설계를 통해 쿼리 성능을 크게 향상시킬 수 있습니다. 1. B- 트리, 해시 또는 전문 지수와 같은 적절한 인덱스 유형을 선택하십시오. 2. 복합 인덱스를 사용하여 멀티 필드 쿼리를 최적화하십시오. 3. 데이터 유지 보수 오버 헤드를 줄이려면 과도한 인덱스를 피하십시오. 4. 불필요한 인덱스 재건 및 제거를 포함하여 정기적으로 인덱스를 유지합니다.

SQL에서 제약 조건을 삭제하는 방법SQL에서 제약 조건을 삭제하는 방법Apr 10, 2025 pm 12:21 PM

SQL에서 제약 조건을 삭제하려면 다음 단계를 수행하십시오. 삭제할 제약 조건을 식별하십시오. Alter Table 문을 사용하십시오. Alter Table Tame 이름 드롭 제약 조건 제한 이름; 삭제를 확인하십시오.

SQL 트리거를 설정하는 방법SQL 트리거를 설정하는 방법Apr 10, 2025 pm 12:18 PM

SQL 트리거는 지정된 테이블에서 특정 이벤트가 실행될 때 특정 작업을 자동으로 수행하는 데이터베이스 개체입니다. SQL 트리거를 설정하려면 트리거 이름, 테이블 이름, 이벤트 유형 및 트리거 코드가 포함 된 Trigger 문을 사용할 수 있습니다. 트리거 코드는 AS 키워드를 사용하여 정의되며 SQL 또는 PL/SQL 문 또는 블록을 포함합니다. 트리거 조건을 지정하면 where 절을 사용하여 트리거의 실행 범위를 제한 할 수 있습니다. 트리거 작업은 삽입, 업데이트 또는 삭제 명령문을 사용하여 트리거 코드에서 수행 할 수 있습니다. 신규 및 기존 키워드를 사용하여 영향을받는 키워드를 트리거 코드에서 참조 할 수 있습니다.

SQL 쿼리에 인덱스를 추가하는 방법SQL 쿼리에 인덱스를 추가하는 방법Apr 10, 2025 pm 12:15 PM

인덱싱은 데이터 열을 정렬하여 데이터 검색을 가속화하는 데이터 구조입니다. SQL 쿼리에 인덱스를 추가하는 단계는 다음과 같습니다. 인덱싱 해야하는 열을 결정하십시오. 적절한 인덱스 유형 (b-tree, hash 또는 bitmap)을 선택하십시오. Create Index 명령을 사용하여 인덱스를 작성하십시오. 효율성을 유지하기 위해 지수를 정기적으로 재구성하거나 재구성합니다. 인덱스 추가의 이점에는 개선 된 쿼리 성능, I/O 작동 감소, 최적화 된 정렬 및 필터링 및 개선 된 동시성이 포함됩니다. 쿼리가 종종 특정 열을 사용하는 경우 정렬 또는 그룹화 해야하는 다량의 데이터를 반환하고, 큰 테이블 또는 큰 데이터베이스 테이블이 포함되므로 인덱스 추가를 고려해야합니다.

SQL 문에 ifelse를 사용하는 방법SQL 문에 ifelse를 사용하는 방법Apr 10, 2025 pm 12:12 PM

IFELSE 문은 조건부 평가 결과에 따라 다른 값을 반환하는 조건부 명세서입니다. 구문 구조는 다음과 같습니다. if (조건) 그런 다음 return_value_if_condition_is_true else return_value_if_condition_is_false end if;.

SQL 데이터베이스 오류를 보는 방법SQL 데이터베이스 오류를 보는 방법Apr 10, 2025 pm 12:09 PM

SQL 데이터베이스 오류를 보는 방법은 다음과 같습니다. 1. 오류 메시지보기 직접; 2. 표시 오류 및 경고 명령을 사용하십시오. 3. 오류 로그에 액세스; 4. 오류 코드를 사용하여 오류의 원인을 찾으십시오. 5. 데이터베이스 연결 및 쿼리 구문을 확인하십시오. 6. 디버깅 도구를 사용하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구