Mybatis 의\#{}과${}의 차이 점 사용 설명

3819 단어 Mybatis#{}${}
1.두 가지 수치 채취 방식 의 차이
mapper.xml 맵 파일

<select id="selectEmployeeByCondition2" resultMap="empResultMap" databaseId="mysql">
    select * from t_emp WHERE emp_id=${id} and emp_name=#{name}
  </select>
자바 조회 코드 params 는 id=1,name="빨강"입 니 다.

@Test
  public void testSelect() {
    InputStream resourceAsStream = ConfigTest.class.getResourceAsStream("../classes/mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    EmployeeMapper mapper2 = sqlSession.getMapper(EmployeeMapper.class);

    Employee employee2 = mapper2.selectEmployeeByCondition2(1,"xiaohong");
    System.out.println(employee2);
  }
결실
==>  Preparing: select * from t_emp WHERE emp_id=1 and emp_name=?
==> Parameters: xiaohong(String)
<==    Columns: emp_id, emp_name, emp_email, emp_tel, emp_dep, emp_status
<==        Row: 1, xiaohong , [email protected] , 123, 1, 0
<==      Total: 112345
1.1 #{}
위 코드 에서 보 듯 이\#{}은 원생 jdbc 구문 에서 사용 할 수 있 습 니까?자리 차지 문자 로 표시 하 다.이렇게 하면 sql 주입 을 방지 할 수 있다.
1.2${}
위 코드 에서 보 듯 이${}은 파 람 을 원생 sql 에 직접 맞 추 는 것 입 니 다.
2.언제 어떤 방식 을 사용 해 야 할 지
위 예제 에서 보 듯 이\#{}과${}의 역할 은 모두 값 을 추출 하 는 동시에\#{}은 sql 주입 을 방지 할 수 있 습 니 다.다음 코드 에\#{}을 사용 하 시 겠 습 니까?물론 그렇지 않다.예 를 들 어 한 전자상거래 시스템 의 주문서 데 이 터 는 양 이 너무 많아 서 표를 나 누 어 데 이 터 를 저장 할 수 없다.이 전자상거래 의 엔 지 니 어 는 마지막 으로 이 시 계 를 연월 별로 나 누 기로 결정 했다(torder_201701,t_order_201702…)。이때 우 리 는 그 중 방식 으로 조 회 를 진행 해 야 합 니까?만약 내 가 17 년 6 월 의 모든 주문 서 를 조회 하려 고 한다 면?
당신 은 이것 이 쉽다 고 생각 할 수 있 습 니 다.세월 의 동 태 를 sql 에 전달 하면 다음 과 같 습 니 다.

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_#{createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>123
결실
==>  Preparing: select * from from t_order_? WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Integer)12
이 문 구 는 실행 할 수 없 음 이 분명 합 니 다.이 때${}을 사용 해 야 합 니 다.

<select id="selectOrderByCondition" resultMap="orderResultMap" databaseId="mysql">
    select * from t_order_${createYM} WHERE DATE_FORMAT(create_date,'%Y%m')=${createYM}+''
  </select>
조립의 원생 jdbcsql
==>  Preparing: select * from from t_order_201706 WHERE DATE_FORMAT(create_date,'%Y%m')='201706'
==> Parameters: 201706(Long)12
이 sql 이 실 행 될 수 있 음 이 분명 합 니 다.
3.총화
동적 sql 은 my batis 의 주요 특성 중 하나 로 mapper 에서 정 의 된 매개 변 수 를 xml 에 전달 한 후 조회 하기 전에 my batis 는 이 를 동적 으로 분석 합 니 다.my batis 는 동적 sql 을 지원 하 는 두 가지 문법 을 제공 합 니 다.\#{}과${}.
1.\#데이터 에 더 블 따옴표 를 붙 이 는 것 과 같 습 니 다.$는 데 이 터 를 직접 표시 하 는 것 과 같 습 니 다.
2.\#{}:매개 변수 유형 에 따라 처리 합 니 다.예 를 들 어 String 형식 에 들 어 오 면 매개 변수 에 더 블 따옴표 가 붙 습 니 다.\#{}전 참 은 SQL 사전 번역 을 할 때 매개 변수 부분 을 자리 표시 자 로 사용 합 니까?대신 SQL 주입 을 방지 할 수 있 습 니 다.
3.${}:파 라 메 터 를 꺼 내 서 처리 하지 않 고 문장 에 직접 넣 으 면 간단 한 문자열 로 바 뀌 고 이 파 라 메 터 는 SQL 의 사전 컴 파일 에 참가 할 것 입 니 다.SQL 주입 을 방지 하기 위해 수 동 으로 파 라 메 터 를 걸 러 야 합 니 다.
4.따라서 my batis 에서\#{}을 우선 사용 합 니 다.표 이름 이나 열 이름 을 동적 으로 입력 해 야 할 때${}을 사용 하 는 것 을 고려 합 니 다.특수 합 니 다.그의 응용 장면 은 표 이름 이나 열 이름 을 동적 으로 입력 해 야 할 때 사용 합 니 다.my batis 정렬 시 orderby 동적 인 파 라 메 터 를 사용 할 때\#가 아 닌$를 사용 해 야 합 니 다.
Mybatis 의\#{}과${}의 차이 점 에 대한 자세 한 설명 은 여기까지 입 니 다.Mybatis\#{}과${}에 관 한 더 많은 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기