MyBatis | MyBatis란 | Hello World
설치
build.gradle
compile 'org.mybatis:mybatis:3.3.0'
compile 'mysql:mysql-connector-java:5.1.38'
데이터베이스 준비
여기서는 MySQL 5.5.28을 사용한다.
test_table
id | value |
---|---|
1 | hoge |
2 | fuga |
3 | pjyo |
폴더 구성
.
├── src/main/
├── java
│ └── sample/mybatis/
│ └── Main.java
├── resources
│ ├── mybatis-config.xml
│ └── sample_mapper.xml
└── build.gradle
설정 파일
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="sample_id">
<environment id="sample_id">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/test"/>
<property name="username" value="test"/>
<property name="password" value="test"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sample_mapper.xml"/>
</mappers>
</configuration>
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">
<select id="selectTest" resultType="map">
select * from test_table
</select>
</mapper>
구현
Main.java
package sample.mybatis;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
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를 생성한다.
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
// SqlSessionFactory에서 SqlSession을 생성한다.
try (SqlSession session = factory.openSession()) {
// SqlSession을 사용하여 SQL을 실행한다.
List<Map<String, Object>> result = session.selectList("sample.mybatis.selectTest");
result.forEach(row -> {
System.out.println("---------------");
row.forEach((columnName, value) -> {
System.out.printf("columnName=%s, value=%s%n", columnName, value);
});
});
}
}
}
}
실행 결과
---------------
columnName=id, value=1
columnName=value, value=hoge
---------------
columnName=id, value=2
columnName=value, value=fuga
---------------
columnName=id, value=3
columnName=value, value=piyo
설명
설정 파일
- 첫째, 데이터베이스 연결 정보 등을 정의하는 기본이 되는 설정 파일을 준비한다(mybatis-config.xml).
- 그런 다음 SQL 문장과 검색 결과의 매핑 방법 등을 정의한 파일을 준비한다(sample_mapper.xml).
구현
- 먼저, SqlSessionFactoryBuilder를 사용하여 설정 파일(mybatis-config.xml)을 읽는다.
- SqlSessionFactory를 사용하여 SqlSession을 생성한다.
- SqlSession에 포함되어 있는 SQL 실행을 위한 메소드를 사용하여 SQL 실행한다(selectList()).
- 첫 번째 인수는 실행할 SQL을 식별하는 ID (스테이트먼트 ID)를 지정한다.
- 스테이트먼트 ID와 반환 형식은 sample_mapper.xml에서 정의된 정보를 바탕으로 하고 있다.
각 인스턴스의 권장 범위(scope)
인스턴스 | 설명 | 권장 범위 |
---|---|---|
SqlSessionFactoryBuilder | SqlSessionFactory를 만들면 끝이다. | 메소드 범위 |
SqlSessionFactory | 한번 만들면, 그것을 사용하도록 한다. | 응용 프로그램 범위 |
SqlSession | 비 스레드 안전. 일련의 SQL 실행이 끝나면 닫는다. | 요청 범위 |
Mapper 인스턴스 | SqlSession과 동일해야 하지만, 좀 더 짧은 범위가 좋다. | 메소드 범위 |
Mapper에 대해서는 나중에 설명하겠다
- 메소드 범위
- 메소드 내에서만 사용하고 버린다.
- 요청 범위
- Web 응용 프로그램에서 하나의 요청 동안만 동일한 인스턴스를 사용한다.
- 다른 요청에서 참조하지 않도록 한다.
- 응용 프로그램 범위
- 응용 프로그램이 실행되는 동안 계속 같은 인스턴스를 사용한다.
최종 수정 : 2021-08-26