Spring CRUD
테이블과 VO를 생성한 뒤, 테스트용 값들을 넣어줍니다.(☆커필밋수☆)
root-context.xml에 Mapper인터페이스 클래스를 적어준다.
<!-- Mapper 인터페이스를 이용해서 실제 SQL 처리가 되는 클래스를 자동으로 생성 -->
<!-- mapper 인터페이스를 담을 패키지를 지정해주면 댐~! -->
<mybatis-spring:scan base-package="org.zerock.mapper" />
create
BoardMapper 인터페이스 생성
BoardMapper.java
package org.zerock.mapper;
public interface BoardMapper {
@Select("select * from tbl_board where bno >0")
public List<BoardVO> getList();
}
콘솔에 데이터가 잘 뿌려지는지 확인
BoardServiceTests.java
package org.zerock.service;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {
@Setter(onMethod_ = {@Autowired})
private BoardService service;
@Test
public void testGetList() {
service.getList().forEach(board -> log.info(board));
}
이제 SQL을 작성할 BoardMapper.xml 파일을 생성해 준다.(이제 아까 select어노테이션은 지워주자)
src/main/recources /org/zerock/mapper/BoardMapper.xml
mapper태그 안에 SQL문을 작성해준다.
BoardMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis3를 참조해서 만들겟다! -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.mapper.BoardMapper">
<select id="getList" resultType="org.zerock.domain.BoardVO">
<![CDATA[select * from tbl_board where bno > 0]]>
<!-- cdata로 감싸주면 연산자 자유롭게 사용 가넝~! 원래도 자유롭게 사용가능하긴 함 ㅎ -->
</select>
</mapper>
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
mapper가 인터페이스, xml이 쿼리문이고, tests로 구현해보는 중인거임
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
insert
BoardMapper 인터페이스
public void insert(BoardVO board);
public void insertSelectKey(BoardVO board);
BoardMapper.xml
<!-- [1] 그냥 INSERT -->
<insert id="insert">
insert into tbl_board (bno, title, content, writer)
values(seq_board.nextval, #{title} ,#{content},#{writer})
<!-- ${}얘가 물음표에 set까지 해줌 -->
</insert>
<!-- [2] INSERT 되고, PK값 알아오기 -->
<insert id="insertSelectKey">
<!-- 변수를 만들어서 key값을 들고온거임!(미리) -->
<selectKey keyProperty="bno" order="BEFORE" resultType="long">
select seq_board.nextval from dual
</selectKey>
insert into tbl_board (bno, title, content, writer)
values(#{bno}, #{title} ,#{content},#{writer})
<!-- ${}얘가 물음표에 set까지 해줌 -->
</insert>
콘솔에 데이터가 잘 뿌려지는지 확인
BoardServiceTests.java
그냥 insert를 했을 때는 bno가 null값이 뜨고,
selectKey를 미리 구하고 insert 했을 때는 bno의 값이 뜬다.
@Test
public void testInsert() {
BoardVO board = new BoardVO();
board.setTitle("새로 추가되는 게시글");
board.setContent("새로 추가되는 게시글 내용");
board.setWriter("작성자");
mapper.insert(board);
log.info(board); //Lombok이 만들어주는 toString()을 이용해 BoardVO 값을 확인 할 수 있다.
//BoardVO(bno=null, title=새로 추가되는 게시글, content=새로 추가되는 게시글 내용, writer=작성자, regdate=null, updateDate=null)
log.info("after insert : " + board.getBno());
}
@Test
public void testInsertSelectKey() {
BoardVO board = new BoardVO();
board.setTitle("새 작성글 select key");
board.setContent("새 작성 내용");
board.setWriter("user02");
mapper.insertSelectKey(board);
log.info(board);
log.info("after insertSelectKey : " + board.getBno());
}
detail
BoardMapper 인터페이스
public BoardVO read(Long bno);
BoardMapper.xml
<select id="read" resultType="org.zerock.domain.BoardVO">
select * from tbl_board where bno= #{bno}
</select>
BoardServiceTests.java
@Test
public void testRead() {
BoardVO board = mapper.read(4L); //long타입이므로 L붙여줌
log.info(board);
}
delete, update
BoardMapper.java
public int delete(Long bno);
public int update(BoardVO board);
BoardMapper.xml
<delete id="delete">
delete from tbl_board where bno = #{bno}
</delete>
<update id="update">
update tbl_board
set title = #{title},
content=#{content},
writer=#{writer},
updateDate = sysdate
where bno= #{bno}
</update>
BoardServiceTests.java
@Test
public void testDelete() {
log.info("DELETE count : " + mapper.delete(4L));
}
@Test
public void testUpdate() {
BoardVO board = new BoardVO();
board.setBno(22L);
board.setTitle("변경된 제목");
board.setContent("변경된 내용");
board.setWriter("변경자");
int count = mapper.update(board);
log.info("Update count : "+count );
}
sevice
BoardService 인터페이스
package org.zerock.service;
public interface BoardService {
public List<BoardVO> getList();
public void register(BoardVO board);
public BoardVO get(Long bno);
public boolean remove(Long bno);
public boolean modify(BoardVO board);
}
BoardServiceImpl.java @Service
package org.zerock.service;
@Service //비즈니스영역을 담당하는 객체임을 표시
@AllArgsConstructor //@setter @Autowired 생략가넝(필요한 파라미터 자동주입)
@Log4j
public class BoardServiceImpl implements BoardService {
//@Setter(onMethod_ = @Autowired)
private BoardMapper mapper;
@Override
public List<BoardVO> getList() {
log.info("getList.........");
return mapper.getList();
}
@Override
public void register(BoardVO board) {
log.info("register........."+board);
mapper.insertSelectKey(board);
}
@Override
public BoardVO get(Long bno) {
log.info("get........."+bno);
return mapper.read(bno);
}
@Override
public boolean remove(Long bno) {
log.info("remove........."+bno);
return mapper.delete(bno) == 1;
}
@Override
public boolean modify(BoardVO board) {
log.info("modify........."+board);
return mapper.update(board) == 1; //성공했으면 1
}
}
root-context.xml에 추가
<!-- @Service붙은애 있나 봐바~~ -->
<context:component-scan base-package="org.zerock.service"></context:component-scan>
테스트
BoardServiceTests.java
package org.zerock.service;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardServiceTests {
@Setter(onMethod_ = {@Autowired})
private BoardService service;
@Test
public void testExist() {
log.info("serviceㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
log.info(service);
assertNotNull(service);
}
@Test
public void testRegister() {
log.info("Registerㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
BoardVO board = new BoardVO();
board.setTitle("제목 새로 작성한다.");
board.setContent("내용 새로 작성한다.");
board.setWriter("김새로");
service.register(board);
log.info("생성된 게시물의 번호 : "+board.getBno());
}
@Test
public void testGetList() {
service.getList().forEach(board -> log.info(board));
}
@Test
public void testGet() {
log.info(service.get(2L));
}
@Test
public void testDelete() {
log.info("remove result ========= "+service.remove(27L));
}
@Test
public void testModify() {
BoardVO board = service.get(21L);
if(board == null) {return;}
board.setTitle("수정수정수정!!!");
log.info("modify result ========= "+service.modify(board));
}
}