persistence framework
: 데이터베이스는 서비스 중에 불안정한 상태가 되면 안된다. 지속성이 중요하다. 지속성, 활용도를 높일 수 있게 도와주는 프레임워크이다.
spring jdbcTemplate을 사용할 때 불편한 점이 있었다.
1. sql문 작성시 실수가 많이 일어날 수 있다.
2. sql문이 소스 안에 내장되어 있으면 테이블의 구조가 바뀌거나 sql문을 추가할 때 소스를 직접 열어서 수정해야 한다.
-> 오류를 줄이고 sql문을 확장, 변경할 시 편하도록 sql문을 별도의 파일로 분리하면 좋겠다.
jpa는 sql문을 작성하지 않아도 insert, update, delete시 테이블과 자바 vo객체를 자동으로 매핑시켜준다.
라이브러리 추가
BoardVO
package com.springbook.biz.board;
import java.util.Date;
public class BoardVO {
private int seq;
private String title;
private String writer;
private String content;
private Date regDate;
private String searchCondition;
private String searchKeyword;
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public String getSearchCondition() {
return searchCondition;
}
public void setSearchCondition(String searchCondition) {
this.searchCondition = searchCondition;
}
public String getSearchKeyword() {
return searchKeyword;
}
public void setSearchKeyword(String searchKeyword) {
this.searchKeyword = searchKeyword;
}
@Override
public String toString() {
return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content
+ ", searchCondition=" + searchCondition + ", searchKeyword=" + searchKeyword + "]";
}
}
마이바티스는 두가지 설정 파일이 필요하다.
mapper.xml
: sql문 작성
mybatis-config.xml
: java 객체와 연결
board-mapping.xml
#{title} : getTitle을 호출하는 것이다.
<?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="BoardDAO">
<insert id="insertBoard">
insert into board(seq, title, writer, content)
values((select nvl(max(seq), 0)+1 from board),
#{title},#{writer},#{content})
</insert>
<update id="updateBoard">
update board set title=#{title}, content=#{content}
where seq=#{seq}
</update>
<delete id="deleteBoard">
delete board where seq=#{seq}
</delete>
<select id="getBoard" resultType="board">
select * from board where seq=#{seq}
</select>
<select id="getBoardList" resultType="board">
select * from board
where title like '%'||#{searchKeyword}||'%'
order by seq desc
</select>
</mapper>
config파일 만들기
sql-map-config.xml
https://mybatis.org/mybatis-3/ko/getting-started.html 참고
<?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>
<!-- Properties 파일 설정 -->
<properties resource="db.properties"/>
<!-- Alias 설정 -->
<typeAliases>
<typeAlias alias="board" type="com.springbook.biz.board.BoardVO"/>
</typeAliases>
<!-- DataSource 설정 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- Sql Mapper 설정 -->
<mappers>
<mapper resource="mappings/board-mapping.xml"/>
</mappers>
</configuration>
db.properties
jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:tcp://localhost/~/test
jdbc.username=sa
jdbc.password=
SqlSessionFactoryBean
설정 정보를 읽어들이기 위한 입력 스트림 생성
getSqlSessionInstance() 메서드를 통해 SqlSession객체가 필요한 DAO 클래스를 구현할 수 있다.
package com.springbook.biz.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryBean {
private static SqlSessionFactory sessionFactory = null;
static {
try {
if(sessionFactory==null) {
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSessionInstance() {
return sessionFactory.openSession();
}
}
BoardDAO
package com.springbook.biz.board.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.util.SqlSessionFactoryBean;
public class BoardDAO {
private SqlSession mybatis;
public BoardDAO() {
mybatis = SqlSessionFactoryBean.getSqlSessionInstance();
}
public void insertBoard(BoardVO vo) {
mybatis.insert("BoardDAO.insertBoard", vo);
mybatis.commit();
}
public void updateBoard(BoardVO vo) {
mybatis.update("BoardDAO.updateBoard", vo);
mybatis.commit();
}
public void deleteBoard(BoardVO vo) {
mybatis.delete("BoardDAO.deleteBoard", vo);
mybatis.commit();
}
public BoardVO getBoard(BoardVO vo) {
return (BoardVO)mybatis.selectOne("BoardDAO.getBoard", vo);
}
public List<BoardVO> getBoardList(BoardVO vo){
return mybatis.selectList("BoardDAO.getBoardList", vo);
}
}
BoardServiceClient
package com.springbook.biz.board;
import java.util.List;
import com.springbook.biz.board.impl.BoardDAO;
public class BoardServiceClient {
public static void main(String[] args) {
BoardDAO boardDAO = new BoardDAO();
BoardVO vo = new BoardVO();
vo.setTitle("myBatis 제목");
vo.setWriter("홍길동");
vo.setContent("myBatis 내용입니다...");
vo.setSearchCondition("TITLE");
vo.setSearchKeyword("");
List<BoardVO> boardList = boardDAO.getBoardList(vo);
for(BoardVO board : boardList) {
System.out.println("---> " + board);
}
}
}
실행 결과