Mybatis 중\#{}과${}의 차이 점 상세 설명

5534 단어 Mybatis#{}${}
머리말
개발 에 있어 서 Mybatis 를 자주 사용 합 니 다.\#{}과${}은 아직도 많은 개발 자 들 이 이들 에 대한 사용 이 뚜렷 하지 않 습 니 다.좋 은 기억력 이 썩 은 붓끝 보다 못 하 다 는 것 을 요약 합 니 다.
my batis 에서 동적 sql 은 그 주요 특성 중 하나 로 mapper 에서 정 의 된 매개 변 수 를 xml 에 전달 한 후 작업 을 수행 하기 전에 my batis 는 이 를 동적 으로 분석 합 니 다.my batis 는 동적 sql 을 지원 하 는 두 가지 문법 을 제공 합 니 다.\#{}과${}의 가장 큰 차이 점 은 전자 방식 이 sql 주입(안전)을 어느 정도 방지 할 수 있 고 후자 방식 은 Sql 주입 을 방지 할 수 없습니다.뭐?Sql 주입 이 뭔 지 모 르 겠 어 요?어?Sql 주입 이란 프로그램 이 해석 할 때 들 어 오 는 매개 변 수 를 원래 SQL 문장의 일부분 으로 하여 원래 SQL 의 구 조 를 흐 트 러 뜨리 는 것 을 말 합 니 다.보통 우 리 는 하나의 매개 변 수 를 입력 해 야 할 뿐 입 니 다.
SQL 주입 철저히 이해
뭐?SQL 주입 도 모 르 고 QAQ 를 호 수 했 습 니 다.그러면 가장 간단 한 예 를 들 어 일반 개발 은 프론트 데스크 에 두 개의 입력 상자 가 있 을 것 입 니 다.하나의 사용자 이름,하나의 비밀 번 호 는 백 스테이지 에서 프론트 데스크 에 들 어 오 는 이 두 개의 인 자 를 읽 고 하나의 SQL 로 조합 합 니 다.예 를 들 어 select count(1)from tab where usesr=userinput and pass=passinput.이 SQL 을 데 이 터 를 연결 한 후에 이 사용자 이름/비밀번호 가 존재 하 는 지 확인 합 니 다.존재 한다 면 로그 인 에 성공 할 수 있 습 니 다.존재 하지 않 는 다 면 로그 인 에 실패 한 오 류 를 신고 하 십시오.그렇지?그러나 이러한 경우 이 SQL 은 사용자 의 입력 에 따라 맞 춰 진 것 입 니 다.만약 에 사용자 가 의도 적 으로 입력 하면 배경 에서 실패 한 문자열 을 분석 할 수 있 습 니 다.이것 이 바로 SQL 주입 입 니 다.예 를 들 어 사용자 가 비밀 번 호 를 입력 할 때''or 1=1'을 입력 하면 배경 프로그램 이 분석 할 때 맞 춤 형 SQL 문 구 를 만 듭 니 다.이 가능 합 니 다:select count(1)from tab where user=userinput and pass='or 1=1;이 문 구 를 보면 알 수 있 듯 이 분석 한 후에 사용 자 는 비밀 번 호 를 입력 하지 않 고 일정한 조건 1=1 을 추가 했다.그러면 이 SQL 을 실행 할 때 돌아 오 는 count 값 은 1 보다 클 것 이다.만약 에 프로그램의 논리 가 너무 많은 판단 을 하지 않 았 다 면 사용자 이름 userinput 으로 로그 인 할 수 있 고 비밀번호 가 필요 하지 않 을 것 이다.SQL 주입 을 방지 하려 면 먼저 암호 입력 에 있 는 작은 따옴표 를 걸 러 낸 다음 에 다른 논리 적 판단 을 추가 하거나 이런 동적 SQL 조합 을 사용 하지 않 아야 합 니 다.
\#{}에 대하 여
1.\#{}은 자리 차지 기호 가jdbc에 해당 하 는 것 을 표시 합 니까?기호\#{}은 prepare Statement 의 예비 처리 문 에 매개 변수 값 을 설정 하 는 것 을 실현 합 니 다.sql 문 에서\#{}은 자리 표시 자 를 표시 합 니 다.
2.\#{}들 어 오 는 데 이 터 를 문자열 로 사용 하고 자동 으로 들 어 오 는 데이터 에 더 블 따옴표 를 추가 합 니 다.예 를 들 어select * from user where id= #{user_id}들 어 오 는 값 이 11 이면 sql 로 분 석 될 때의 값 은where id="11"입 니 다.
3.만약 에 sql 문장 에 만 있다 면 이때 매개 변수 이름 은 sql 문장 에 여러 개의 매개 변수 가 있다 면 이때 매개 변수 이름 은 현재 표 와 관련 된[실체 류 의 속성 명]또는[Map 집합 키워드]이 어야 합 니 다.함부로 쓰 면 안 되 고 대응 해 야 합 니 다!아래 그림
 
${}
1、 {user_id} , 11, sql where id=11`
2.$ {value}에서value값 은 제한 이 있 고 대응 하 는 value 값 만 쓸 수 있 으 며 함부로 쓸 수 없습니다.${}jdbc 형식 전환 이 자동 으로 진행 되 지 않 기 때 문 입 니 다.
3.쉽게 말 하면JDBC자리 차지 문자 사용 이 지원 되 지 않 는 곳 에서 모두 사용 할 수 있 습 니 다${}Mybatis 중\#{}과${}의 차이
쉽게 말 하면 차이 점 은
\#{}방식 은 sql 주입(안전)을 어느 정도 방지 할 수 있 습 니 다.${}방식 은 Sql 주입 을 방지 할 수 없습니다.JDBC자리 표시 자 를 사용 할 수 있 는 곳 에서 우선 사용#{}JDBC자리 차지 문자 사용 이 지원 되 지 않 는 곳 에 서 는${}만 사용 할 수 있 습 니 다.전형 적 인 상황 은 동적 매개 변수 입 니 다.
예 를 들 어 두 장의 표 가 있 는데 각각emp_2017emp_2018입 니 다.검색 어 에서 표 이름 을 동적 으로 지정 하려 면${}만 사용 할 수 있 습 니 다.

<select>
  select * from emp_ ${year}
<select>
예 를 들 어 MyBatis 정렬 시order by동적 인 파 라 메 터 를 사용 할 때 도${}만 사용 할 수 있 습 니 다.

<select>
  select * from dept order by ${name}
</select>
코드 사례
일반적으로\#{}과${}은 모호 한 조회 에 많이 사용 되 기 때문에 다음 모호 한 조회 사례 입 니 다.
사용\#{}사례
1.맵 파일
User.xml 프로필 에 다음 과 같은 내용 을 추가 합 니 다.

<!--         ,mybatis           list    -->
	<!-- resultType                -->
	<select id="queryUserByUsername1" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE #{username}
	</select>
2.테스트 프로그램
MybatisTest 에 다음 과 같은 테스트 방법 을 추가 합 니 다.

@Test
	public void testQueryUserByUsername1() throws Exception {
		// 4.   SqlSession  
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 5.   SqlSession      ,    User
		//         selectList  
		List<Object> list = sqlSession.selectList("queryUserByUsername1", "% %");

		// 6.     
		for (Object user : list) {
			System.out.println(user);
		}

		// 7.     
		sqlSession.close();
	}
테스트 효 과 는 다음 그림 과 같 습 니 다:
 
${}사용 사례
1.맵 파일:
User.xml 프로필 에 다음 과 같은 내용 을 추가 합 니 다.

<!--               ,${}     value -->
	<select id="queryUserByUsername2" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>
2.테스트 프로그램:MybatisTest 에 다음 과 같은 테스트 방법 을 추가 합 니 다.

@Test
public void testQueryUserByUsername2() throws Exception {
	// 4.   SqlSession  
	SqlSession sqlSession = sqlSessionFactory.openSession();

	// 5.   SqlSession      ,    User
	//         selectList  
	List<Object> list = sqlSession.selectList("queryUserByUsername2", " ");

	// 6.     
	for (Object user : list) {
		System.out.println(user);
	}

	// 7.     
	sqlSession.close();
}
물론 두 사례 의 효과 가 일치 합 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기