22.06.09
JDBC와는 다른 프레임워크, 많이 사용한다.
DAO대신 xml파일에 sql을 적는다.
Spring-Jdbc보다 간편하게 코딩할 수 있다.
Maven repository에서 mybatis,mybatis-spring 라이브러리 다운.
<!-- mybatis 라이브러리 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis와 spring을 연동해주는 api -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MyBatis SQL 동작을 위한 핵심 객체 SqlSessionPactory 클래스 빈 등록 -->
<!-- sqlSessionFactory 이름으로 컨테이너에 객체생성
dataSource 메서드에 앞서 생성한 dataSource를 주입시킨다.
ref는 참조속성 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<!-- 등록할 xml파일이 여러개일때 와일드카드를 사용해 규칙을 정해주는 방법. -->
<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml)"/>
<!-- 등록할 xml파일이 몇개 없을때. 절대경로로 적는 방법.
<property name="mapperLocations" >
<array>
<value>classpath:/mappers/board/BoardMapper.xml</value>
</array>
</property> -->
</bean>
<!-- 구현할 인터페이스 경로 -->
<!-- 지정한 패키지를 스캔하여 존재하는 mapper 인터페이스를 빈 타입으로 등록
나중에 sqlSessionFactory가 xml파일을 클래스로 변환하여 빈으로 등록하려는
시도를 할 때 타입을 지정해 줘야 하기때문.
해당 패키지를 스캔하여 xml파일을 객체(bean)로 생성 -->
<mybatis-spring:scan base-package="com.spring.db.repository"/>
<script>
package com.spring.db.repository;
public interface IScoreMapper {
//점수 등록
void insertScore(ScoreVO score);
//점수 전체 조회
List<ScoreVO> selectAllScores();
//점수 삭제
void deleteScore(int num);
//점수 개별 조회
ScoreVO selectOne(int num);
}
</script>
dao사용안하고 IScoreMapper 변수 mapper를 이용.
<script>
package com.spring.db.service;
@Service
public class ScoreService implements IScoreService {
//JdbcTemplate을 이용한 SQL 처리
// @Autowired
// private IScoreDAO dao;
//MyBatis를 이용한 SQL 처리.
@Autowired
private IScoreMapper mapper;
@Override
public void insertScore(ScoreVO score) {
score.calcData();//총점,평균 계산
System.out.println("service: " + score);
mapper.insertScore(score);
}
@Override
public List<ScoreVO> selectAllScores() {
return mapper.selectAllScores();
}
@Override
public void deleteScore(int num) {
mapper.deleteScore(num);
}
@Override
public ScoreVO selectOne(int num) {
return mapper.selectOne(num);
}
}
</script>
구현할 인터페이스를 등록하고 해당 인터페이스에 있는 메서드들을 모두 구현해야 한다.
태그를 이용해서 SQL문을 작성하고 id에는 구현할 메서드를 적는다.
세미콜론 ; 은 사용하지 않는다.
?는 사용하지 않고 #{변수명}을 사용한다.
<?xml version="1.0" encoding="UTF-8"?>
<!-- mybatis에 xml파일을 연결하는 선언 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace="구현할 인터페이스 등록" -->
<mapper namespace="com.spring.db.repository.IScoreMapper">
<resultMap type="com.spring.db.model.ScoreVO" id="ScoreMap">
<!-- property="변수명(setter메서드이름)" column="컬럼명" -->
<id property="stuId" column="stu_id" /> <!-- id는 primary key -->
<result property="stuName" column="stu_name" /> <!-- 나머지 컬럼은 다 result로 사용 -->
</resultMap>
<!-- 점수 등록 기능 id="구현할 메서드" -->
<insert id="insertScore">
INSERT INTO scores
VALUES(id_seq.NEXTVAL,#{stuName},#{kor},#{eng},#{math},#{total},#{average})
<!-- EL처럼 #{}안에 변수명만 정확하게 입력하면 값을 가지고 올 수 있다. -->
</insert>
<!-- 점수 목록 조회 기능, 리턴값이 있음(List<ScoreVO>) List는 mybatis가 자동으로 포장한다-->
<select id="selectAllScores" resultMap="ScoreMap">
SELECT * FROM scores
ORDER BY stu_id ASC
</select>
<!-- 점수 삭제 기능 -->
<delete id="deleteScore">
DELETE FROM scores
WHERE stu_id = #{num}
</delete>
<!-- 점수 개별조회 기능 -->
<select id="selectOne" resultMap="ScoreMap">
SELECT * FROM scores
WHRER stu_id = #{num}
</select>
</mapper>
<script>
package com.spring.db.service;
public interface IBoardService {
//게시글 등록
void insertArticle(BoardVO vo);
//전제 게시글 목록
List<BoardVO> getArticles();
//게시글 상세 보기
BoardVO getArticle(int bId);
//사용자로 글 검색
List<BoardVO> getSearchList(String keyword);
//게시글 삭제
void deleteArticle(int bId);
//게시글 수정
void updateArticle(BoardVO vo);
}
</script>
dao안쓰고 IBoardMapper를 참조.
<script>
package com.spring.db.service;
@Service
public class BoardService implements IBoardService {
// @Autowired
// @Qualifier("boardDAO")
// private IBoardDAO dao;
@Autowired
private IBoardMapper mapper;
@Override
public void insertArticle(BoardVO vo) {
mapper.insertArticle(vo);
}
@Override
public List<BoardVO> getArticles() {
return mapper.getArticles();
}
@Override
public BoardVO getArticle(int bId) {
return mapper.getArticle(bId);
}
@Override
public void deleteArticle(int bId) {
mapper.deleteArticle(bId);
}
@Override
public void updateArticle(BoardVO vo) {
mapper.updateArticle(vo);
}
@Override
public List<BoardVO> getSearchList(String keyword) {
return mapper.getSearchList("%"+keyword+"%");
//sql에서 LIKE쓰기 위해서 와일드카드 사용
}
}
</script>
<?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="com.spring.db.repository.IBoardMapper">
<resultMap type="com.spring.db.model.BoardVO" id="BoardMap">
<id property="boardNo" column="board_no"/>
</resultMap>
<!-- 게시글 등록 -->
<insert id="insertArticle">
INSERT INTO jdbc_board
VALUES(bid_seq.NEXTVAL, #{writer}, #{title}, #{content})
</insert>
<!-- 전체 게시물 목록 -->
<select id="getArticles" resultMap="BoardMap">
SELECT * FROM jdbc_board
ORDER BY board_no DESC
</select>
<!-- 게시글 상세 보기 -->
<select id="getArticle" resultMap="BoardMap">
SELECT * FROM jdbc_board
WHERE board_no = #{bId}
</select>
<!-- 게시글 삭제 -->
<delete id="deleteArticle">
DELETE FROM jdbc_board
WHERE board_no = #{bId}
</delete>
<!-- 게시글 수정 -->
<update id="updateArticle">
UPDATE jdbc_board SET writer=#{writer}, title=#{title}, content=#{content}
WHERE board_no=#{boardNo}
</update>
<!-- 사용자 이름으로 글 검색 -->
<select id="getSearchList" resultMap="BoardMap">
SELECT * FROM jdbc_board
WHERE writer LIKE #{writer} <!-- %는 service에서 붙여줌 -->
</select>
</mapper>