The MyBatis Blog
A blog about the the MyBatis data mapper framework.
blog.mybatis.org
다운로드 후 빌드 처리
slf4j-log4j12-1.7.21.jar 파일은 없어서 따로 빌드처리 해주었다.
마이바티스 참조 문서 :https://mybatis.org/mybatis-3/ko/
먼저 mybatis 환경설정파일 [mybatis-config.xml]을 만들어보자.
mybatis 환경설정파일은 SqlSessionFactofy 객체를 생성하기 위해 필요한 정보를 제공하는 파일이다.
먼저 <!DOCTYPE configuration> 선언문을 추가한다.
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
이제 엘리먼트를 등록해보자.
environments : environment 엘리먼트를 등록하기 위한 상위 엘리먼트
- default 속성 : environment 엘리먼트의 식별자(id 속성값)을 속성값으로 설정한다. (mybatis 프레임워크가 기본적으로 사용하기 위한 접속 DBMS 서버를 지정하는 것임)
environment : DBMS 서버 접속에 필요한 정보를 설정하기 위한 엘리먼트 (여러개 등록 가능)
→ Connection 객체를 생성하기 위한 정보를 제공한다.
- id 속성 : environment 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.
<configuration>
<environments default="development">
<environment id="development">
<!--엘리먼트 작성-->
<!--엘리먼트 작성-->
<!-- ....... -->
</environment>
</environments>
</configuration>
transactionManager : 트랜잭션 관리자(커밋 또는 롤백 처리)를 설정하기 위한 엘리먼트
- type 속성 : [JDBC] 또는 [MANAGED] 둘 중 하나를 속성값으로 설정한다.
→ JDBC 속성값 : JDBC 기능을 사용하여 직접 트랜잭션을 관리 - Connection 객체의 메소드 호출
→ MANAGED 속성값 : 트랜잭션 관리 프로그램을 사용하여 트랜잭션 관리
<!-- JDBC 기능을 사용하여 직접 트랜잭션을 관리 -->
<transactionManager type="JDBC"/>
dataSource : Connection 객체를 생성하기 위한 정보를 제공하는 엘리먼트
- type 속성 : [UNPOOLED], [POOLED], [JNDI] 중 하나를 속성값으로 설정한다.
type 속성값에 따라 하위 엘리먼트 설정이 변경된다.
→ UNPOOLED 속성값 : Connection 객체를 미리 생성하지 않고 실행시 생성하여 제공받을 수 있다.
→ POOLED 속성값 : Connection 객체를 미리 생성하여 실행시 제공받을 수 있다. - DBCP
→ JNDI 속성값 : Connection 객체를 WAS 프로그램에 등록된 자원을 이용하여 실행시 제공받을 수 있다.
property : Connection 객체 생성에 필요한 값을 제공하는 엘리먼트
- name 속성 : Connection 객체 생성에 필요한 값이 저장될 이름을 속성값으로 설정한다.
- value 속성 : Connection 객체에 필요한 값을 속성값으로 설정한다.
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
mappers : mapper 엘리먼트를 등록하기 위한 상위 엘리먼트
mapper : 매퍼 파일(MapperFile)을 *매퍼(Mapper)로 등록하기 위한 엘리먼트
*매퍼(Mapper)는 SQL 명령에 필요한 값을 전달받아 SQL 명령을 등록하고 실행결과를 Java 객체(원시형)으로 매핑하기 위한 정보를 제공한다.
→ mybatis 프레임워크에서는 XML 기반의 매퍼 파일과 Interface 기반의 매퍼 파일을 이용하여 매퍼를 등록할 수 있다.
→ ibatis 프레임워크에서는 XML 기반의 매퍼 파일로만 매퍼 등록이 가능했다.
- resource 속성 : XML 기반의 매퍼 파일의 경로를 속성값으로 설정한다.
→ XML 기반의 매퍼 파일 경로는 파일 시스템 경로로 표현하여 작성하면 된다.
<mappers>
<mapper resource="xyz/itiwll/mapper/StudentMapper.xml"/>
</mappers>
< mybatis-config.xml 전체 소스코드>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
먼저 XML 기반의 매퍼파일을 만들어보자.
XML 기반의 매퍼파일은 엘리먼트를 사용하여 SQL 명령을 등록하기 위한 파일이다.
매퍼파일은 mybatis 환경 설정 파일에서 mapper 엘리먼트를 사용하여 매퍼로 등록해야만 사용이 가능하다.
mpper : SQL 명령을 등록하기 위한 상위 엘리먼트
- namespace 속성 : 매퍼를 구분하기 위한 식별자를 속성값으로 설정
→ SqlSession 객체를 필요한 SQL 명령이 등록된 매퍼를 구분하기 위해 사용한다.
→ mybatis 프레임워크에서는 namespace 속성값을 Java 자료형 형식으로 표현하여 작성하는 것을 권장한다.
(권장일뿐 형식이 정해져 있는 것은 아니며, 다른 매퍼와 namespace가 충돌만 일어나지 않으면 된다.)
→ 참고) ibatis 프레임워크에서는 namespace 속성 생략이 가능하다.
[StudentMapper.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper"></mapper>
이제 VO 클래스인 [Student] 클래스를 선언하자.
테이블의 컬럼명과 같은 이름으로 필드명을 작성하여 클래스를 선언하는 것을 권장한다.
→ mybatis 프레임워크의 SqlSession 객체는 검색행의 컬럼값을 같은 이름의 필드에 자동 매핑되어 저장하기 때문이다.
package xyz.itwill.dto;
/*
이름 널? 유형
-------- -------- -------------
NO NOT NULL NUMBER(4)
NAME VARCHAR2(50)
PHONE VARCHAR2(20)
ADDRESS VARCHAR2(100)
BIRTHDAY DATE
*/
//테이블의 컬럼명과 같은 이름으로 필드명을 작성하여 클래스를 선언하는 것을 권장한다.
// => mybatis 프레임워크의 SqlSession 객체는 검색행의 컬럼값은 같은 이름의 필드에 자동 매핑되어 저장
public class Student {
private int no;
private String name;
private String phone;
private String address;
private String birthday;
public Student() {
// TODO Auto-generated constructor stub
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
다시 매퍼 파일로 돌아가서 마저 작성하자
select : SELECT 명령을 등록하기 위한 엘리먼트
- id 속성 : 매퍼 파일에 등록된 SQL 명령을 구분하기 위한 식별자를 속성값으로 설정 (DAO 클래스의 메소드 이름과 동일한 역할)
- resultType :속성 : SQL 명령의 실행결과를 객체로 매핑하여 제공하기 위한 Java 자료형을 속성값으로 설정한다.
→ SELECT 명령으로 실행된 하나의 검색행에 대한 Java 자료형을 설정하여 Java 객체로 매핑 처리한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper">
<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
select no, name, phone, address, birthday from student order by no
</select>
</mapper>
[StudentDAO 클래스]
StudentDAO 클래스에 메소드를 선언한다.
StudentDAO 클래스는 싱클톤 패턴으로 작성한다.
public class StudentDAO {
private static StudentDAO _dao;
private StudentDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new StudentDAO();
}
public static StudentDAO getDAO() {
return _dao;
}
//코드작성
//...
}
JDBC를 이용하는 것이 아니라, mybatis를 이용해 DAO 클래스에 메소드를 선언해볼것이다.
→ SqlSession 객체의 메소드를 호출하여 매퍼에 등록된 정보를 이용하여 SQL 명령을 전달해 실행하고 결과를 Java 객체로 반환받아 사용할 수 있다.
이를 위해 SqlSessionFactory 객체를 생성하여 반환하는 메소드를 먼저 선언해주어야한다.
SqlSessionFactory 객체는 SqlSession 객체를 생성하여 제공하기 위한 객체이다.
→ SqlSessionFactory 객체를 생성하기 위해서는 mybatis 환경설정파일(mybatis-config.xml)이 필요하다.
Resources.getResourceAsStream(resource) : 매개변수에 mybatis 환경설정파일경로를 전달받아 파일 입력스트림을 생성하여 반환하는 메소드
SqlSessionFactoryBuilder.build(InputStream inputStream) : 매개변수로 mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환하는 메소드
private SqlSessionFactory getSqlSessionFactory() {
//만약 mybatis 환경설정파일을 패키지에 작성한 경우 파일 시스템 경로(/)로 표현
//String resource="xyz/itwill/config/mybatis-config.xml";
String resource="mybatis-config.xml";
InputStream inputStream=null;
try {
//mybatis 환경설정파일 경로를 전달받아 파일 입력스트림을 생성해 반환
inputStream=Resources.getResourceAsStream(resource);
} catch (IOException e) {//mybatis 환경설정파일이 없는 경우 예외 발생
throw new IllegalArgumentException();
}
//mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환
return new SqlSessionFactoryBuilder().build(inputStream);
}
이제 메소드를 선언해보자
SqlSessionFactory.openSession() : SqlSession 객체를 생성하여 반환하는 메소드
→ SqlSessinon 객체 : 매퍼에 등록된 정보를 이용하여 SQL 명령을 제공받아 실행하고 실행결과를 Java 객체로 매핑 처리하여 반환하는 기능을 제공하는 객체
SqlSession.selectList(String elementId) : 매퍼에 등록된 SELECT 명령을 제공받아 DBMS 서버에 전달하여 실행하고 실행결과를 List 객체로 반환하는 메소드
→ elementId 매개변수에는 매퍼의 식별자(mapper 엘리먼트의 namespace 속성값)와 select 엘리먼트의 식별자(id 속성값) 을 이용한 문자열을 전달받아 매퍼에 등록된 SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑 처리하여 반환한다.
SqlSession.close : SqlSession 객체가 사용한 JDBC 관련 객체를 제거하는 메소드
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
public List<Student> selectStudentList() {
SqlSession sqlSession=getSqlSessionFactory().openSession();//SqlSession 객체 생성해 반환
try {
//SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑처리하여 반환
return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
} finally {
//SqlSession 객체가 사용한 JDBC 관련 객체를 제거
sqlSession.close();
}
}
전체소스코드
package xyz.itwill.dao;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import xyz.itwill.dto.Student;
public class StudentDAO {
private static StudentDAO _dao;
private StudentDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new StudentDAO();
}
public static StudentDAO getDAO() {
return _dao;
}
//SqlSessionFactory 객체를 생성하여 반환하는 메소드
private SqlSessionFactory getSqlSessionFactory() {
//만약 mybatis 환경설정파일을 패키지에 작성한 경우 파일 시스템 경로(/)로 표현
//String resource="xyz/itwill/config/mybatis-config.xml";
String resource="mybatis-config.xml";
InputStream inputStream=null;
try {
//mybatis 환경설정파일 경로를 전달받아 파일 입력스트림을 생성해 반환
inputStream=Resources.getResourceAsStream(resource);
} catch (IOException e) {//mybatis 환경설정파일이 없는 경우 예외 발생
throw new IllegalArgumentException();
}
//mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환
return new SqlSessionFactoryBuilder().build(inputStream);
}
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
public List<Student> selectStudentList() {
SqlSession sqlSession=getSqlSessionFactory().openSession();//SqlSession 객체 생성해 반환
try {
//SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑처리하여 반환
return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
} finally {
//SqlSession 객체가 사용한 JDBC 관련 객체를 제거
sqlSession.close();
}
}
}
mybatis가 제대로 동작되는지 확인하기 위해 jsp 문서를 만들어보자
[student.jsp]
<%@page import="xyz.itwill.dao.StudentDAO"%>
<%@page import="xyz.itwill.dto.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
List<Student> studentList=StudentDAO.getDAO().selectStudentList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
border: 1px solid black;
border-collapse: collapse;
}
td {
border: 1px solid black;
text-align: center;
padding: 10px;
}
</style>
</head>
<body>
<h1>학생목록</h1>
<hr>
<table>
<tr>
<td>학번</td>
<td>이름</td>
<td>전화번호</td>
<td>주소</td>
<td>생년월일</td>
</tr>
<% for(Student student : studentList) { %>
<tr>
<td><%=student.getNo() %></td>
<td><%=student.getName() %></td>
<td><%=student.getPhone() %></td>
<td><%=student.getAddress() %></td>
<td><%=student.getBirthday().substring(0, 10) %></td>
</tr>
<% } %>
</table>
</body>
</html>
결과가 잘 출력된다.
mybatis 환경설정파일에서 선언할 수 있는 엘리먼트들을 추가로 알아보자.
properties : property 엘리먼트를 등록하기 위한 상위 엘리먼트
property : mybatis 환경설정파일에 필요한 값을 제공하기 위한 엘리먼트
→ 다른 엘리먼트에서 ${이름} 형식으로 property 엘리먼트로 제공되는 값을 사용
property는 다수의 엘리먼트에서 공통적으로 사용되는 값을 제공하기 위해 설정한다 . 중복성을 최소화하여 유지보수의 효율성을 높일 수 있다.
[mybatis-config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis 환경설정파일 : SqlSessionFactory 객체를 생성하기 위해 필요한 정보를 제공하는 파일-->
<configuration>
<properties>
<property name="oracleDriver" value="oracle.jdbc.driver.OracleDriver"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> -->
<!-- ${이름} 형식으로 property 엘리먼트로 제공되는 값을 사용할 수 있다 -->
<property name="driver" value="${oracleDriver}"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
이번엔 resource 속성을 이용해 Properties 파일의 경로를 속성값으로 설정해보자
[oracle_url.properties]
오라클 서버의 url 주소를 저장
#name = value
local = jdbc:oracle:thin:@localhost:1521:xe
server = jdbc:oracle:thin:@www.itwill.xyz:1521:xe
resource 속성 : Properties 파일의 경로를 속성값으로 설정한다. (생략 가능)
→ property 엘리먼트 대신 Properties 파일의 등록된 정보를 이용하여 이름으로 값을 제공받아 사용할 수 있다.
[mybatis-config.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis 환경설정파일 : SqlSessionFactory 객체를 생성하기 위해 필요한 정보를 제공하는 파일-->
<configuration>
<properties resource="oracle_url.properties">
<property name="oracleDriver" value="oracle.jdbc.driver.OracleDriver"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> -->
<property name="driver" value="${oracleDriver}"/>
<!-- <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> -->
<!-- Properties 파일의 등록된 정보를 이용하여 이름으로 값을 제공받아 사용 -->
<property name="url" value="${local}"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>
</mappers>
</configuration>
setting : mybatis 실행시 필요한 정보를 제공하기 위한 엘리먼트
→ setting 엘리먼트를 사용하지 않아도 실행에 필요한 값은 기본값으로 제공받아 사용할 수 있다.
→ mybatis 실행을 기본값을 제외한 값으로 제공받아 사용할 경우에만 setting 엘리먼트를 설정하면 된다.
ex) callSettersOnNulls 기능을 [true]로 설정하면 UPDATE 명령 실행시 컬럼값을 NULL로 변경하는 기능을 허용한다.
<settings>
<setting name="callSettersOnNulls" value="true"/>
</settings>
아래의 페이지에서 setting 엘리먼트에 대한 환경설정들에 대한 정보를 알 수 있다.
https://mybatis.org/mybatis-3/ko/configuration.html#settings
MyBatis – 마이바티스 3 | 매퍼 설정
매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할
mybatis.org
typeAliases : typeAliase 엘리먼트를 등록하기 위한 상위 엘리먼트
typeAliase : XML 기반의 매퍼 파일에서 Java 자료형 대신 사용할 별칭 별칭(AliasName)을 설정하기 위한 엘리먼트
→ mybatis 프레임워크는 내부적으로 Java 자료형에 대신 사용할 별칭을 제공한다.
- type 속성 : Java 자료형을 속성값으로 설정한다.
- alias 속성 : Java 자료형 대신 사용될 별칭을 속성값으로 설정한다.
<typeAliases>
<typeAlias type="xyz.itwill.dto.Student" alias="Student"/>
</typeAliases>
[StudentMapper.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper">
<!--
<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
select no, name, phone, address, birthday from student order by no
</select>
-->
<select id="selectStudentList" resultType="Student">
select * from student order by no
</select>
</mapper>
이처럼 resultType 속성값으로 Java 자료형 대신 별칭(AliasName) 사용이 가능하다.
Java 자료형을 쉽게 표현하기 위해 별칭을 사용하며, 유지보수의 효율성이 증가한다.
'학원 > 복기' 카테고리의 다른 글
[MyBatis] 매퍼 바인딩 / package 엘리먼트 (0) | 2023.07.19 |
---|---|
[MyBatis] 예제 (0) | 2023.07.18 |
[MVC] 필터(Filter) (0) | 2023.07.16 |
[MVC] Functions 태그 라이브러리 (0) | 2023.07.16 |
[MVC] Formatter 태그 라이브러리 (0) | 2023.07.16 |