Mabitis의 #과 $기호의 차이 및 사용법 소개

3118 단어 mybatis#$
소개
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의 #과 $기호의 차이입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기