며칠 전 필기시험을 보러 회사에 갔는데, 질문 중 하나가 "Mybatis에서 #{}와 ${}의 차이점이 무엇인가요?"였습니다. 솔직히 말해서, 나 자신도 mybatis에 대해 많이 배운 적이 없었기 때문에 당시에는 그다지 명확하지 않았습니다. mybatis는 최근 프로젝트에서 사용되었지만 여러 항목 간의 가장 기본적인 추가, 삭제, 수정 및 쿼리만 포함했습니다. 테이블. 상관 관계는 거의 사용되지 않습니다. #{}는 매퍼 매핑 파일에만 사용되는 반면, ${}는 JS 및 프런트엔드 JSP 페이지에 사용됩니다. 나중에 온라인으로 확인해 보니 둘 사이에 여전히 큰 차이가 있다는 것을 알게 되었습니다. 이제 모든 사람의 토론과 연구를 용이하게 하기 위해 제가 찾은 정보를 다음과 같이 요약합니다.
일반적으로 둘의 차이점은 다음 6가지로 요약할 수 있습니다.
(1)# 들어오는 데이터를 문자열로 처리하고 자동으로 들어오는 데이터 따옴표에 double을 추가합니다. . 예: #user_id#순으로, 전달된 값이 111이면 sql로 구문 분석할 때 값은 "111"순으로 정렬되고, 전달된 값이 id인 경우 구문 분석된 sql은 "id"순으로 정렬됩니다.
(2)$은 들어오는 데이터를 직접 표시하고 SQL에서 생성합니다. 예: order by $user_id$, 전달된 값이 111인 경우 sql로 구문 분석할 때 값은 전달된 값이 id인 경우 order by id입니다.
(3)# 방법을 사용하면 SQL 삽입을 상당 부분 방지할 수 있습니다.
(4)$ 메서드는 SQL 삽입을 방지할 수 없습니다.
(5) $ 메서드는 일반적으로 테이블 이름과 같은 데이터베이스 개체를 전달하는 데 사용됩니다.
(6) 일반적으로 #을 사용할 수 있다면 $를 사용하지 마세요.
ps: mybatis를 사용할 때 의 사용법도 발견했습니다. 이 기호 내의 명령문은 문자열로 처리되지 않고 저장 프로시저 실행과 같은 SQL 명령문으로 직접 처리됩니다.
예제 설명:
동적 SQL은 mybatis의 주요 기능 중 하나입니다. 매퍼에 정의된 매개변수가 xml에 전달된 후 mybatis는 쿼리하기 전에 이를 동적으로 구문 분석합니다. mybatis는 동적 SQL을 지원하는 두 가지 구문인 #{} 및 ${}를 제공합니다.
다음 명령문에서 name 값이 zhangsan이면 두 방법 사이에 차이가 없습니다.
select * from user where name = #{name};
select * from user where name = ${name};
분석 후 결과는 모두
select * from user where name = 'zhangsan';
이지만 #{} 및 $ {}는 사전 컴파일에서 다르게 처리됩니다. #{} 전처리 중에 매개변수 부분은 자리 표시자로 대체되어 를 대체하고 다음과 같은 SQL 문이 됩니다.
select * from user where name = ?;
그리고 ${}는 동적에서 단순한 문자열 대체 입니다. 구문 분석 단계에서 sql 문은
select * from user where name = 'zhangsan';
로 구문 분석됩니다. 위에서 #{}의 매개변수 교체는 DBMS에서 발생하고 ${}는 동적 구문 분석 프로세스 중에 발생합니다.
그럼 사용시에는 어떤 방법을 사용해야 할까요?
답은 다음과 같습니다. 먼저 #{}를 사용하세요. ${}는 SQL 주입 문제를 일으킬 것이기 때문입니다.
다음 예를 보세요.
select * from ${tableName} where name = #{name}
이 예에서 테이블 이름이
user; delete user; --
인 경우 동적 구문 분석 후의 sql은 다음과 같습니다. --다음 문은 주석 처리되어 있으며 원래 사용자를 조회하는 문은 모든 사용자 정보를 조회하고 사용자 테이블을 삭제하는 문이 되어 데이터베이스에 심각한 손상을 줄 수 있으며 서버 다운타임이 발생할 가능성이 높습니다.
이는 또한 이 사용법에서 SQL 삽입 문제에 주의해야 한다는 점을 상기시켜 줍니다.
위 내용은 Mybatis에서 #{}와 ${}의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!