<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mappernamespace="com.example.demo.UserMapper"> <selectid="getUserList"resultType="com.example.demo.User"> SELECT * FROM user </select> <selectid="getUser"resultType="com.example.demo.User"> SELECT * FROM user LIMIT 1 </select> <selectid="countUser"resultType="int"> SELECT COUNT(*) FROM user </select>
<insertid="insert"> INSERT INTO user (name, age, date) VALUES ('James', 22, NOW()) </insert> <updateid="update"> UPDATE user SET age = 23 </update> <deleteid="delete"> DELETE FROM user WHERE ![CDATA[ age > 20 ]] </delete> </mapper>
SQL문 안에 < 나 >를 사용하고 싶은 경우 21번째 줄의 ![CDATA[ age > 20 ]]와 같이 CDATA 섹션을 사용해야 합니다.
mybatis.type-aliases-package=com.example.demo 설정을 사용하면 4번째 줄의 resultType을 앞의 패키지 명을 생략하여 User처럼 쓸 수 있습니다.
5. 파라미터가 있는 CRUD
1) 파라미터가 하나이고 자바 기본 데이터 타입인 경우 (String, Integer 등)
UserMapper.java
1 2 3 4
@Mapper publicinterfaceUserMapper{ User getUserByName(String name); }
user-mapper.xml
1 2 3
<selectid="getUserByName"resultType="com.example.demo.User"> SELECT * FROM user WHERE #{any_name} </select>
mapper java 파일에서 선언되어 있는 파라미터의 이름과 관계없이 아무 이름을 mapper xml 파일에 적으면 됩니다.
어차피 파라미터가 하나 뿐이기 때문에 MyBatis가 이름과 관계없이 파라미터를 넣어줍니다.
<selectid="getUserByNameAndAge"resultType="com.example.demo.User"> SELECT * FROM user WHERE name = #{name} AND age = #{age} LIMIT #{pagination.limit} OFFSET #{pagination.offset} </select>
6. #{변수명}과 ${변수명}
우리는 지금까지 SQL에 값을 삽입할 때 #{변수명} 만 사용했습니다.
하지만 MyBatis에서는 ${변수명}으로도 값을 삽입할 수 있습니다.
이 두 방식에 차이를 알아보겠습니다.
1) #{변수명}
1 2
SELECT * FROMuserWHERE age = #{age} -- mapper xml에 작성한 sql SELECT * FROMuserWHERE age = ? -- MyBatis에 의해 변환된 sql
mapper xml 파일에 적혀있는 #{변수명}은 MyBatis가 위와 같이 java.sql.PreparedStatement의 바인드 변수로 변환됩니다.
그런 다음 PreparedStatement의 API를 이용해 값을 집어 넣습니다.
보통 값을 넣을 때 사용합니다.
2) ${변수명}
1 2
SELECT * FROMuserORDERBY ${column} -- mapper xml에 작성한 sql SELECT * FROMuserORDERBY age -- MyBatis에 의해 변환된 sql
해당 변수를 그대로 문자열로 대체합니다. SQL Injection과 같은 공격에 노출될 수 있으므로 사용에 유의하셔야합니다.
보통 테이블 명이나 컬럼 명을 넣을 때 사용합니다.
7. 결과값 매핑
데이터베이스의 컬럼명과 자바에서 사용하는 객체의 프로퍼티 명이 다른 경우가 종종 있습니다.
이럴 경우 다음과 같이 이 둘을 매핑시켜줄 수 있습니다.
1) snake_case, camelCase
일반적으로 데이터베이스에서는 snake_case를, 자바에서는 camelCase를 사용합니다.
다음과 같은 설정을 하면 MyBatis에서 자동으로 이 둘을 매핑시킵니다.