4-2 MyBatis로 DAO작성하기

서현우·2022년 5월 20일
0

스프링의정석

목록 보기
49/85

1. BoardDao의 작성

  1. DB테이블 생성
create table board {
	bno int auto_increment primary key,
	title varchar(45) not null,
	content text not null,
	writer varchar(30) not null,
	view_cnt int default 0 null,
	comment_cnt int default 0 null,
	reg_date datetime null
};
  1. Mapper XML & DTO 작성
<mapper namespace="com.fastcampus.ch4.dao.BoardMapper">
	<select id="select" parameterType="int" resultType="BoardDto">
		SELECT bno, title, content, writer
				, view_cnt, commnet_cnt, reg_date
		FROM board
		WHERE bno = #{bno}
	</select>
  1. DAO인터페이스 작성(구현한걸 Extract Interface하면 됨)
public interface BoardDao {
	BoardDto select(Integer bno) throws Exception;
	int delete(Integer bno) throws Exception;
	int insert(BoardDto dto) throws Exception;
	int update(BoardDto dto) throws Exception;
	int increaseView(Integer bno) throws Exception;
}
  1. DAO인터페이스 구현 & 테스트
@Repository
public class BoardDaoImpl implements BoardDao {
	@Autowired private SqlSession session
	private static String namespace
				= "com.fastcampus.ch4.dao.BoardMapper.";
				
	public BoardDto select(Integer bno) throws Exception {
		return session.selectOne(namespace + "select", bno);
	} //T selectOne(String statement, Object parameter)

DTO란? Data Transfer Object

계층간의 데이터를 주고 받기 위해 사용되는 객체

create table board {
	bno int auto_increment primary key,
	title varchar(45) not null,
	content text not null,
	writer varchar(30) not null,
	view_cnt int default 0 null,
	reg_date datetime null
};

//==>boardDto로 
public class BoardDto {
	//int가 아닌 Integer 타입으로 하면 null이 들어 왔을 때 에러X
	private Integer bno; //게시글번호
	private String title;
	private String content;
	private String writer;
	private int view_cnt;
	private int commnet_cnt;
	private Date reg_date;
	}
}

//DTO 사용
@Repository
public class BoardDaoImpl implements BoardDao {
	@Autowired private SqlSession session;
	private static String namespace
				= "com.fastcampus.ch4.dao.BoardMapper.";
				
	public BoardDto select(Integer bno) throws Exception {
		return session.selectOne(namespace + "select", bno);
	} //T selectOne(String statement, Object parameter)

관심사의 역할에 따라 계층 분리

@Controller

  • 요청과 응답을 처리
  • 데이터 유효성 검증
  • 실행 흐름을 제어(redirect & forward)

@Service

  • 비지니스 로직 담당
  • 트랜잭션 처리(Tx)
  • 예외 발생 시 3가지 방법
  1. Service에서 처리
  2. Controller로 보냄
  3. Service, Controller 두 곳에서 처리(예외 되던지기)

@Repository

  • 순수 Data Acess 기능(DAO)
  • 조회, 등록, 수정, 삭제
  • 예외처리를 안함.
  • 예외가 발생하면 무조건 Service 계층으로 보냄.

DTO는 각 계층간에 데이터를 전달하는 역할.

#{}와 ${}의 차이

//#{}
<insert id="insert" parameterType="BoardDto">
	INSERT INTO board
		(title, content, writer)
	VALUES
		(#{title}, #{content}, #{writer})
</insert>

//==> 
String sql = "INSERT INTO board "
			+ " (title, content, writer) "
			+ "VALUES "
			+ "(?, ?, ?)";

PreparedStatement pstmt = conn prepareStatement(sql);
int result = pstmt.executeUpdate();

//${}
<insert id="insert" parameterType="BoardDto">
	INSERT INTO board
			(title, content, writer)
	VALUES
		('${title}', '${content}', '${writer}')
</insert>

//==>
String sql = "INSERT INTO board "
			+ " (title, content, writer) "
			+ "VALUES "
			+ " (''+title+"', '"+content+"', '"+writer+"')";

Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);

4. XML의 특수 문자 처리

XML내의 특수 문자(<,>,&,...)는 &lt; &gt;로 변환 필요.
또는 특수문자가 포함된 쿼리를 <![CDATA[와]]>로 감싼다.
profile
안녕하세요!!

0개의 댓글