Spring MyBatis 프레임워크

정원·2022년 6월 9일
0

Spring

목록 보기
11/11

22.06.09
JDBC와는 다른 프레임워크, 많이 사용한다.
DAO대신 xml파일에 sql을 적는다.
Spring-Jdbc보다 간편하게 코딩할 수 있다.

MyBatis?

  • 개발자가 지정한 SQL, 고급 매핑(생산성이 높음)을 지원하는 프레임워크이다.
  • JDBC 코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다.
  • 복잡한 JDBC코드를 걷어내며 깔끔한 소스코드를 유지한다.
  • DAO 계층을 대신한다.
  • 기존 DAO의 interface의 구현클래스를 xml파일이 대신한다.
  • DAO대신 Mapper용어 사용
  • java전용 아니고 다른 언어에서도 사용이 가능한 프레임워크이다.

MyBatis

pom.xml에 설정 추가

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>

root-context.xml 설정 추가

  • SQLSessionFactory(JdbcTemplate과 비슷한 역할)
    -마이바티스 핵심객체
    -스프링 컨테이너에 생성해 놓으면 된다
    -마이바티스 사용시 기본적으로 spring-jdbc 라이브러리가 있어야 함
  • 어떤 xml파일을 클래스로 변환할껀지 알려주는 mapperLocations설정.
    와일드카드 이용해서 규칙을 정해준다.
    classpath:/ 는 src/main/resources파일 아래의 파일의 경로를 참조하는 방법
    value="classpath:/mappers/**/*Mapper.xml
<!-- 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"/>

Score

IScoreMapper.java

<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>

ScoreService.java 변경

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>

ScoreMapper.xml

구현할 인터페이스를 등록하고 해당 인터페이스에 있는 메서드들을 모두 구현해야 한다.
태그를 이용해서 SQL문을 작성하고 id에는 구현할 메서드를 적는다.
세미콜론 ; 은 사용하지 않는다.
?는 사용하지 않고 #{변수명}을 사용한다.

  • 리턴 타입이 void가 아닐때는 리턴 타입을 적어주어야한다.
    그런데 DB컬럼명과 VO의 변수명이 일치하지 않는다면 값을 가져 올수 없기 때문에 ResultMap을 사용해서 변수명을 알려주어야한다.
  • ResultMap
    : DB컬럼명과 VO의 필드(멤버변수)명을 맞추는 ResultMap 선언
    컬럼명과 VO의 변수명이 서로 일치하지 않는다면, SQL을 잘 작성해도 mybatis에서 값을 끌고 오지 못하기때문에 선언.
    만약 컬럼명과 VO의 변수명이 완벽히 일치한다면 ResultMap선언 필요없다.
    id="ResultMap이름"
    id property = primary key
    result property = 나머지 컬럼
    컬럼명과 변수명이 일치라면 resultType="경로를 써주면됨 "
<?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>

Board

IBoardMapper.java

<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>

BoardService.java변경

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>

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="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>

0개의 댓글