영속계층(DB, Mapper) 구현
- 테이블 반영하여 VO 생성
- Mapper 인터페이스 작성
- XML 처리
- Mapper 인터페이스 테스트
1. 게시판 VO 클래스 작성
-
org.example.domain
패키지 하위에 작성 BoardVO.java
@Data
public class BoardVO {
private long bno;
private String title;
private String content;
private String writer;
private Date regdate;
private Date updatedate;
}
2. 게시판 Mapper 인터페이스 작성
-
org.example.mapper
패키지 하위에 작성 BoardMapper.java
public interface BoardMapper {
@Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
}
3. Mapper 인터페이스 TEST
- src/test/java 폴더 하위에
org.example.mapper
패키지 생성 BoardMapperTest.java
- 테스트를 통과하면, MapperXML 을 작성한다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
//@ContextConfiguration(classes={RootConfig.class})
@Log4j
public class BoardMapperTest {
@Autowired
private BoardMapper mapper;
@Test
public void testGetList() {
mapper.getList().forEach(board -> log.info(board));
}
}
4. Mapper XML 작성
- BoardMapper.java 인터페이스에서 @Select 어노테이션 부분을 삭제한 후 진행한다.
-
src/main/resource
폴더 하위에org > example > mapper
폴더를 만든다. (!한 단계씩 만들어야 함.) - org/example/mapper 폴더 하위에
BoardMapper.xml
파일을 작성한다.-
namespace
: mapper 인터페이스의 위치와 같게 한다. - CDATE : 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="org.example.mapper.BoardMapper"> <select id='getList' resultType='org.example.domain.BoardVO'> <![CDATA[ select * from tbl_board where bno > 0 ]]> </select> </mapper>
-
- 이전에 작성해 둔 BoardMapperTest.java 를 테스트한다. (결과는 이전과 같아야 함)
5. CRUD 구현
1-0. BoardVO.java
@Data
public class BoardVO {
private Long bno;
private String title;
private String content;
private String writer;
private Date regdate;
private Date updateDate;
@Builder
public BoardVO(Long bno, String title, String content, String writer) {
this.bno = bno;
this.title = title;
this.content = content;
this.writer = writer;
}
}
1-2. BoardMapper.java
public interface BoardMapper {
//@Select("select * from tbl_board where bno > 0")
public List<BoardVO> getList();
public void insert(BoardVO vo);
//mySql에서는 xml의 useGeneratedKeys 속성을 사용하여, insert 하거나 update 한 키값을 리턴 받을 수 있는데
//안되고 있음. 이유를 잘 모르겠다.
public void insertSelectKey(BoardVO vo);
public BoardVO read(Long bno);
public int update(BoardVO vo);
public int delete(Long bno);
}
1-3. BoardMapper.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="org.example.mapper.BoardMapper">
<select id='getList' resultType='org.example.domain.BoardVO'>
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>
<insert id="insert">
insert into tbl_board (title, content, writer)
values (#{title}, #{content}, #{writer})
</insert>
<insert id="insertSelectKey" parameterType="org.example.domain.BoardVO" useGeneratedKeys="true" keyProperty="org.example.domain.BoardVO.bno" keyColumn="bno" >
insert into tbl_board (title, content, writer)
values (#{title}, #{content}, #{writer})
</insert>
<select id="read" resultType="org.example.domain.BoardVO">
select * from tbl_board where bno = #{bno}
</select>
<update id="update">
update tbl_board
set title = #{title},
content = #{content},
writer = #{writer},
updatedate = CURRENT_TIMESTAMP
where bno = #{bno}
</update>
<delete id="delete">
delete from tbl_board
where bno = #{bno}
</delete>
</mapper>
1-4. BoardMapperTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
@Log4j
public class BoardMapperTest {
@Autowired
private BoardMapper mapper;
//@Test
public void testGetList() {
mapper.getList().forEach(board -> log.info(board));
}
//@Test
public void testInsert() {
BoardVO vo = BoardVO.builder()
.title("타이틀-insertTest")
.content("컨텐츠-insertTest")
.writer("user01")
.build();
mapper.insert(vo);
log.info("insert Test::");
log.info(vo);
}
@Test
public void testInsertSelectKey() {
BoardVO vo = BoardVO.builder()
.title("타이틀-insertTest")
.content("컨텐츠-insertTest")
.writer("user01")
.build();
mapper.insert(vo);
log.info("insertSelectKey Test::");
log.info(vo);
}
// @Test
public void testUpdate() {
BoardVO vo = BoardVO.builder()
.bno(1L)
.title("타이틀-updateTest")
.content("컨텐츠-updateTest")
.writer("user01")
.build();
log.info("update Test::");
log.info("result:" + (mapper.update(vo) == 1));
}
// @Test
public void testDelete() {
log.info("delete Test::");
log.info("result:" + (mapper.delete(2L) == 1));
}
}