최근에 Mybatis를 사용했습니다. 나는 전에 ibatis를 사용했습니다. 전반적으로 비슷하지만 여전히 많은 문제가 발생했습니다. 다시 녹음하겠습니다.
예를 들어, #{} 사용과 $ {} 매개 변수 전송의 차이,
#을 사용하려면 매개 변수를 전달하면 SQL 문이 "" "를 추가합니다.
이름 = 'Xiao Li'가있는 테이블에서 *를 선택하면 문자열로 구문 분석됩니다. 이것은 분명히 $보다 낫습니다. #{} 매개 변수 전달은 SQL 주입을 방지 할 수 있습니다. 전달한 매개 변수가 단일 따옴표 인 경우 $ {}을 사용하면이 메소드가 오류를보고합니다.
또 다른 시나리오는 열별 순서와 같은 동적 정렬을하려면 현재 $ {}을 사용해야한다면 #{}을 사용하면 인쇄 된 것이됨에 따라
'이름'으로 * 테이블 주문에서 * 선택, 이것은 쓸모가 없습니다.
현재 #을 사용할 수 있다면 $를 사용하지 마십시오.
mybatis에서 #과 $의 차이
1. # 모든 들어오는 데이터를 문자열로 처리하고 자동으로 들어오는 데이터에 이중 인용문을 추가하십시오. 예를 들면 : #user_id #의 주문, 전달 된 값이 111 인 경우 SQL로 구문 분석 할 때의 값은 "111"으로 주문됩니다. 통과 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 "id"로 주문됩니다.
2. $ 전달 된 데이터를 직접 표시하고 SQL로 생성합니다. 예를 들면 다음과 같습니다. $ user_id $로 주문하십시오. 전달 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 ID로 주문됩니다.
3. # 메소드는 SQL 주입을 크게 방지 할 수 있습니다.
4. $ 방법은 SQL 주입을 방지 할 수 없습니다.
5. $ 메소드는 일반적으로 테이블 이름을 전달하는 것과 같은 데이터베이스 개체를 전달하는 데 사용됩니다.
6. 일반적으로 #을 사용할 수있는 경우 $를 사용하지 마십시오.
mybatis를 정렬 할 때 Dynamic 매개 변수 별 순서를 사용하는 경우 # 대신 $를 사용하는 데주의를 기울여야합니다.
문자열 교체
기본적으로 #{} 형식 구문을 사용하면 MyBatis가 전처리 된 명령문 속성을 생성하고 배경 (예 :?)으로 안전한 값을 설정하게합니다. 이것은 안전하고 빠르며 때로는 SQL 문으로 직접 변경되지 않는 문자열을 삽입하려고합니다. 예를 들어, 순서와 같이 다음과 같이 사용할 수 있습니다.
$ {columnname} 주문
여기서 mybatis는 줄을 수정하거나 탈출하지 않습니다.
중요 : 사용자로부터 컨텐츠 출력을 수락하여 명령문에서 변경되지 않은 문자열에 제공하는 것은 안전하지 않습니다. 이로 인해 잠재적 인 SQL 주입 공격이 발생할 수 있으므로 사용자가 이러한 필드에 들어가거나 일반적으로 탈출하여 직접 확인할 수 없습니다.
mybatis에서 $와 #의 차이에 대한 간단한 요약
얼마 전, 누군가가 인터뷰를 위해 우리 회사에 왔습니다. 우리 관리자 가이 질문을했습니다. 나는 그것에 대해 약간의 이해 만했기 때문에 Baidu에 갔다.
실제로 차이는 매우 간단합니다. 당신은 예로 그것을 이해할 것입니다. 문장을 작성하십시오 SQL-for 예제 : user_code = "100"에서 user_role에서 *를 선택하십시오.
이 문장에서는 user_code = #{UserCode}에서 select * from $ {tableName}으로 작성해야합니다.
따라서 $ 문자는 SQL로 직접 철자를 보내고 # 문자는 문자열 형태로 SQL로 철자됩니다.