Mabitis의 #과 $기호의 차이 및 사용법 소개
mybatis에서 Mapper를 사용합니다.xml 안의 설정은 sql 조회를 하는데 동적 전달 파라미터가 자주 필요합니다. 예를 들어 사용자의 이름에 따라 사용자를 선별해야 할 때 sql는 다음과 같습니다.
select * from user where name = "Jack";
상술한 sql에서, 우리는name 뒤의 매개 변수인'Jack'이 동적으로 변할 수 있기를 희망합니다. 즉, 서로 다른 시간에 서로 다른 이름에 따라 사용자를 조회하는 것입니다.마퍼에서.xml 파일에서 다음과 같은 sql를 사용하면 동적 전달 매개 변수name를 실현할 수 있습니다.
select * from user where name = #{name};
또는:
select * from user where name = ${name};
2, $및#1. 차이점:
동적 SQL은 mybatis의 강력한 특성 중 하나이며 다른 ORM 프레임워크보다 우수한 중요한 원인이기도 하다.mybatis는 sql 문장을 미리 컴파일하기 전에 sql에 대해 동적 해석을 하고 boundSql 대상으로 해석하며 여기서 동적 SQL을 처리합니다.동적 SQL 해석 단계에서 #과 $는 다르게 표시됩니다.
#: JDBC 프리컴파일 문장(prepared statement)의 매개 변수 표기자로 해석됩니다.
예를 들어, Mapper.xml에서 다음과 같은 sql 문장:
select * from user where name = #{name};
동적 해석은 다음과 같습니다.
select * from user where name = ?;
하나의 # {} 이 매개 변수 자리 표시자로 해석됩니까?${}는 단지 하나의 순수한 스트링 교체일 뿐, 동적 SQL 해석 단계에서 변수 교체가 진행될 것입니다.
예를 들어, Mapper.xml에서 다음과 같은 sql:
select * from user where name = ${name};
우리가 전달하는 매개 변수가 "Jack"일 때, 상기 sql의 해석은 다음과 같다.
select * from user where name = "Jack";
미리 컴파일하기 전의 SQL 문장은 변수를 포함하지 않습니다. 완전히 상수 데이터입니다.결론적으로 ${} 변수의 교체 단계는 동적 SQL 해석 단계이고 #{} 변수의 교체는 DBMS에 있습니다.
3. 용법
1. #{}를 사용할 수 있는 곳은 #{}를 사용한다
우선 이것은 성능을 고려하기 위해서입니다. 같은 사전 컴파일 sql는 중복 사용할 수 있습니다.그 다음에 ${} 는 미리 컴파일하기 전에 변수로 바뀌었습니다. 이것은 ql 주입 문제가 존재합니다.예를 들어, 다음과 같은 sql:
select * from ${tableName} where name = #{name}
만약, 우리의 매개 변수tableName이user라면;delete user; --,그러면 SQL 동적 해석 단계 이후 사전 컴파일된 sql은 다음과 같이 됩니다.
select * from user; delete user; -- where name = ?;
-- , , SQL。
2. 테이블 이름을 변수로 사용할 때 ${} 를 사용해야 합니다.이것은 표 이름이 문자열이기 때문에 sql 자리 표시자를 사용하여 문자열을 바꿀 때 인용부호를 끼울 수 있기 때문이다. 이것은 sql 문법 오류를 초래할 수 있다. 예를 들어
select * from #{tableName} where name = #{name};
사전 컴파일된 sql은 다음과 같이 변경됩니다.
select * from ? where name = ?;
만약 우리가 전송한 매개 변수가 tableName = "user", name = "Jack"이라고 가정한다면, 자리 표시자를 변수로 바꾸면 sql 문장은 다음과 같이 변한다.
select * from 'user' where name='Jack';
상술한 sql문장은 문법 오류가 존재하기 때문에 표명에 인용부호를 추가할 수 없습니다.4. sql 사전 번역
1. 정의:
sql 프리컴파일이란 데이터베이스 드라이브가 sql 문장과 파라미터를 DBMS에 보내기 전에 sql 문장을 컴파일하는 것을 말한다. 이렇게 하면 DBMS가 sql를 실행할 때 다시 컴파일할 필요가 없다.
2. 사전 컴파일이 필요한 이유
JDBC에서는 객체 PreparedStatement를 사용하여 미리 컴파일된 문장을 추상화하고 미리 컴파일된 문장을 사용합니다.사전 컴파일 단계는 sql의 실행을 최적화할 수 있습니다.사전 컴파일된 후의 sql는 대부분 상황에서 직접 실행할 수 있으며 DBMS는 다시 컴파일할 필요가 없다. 복잡한 sql일수록 컴파일의 복잡도가 커지고 사전 컴파일 단계는 여러 번 하나의 조작으로 통합할 수 있다.미리 컴파일된 문장의 대상은 반복해서 이용할 수 있다.sql를 미리 컴파일한 후 생성된PreparedStatement 대상을 캐시합니다. 다음에 같은 sql에 대해 이 캐시의PreparedState 대상을 직접 사용할 수 있습니다.mybatis는 기본적으로 모든 ql를 미리 컴파일합니다.
위에서 말한 것은 편집자가 여러분께 소개한 Mabitis의 #과 $기호의 차이입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.