Mybatis는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.
SQL을 별도의 파일로 분리해서 관리하게 해준다.
즉, 복잡한 JDBC코드를 작성하지 않고 깔끔한 소스코드를 유지할 수 있다.
properties는 자바와 mariaDB를 연동
하기 위해 사용했던 Driver라고 생각하면 된다.
별도의 파일을 생성하여 코드를 작성한다.
driver=org.mariadb.jdbc.Driver
url=jdbc:mariadb://127.0.0.1:3306/test
username= //사용자 지정
password= //사용자 지정
Mapper는 자바와 DB를 연결한 상태에서 그 해당 데이터베이스에 SQL쿼리문을 작성할 수 있는 파일이다.
<mapper namespace="dev">
<select id="selectDataAll" resultType="pack.SangpumDto" statementType="PREPARED">
select * from sangdata order by code asc
</select>
</mapper>
select 태그에서 id속성은 해당 태그안에 있는 쿼리를 호출할 때 사용할 메서드의 이름을 식별하기 위한 것이다.
resultType은 속성은 SQL 쿼리의 실행 결과를 어떤 형태로 매핑할지를 지정하는 것이다.
resultType속성에서 왜 SangpumDto 타입으로 해줬을까?
데이터베이스 테이블 sangdata의 각 행의 정보를 SangpumDto 클래스의 객체에 매핑하기 위해서이다.
<configuration>
<properties resource="pack/db.properties" />
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="pack/DataMapper.xml" />
</mappers>
</configuration>
이 파일은 데이터베이스 연결 정보를 읽어들이고, 데이터베이스와의 연결을 설정한 다음, SQL 쿼리와 자바 객체 간의 매핑을 처리할 수 있도록 정보를 읽어 들인다.
쉽게 말해 properties에서 설정한 DB연결 정보와 DataMapper안에서 작성한 쿼리문들의 정보를 담고 있는 파일이다.
public class SqlMapConfig {
// mybatis 에서는 DB에 연동하는 Connection객체를 SqlSession이라 부른다.
public static SqlSessionFactory sqlSession;
static {
String resource = "pack/Configuration.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
// "pack/Configuration.xml" 읽어서 sqlSession 객체에 부여
sqlSession = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (Exception e) {
System.out.println("SqlMapConfig 오류 : " + e);
}
}
public static SqlSessionFactory getSqlSession() { // static이니 new 키워드를 안쓴다.
return sqlSession;
}
}
sqlSession
객체는 SqlSessionFactory에 의해서 생성된다.
이 클래스 파일에서는 앞에 Configuration.xml 설정 파일을 불러오고 설정 정보를 가져온다.
Reader라는 객체를 통해 불러온 설정파일을 읽고, sqlSession 객체에 담아둔다.
public class ServiceDao {
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
// 데이터베이스에 저장되어 있는 복수개의 데이터값을 담기 위해 List사용
public List<SangpumDto> selectAll() throws Exception {
// SqlSession를 생성하기 위해 SqlSessionFactory를 사용한다.
// 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할수 있다.
SqlSession sqlSession = factory.openSession(); // 세션(SQL 매핑 처리(단위) 열기
// select은 메서드 이름이다. DataMapper.xml의 id를 호출
List<SangpumDto> list = sqlSession.selectList("selectDataAll");
sqlSession.close();
return list;
}
}
public class Main {
public static void main(String[] args) {
ServiceDao dao = new ServiceDao();
try {
System.out.println("전체 자료 읽기");
List<SangpumDto> list = dao.selectAll();
for(SangpumDto s:list) {
System.out.println(s.getCode() + " " + s.getSang() + " " +
s.getSu() + " " + s.getDan());
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
그림으로 표현하자면 다음과 같다.
mybatis에 대한 글 잘 읽고 갑니다~