본문 바로가기

[마이바티스] mybatis # $ 사용법

인포꿀팁 발행일 : 2023-05-16

마이바티스-#$-사용법

#{}, ${} 표현식은 MyBatis에서 매개변수를 지정하고 동적 SQL 작성하는 사용됩니다. #{}, ${} 의미와 사용 방법을 이해하여 데이터베이스와의 상호작용을 보다 효율적으로 구현할 있습니다.

 

mybatis mapper.xml 작성법이 궁금하다면?

 

[MyBatis] mapper.xml 작성법 알아보기

MyBatis의 mapper 속성의 특징 - #{필드명} : ?로 치환되고 preparedStatement 객체로 실행 동적인 값을 DB에 저장할때는 반드시 #{필드명} 사용해야함 - ${컬럼명 또는 테이블명} : DB에 저장하거나 검색할 컬

back-end-developer.tistory.com

 

mybatis select 태그에 대해 궁금하다면?

 

mybatis select 태그 정리

매퍼 파일 안에 있는 태그는 데이터베이스로부터 데이터를 조회하는 SQL 쿼리를 정의합니다. 태그의 주요 속성과 사용 방법을 자세히 알려드리겠습니다. mybatis의 mapper.xml 작성법은? [MyBatis] mapper.

back-end-developer.tistory.com

 

 

#와 $의 차이점

MyBatis에서는 #{}과 ${} 두 가지 표현식을 사용하여 매개변수를 지정할 수 있습니다. 

1. #{} 표현식은 JDBC의 PreparedStatement를 사용하여 매개변수를 처리합니다.

이 표현식을 사용하면 입력 값에 대한 자동적인 타입 변환과 SQL 인젝션 방지 기능을 제공합니다. 따라서 #{}은 일반적으로 매개변수를 지정할 때 사용하는 권장된 방법입니다.

2. ${} 표현식은 입력된 값을 그대로 쿼리에 삽입합니다.

이 표현식은 단순한 문자열 치환을 수행하며, 자동적인 타입 변환이나 SQL 인젝션 방지 기능을 제공하지 않습니다. ${}은 주로 동적인 SQL을 작성할 때 사용됩니다.

 

#{} 와 ${} 사용방법과 차이점

<select id="selectUserById" parameterType="int" resultType="com.example.User">
  SELECT * FROM users WHERE id = #{userId}
</select>

#{userId}는 int 타입의 userId 매개변수를 나타냅니다. 이 경우 #{} 표현식이 사용되었으므로 MyBatis는 입력된 userId 값을 자동으로 PreparedStatement로 처리하며, 값의 타입 변환과 SQL 인젝션 방지를 수행합니다.

 

<select id="selectUserByName" parameterType="String" resultType="com.example.User">
  SELECT * FROM users WHERE name = '${username}'
</select>

 

${username}은 String 타입의 username 매개변수를 나타냅니다. ${} 표현식이 사용되었으므로 MyBatis는 입력된 username 값을 그대로 쿼리에 삽입합니다. 이 경우에는 타입 변환이나 SQL 인젝션 방지가 수행되지 않으므로, 주의하여 사용해야 합니다.

 

#{} 와 ${} 표현식을 활용한 동적 SQL 작성방법

$ 표현식 동적 SQL 작성법

${} 표현식은 동적인 SQL을 작성할 때 유용합니다. 예를 들어, WHERE 절에 선택적인 조건을 추가하고자 할 때 다음과 같이 사용할 수 있습니다.

<select id="selectUsersByCondition" parameterType="com.example.User" resultType="com.example.User">
  SELECT * FROM users
  WHERE 1=1
  <if test="name != null">
    AND name = '${name}'
  </if>
  <if test="age != null">
    AND age = ${age}
  </if>
</select>

# 표현식 동적 SQL 작성법

#{} 표현식은 매개변수를 처리할 때 사용되는 권장된 방법입니다. 이 표현식은 자동으로 값에 대한 타입 변환을 수행하고, SQL 인젝션을 방지하는 안전한 방식으로 매개변수를 처리합니다. #{}은 주로 매개변수를 지정하거나 동적인 SQL에서 조건을 포함하는 데 사용됩니다.

 

<insert id="insertUser" parameterType="com.example.User">
  INSERT INTO users (id, username, age) VALUES (#{id}, #{username}, #{age})
</insert>

 

위의 예제에서 #{id}, #{username}, #{age}는 com.example.User 객체의 속성을 나타냅니다. #{} 표현식을 사용하면 MyBatis는 자동으로 객체의 속성과 매개변수 값을 매핑하며, 필요한 경우 타입 변환을 수행합니다.

 

${} 표현식은 단순한 문자열 치환을 수행하는데 사용됩니다. 입력된 값을 그대로 쿼리에 삽입하므로 주의해야 합니다. ${}은 동적인 SQL을 작성할 때 유용하지만, SQL 인젝션에 취약할 수 있으므로 외부 입력값을 사용할 때는 신중하게 사용해야 합니다.

아래 예제에서 ${}의 사용 방법을 보여드리겠습니다:

 

<select id="selectUsersByAgeRange" parameterType="com.example.AgeRange" resultType="com.example.User">
  SELECT * FROM users
  WHERE age >= ${minAge} AND age <= ${maxAge}
</select>

 

${minAge}와 ${maxAge}는 com.example.AgeRange 객체의 속성을 나타냅니다. ${} 표현식을 사용하면 객체의 속성 값을 그대로 쿼리에 삽입합니다. 따라서 타입 변환이나 SQL 인젝션 방지 기능은 제공되지 않으므로, 외부 입력값을 사용할 때는 주의해야 합니다.

 

#{} ${} 표현식은 각각의 사용 목적에 따라 선택적으로 사용해야 합니다. #{} 매개변수를 처리할 안전하게 사용되며, ${} 단순한 문자열 치환을 수행할 유용합니다.

'DB > Mybatis' 카테고리의 다른 글

ibatis mybatis 차이점 총정리!  (0) 2023.05.16
mybatis select 태그 정리  (0) 2023.05.15
[MyBatis] mapper.xml 작성법 알아보기  (0) 2020.12.04
[MyBatis] MyBatis 환경설정 세팅  (0) 2020.12.01

댓글