Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
Tags
- pdo
- Apache
- Python
- maven
- Java
- Spring
- angularjs
- gradle
- php
- xml
- JavaFX
- webflux
- swift
- 외국인 노동자
- node.js
- javadoc
- SQLite
- Eclipse
- Ajax
- bootstrap
- 개발자 이야기
- spring boot
- build tool
- Linux
- WebClient
- jquery
- 일본
- RSocket
- SQL
- mybatis
- Today
- 123
- Total
- 3,697,220
슬기로운 개발자 생활
[MyBatis] Mapper 본문
반응형
지금까지 우리는 SqlSession에 직접 Statement ID 및 매개 변수를 전달하는 방법으로 SQL을 실행을 하였다.
MyBatis는 이와는 별도로 Mapper라는 구조도 준비되어있다. Mapper를 사용하면 SqlSession을 직접 사용하는 형태보다 안전하게 된다.
기본적으로 이 Mapper를 사용하는 방법이 더 좋다. (맵핑 파일이 자동으로 Mapper 단위가 되기 때문에 관리도 쉬워진다)
기본
DB 테이블
test_table
id | string | number |
---|---|---|
1 | hoge | 100 |
2 | fuga | 200 |
3 | piyo | 300 |
소스 코드
TestTable.java
package sample.mybatis;
public class TestTable {
private int id;
private String string;
private int number;
@Override
public String toString() {
return "TestTable [id=" + id + ", string=" + string + ", number=" + number + "]";
}
}
sample_mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.mybatis.TestTableMapper"> <!-- Mapper의 FQCN을 namespace으로 한다. -->
<select id="selectAll" resultType="sample.mybatis.TestTable">
select *
from test_table
</select>
</mapper>
TestTableMapper.java
package sample.mybatis;
import java.util.List;
// Mapper 인터페이스
public interface TestTableMapper {
// Statement ID와 같은 이름의 메소드 정의
List<TestTable> selectAll();
}
Main.java
package sample.mybatis;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
try (SqlSession session = factory.openSession()) {
// Mapper의 인스턴스를 얻는다.
TestTableMapper mapper = session.getMapper(TestTableMapper.class);
mapper.selectAll().forEach(System.out::println);
}
}
}
}
실행 결과
[DEBUG] s.m.T.selectAll - ==> Preparing: select * from test_table
[DEBUG] s.m.T.selectAll - ==> Parameters:
[DEBUG] s.m.T.selectAll - <== Total: 3
TestTable [id=1, string=hoge, number=100]
TestTable [id=2, string=fuga, number=200]
TestTable [id=3, string=piyo, number=300]
설명
- Mapper를 사용하는 경우, 전용 인터페이스를 정의한다(TestTableMapper).
- 이 인터페이스의 메소드와 설정 파일의 각 Statement에 대응되도록 하여 각각을 정의한다.
- Statement에서는 namespace를 인터페이스의 FQCN한다(sample.mybatis.TestTableMapper).
- Statement ID와 인터페이스의 메소드 이름과 일치시킨다(selectAll).
- 매개 변수가 존재하는 경우는 메소드에 인수를 전달하도록 정의한다.
- Mapper 인스턴스는 SqlSession의 getMapper() 메소드로 취득한다.
매개 변수를 여러 인자에 나누어 전달
소스 코드
sample_mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.mybatis.TestTableMapper">
<select id="selectByStringOrNumber" resultType="sample.mybatis.TestTable">
select *
from test_table
where string = #{string}
or number = #{number}
</select>
</mapper>
TestTableMapper.java
package sample.mybatis;
import java.util.List;
import org.apache.ibatis.annotations.Param;
public interface TestTableMapper {
List<TestTable> selectByStringOrNumber(
@Param("string") String string,
@Param("number") int number
);
}
Main.java
package sample.mybatis;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Main {
public static void main(String[] args) throws Exception {
try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
try (SqlSession session = factory.openSession()) {
TestTableMapper mapper = session.getMapper(TestTableMapper.class);
mapper.selectByStringOrNumber("hoge", 300).forEach(System.out::println);
}
}
}
}
실행 결과
[DEBUG] s.m.T.selectByStringOrNumber - ==> Preparing: select * from test_table where string = ? or number = ?
[DEBUG] s.m.T.selectByStringOrNumber - ==> Parameters: hoge(String), 300(Integer)
[DEBUG] s.m.T.selectByStringOrNumber - <== Total: 2
TestTable [id=1, string=hoge, number=100]
TestTable [id=3, string=piyo, number=300]
설명
- 매개 변수가 존재할 경우, 메소드의 인수를 각각 나누어 정의하려면 @Param 어노테이션 인수를 주석한다.
- @Param의 value에는 매개 변수의 이름을 지정한다.
반응형
'IT 개발 > MyBatis' 카테고리의 다른 글
[MyBatis] 프로그램에서 SQL을 동적으로 생성 (0) | 2017.12.31 |
---|---|
[MyBatis] 동적 SQL (0) | 2017.12.31 |
[MyBatis] 배치(batch) 갱신 (0) | 2017.12.31 |
[MyBatis] 삭제 DELETE (0) | 2017.12.31 |
[MyBatis] 변경 UPDATE (0) | 2017.12.31 |
- Tag
- mybatis
0 Comments