>  기사  >  Java  >  마비티스에서 #, $ 기호의 차이점과 사용법에 대한 자세한 설명

마비티스에서 #, $ 기호의 차이점과 사용법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-08 11:01:471742검색

이 글은 마비티스에서 #과 $ 기호의 차이점을 주로 소개합니다. 도움이 필요한 친구들은 참고하시면 됩니다

1. 소개

Mybatis는 Mapper.xml의 구성을 사용하여 SQL 쿼리를 수행합니다. 예를 들어 사용자 이름을 기준으로 사용자를 필터링해야 하는 경우 SQL은 다음과 같습니다.

select * from user where name = "Jack";

위 SQL에서 name 뒤의 "Jack" 매개변수가 동적으로 가변되기를 바랍니다. 즉, 사용자가 서로 다른 시간에 서로 다른 이름을 기반으로 쿼리할 수 있기를 바랍니다. Mapper.xml 파일에서 다음 SQL을 사용하여 매개변수 이름을 동적으로 전달합니다.

select * from user where name = #{name};

또는

select * from user where name = ${name};

2. $ 및 #

1. 차이점:

동적 SQL 예 다음 중 하나입니다. mybatis의 강력한 기능은 다른 ORM 프레임워크보다 우수한 중요한 이유이기도 합니다. mybatis는 sql 문을 미리 컴파일하기 전에 sql을 동적으로 구문 분석하고 이를 BoundSql 개체로 구문 분석하여 동적 SQL도 처리합니다. 동적 SQL 구문 분석 단계 동안 #{ } 및 ${ }는 다르게 동작합니다.

#{ }: JDBC 준비된 문의 매개변수 표시자로 구문 분석됩니다.

예를 들어 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을 재사용할 수 있습니다. 둘째, 사전 컴파일 전에 ${ }가 변수로 대체되어 SQL 주입 문제가 발생합니다. 예를 들어, 다음 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는 사전 컴파일된 명령문을 추상화하기 위해 ReadyStatement 개체를 사용하고 사전 컴파일을 사용합니다. 사전 컴파일 단계에서는 SQL 실행을 최적화할 수 있습니다. 대부분의 경우 사전 컴파일된 SQL은 직접 실행할 수 있습니다. SQL이 복잡할수록 사전 컴파일 단계는 하나의 작업으로 결합될 수 있습니다. 준비된 문 개체를 재사용할 수 있습니다. SQL이 사전 컴파일된 후 생성된 ReadyStatement 개체를 캐시합니다. 다음번에는 동일한 SQL에 대해 캐시된 이 ReadyState 개체를 직접 사용할 수 있습니다. 기본적으로 mybatis는 모든 SQL을 사전 컴파일합니다.


위 내용은 마비티스에서 #, $ 기호의 차이점과 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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