Learn/KH정보교육원

[KH정보교육원 당산] 73일( Spring - Mybatis )

Dahoon06 2021. 6. 29. 14:49
728x90
반응형

myBatis 플러그인 다운로드

[help] -> [eclipse maketplace] -> mybatis 검색 -> MyBatipse 1.2.4 다운로드

 

파일을 새로 추가할 때 mybatis 폴더가 생기고 안에 mybatis mapper가 있으면 성공적으로 플러그인 설치 완료

 


기본형식

<?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="mappings.board-mapping">

</mapper>

mapper xml 파일을 만들면 이렇게 되어있다.

board-mapper.xml

<mapper namespace="자바코드에서 사용할 이름">
    <select> SQL 문 </select>
    <insert> SQL 문 </insert>
    <update> SQL 문 </update>
    <delete> SQL 문 </delete>
</mapper>

 

=> 각 태그에는 id 속성을 이용하여 구분(단 id값은 유일한 값으로 설정)

자바 코드에서는 mapper의 namespace을 이용하여 각각의 id에 접근하여 SQL문을 실행한다.

다만 실제 실행은 myBatis의 내장 메서드가 수행한다.

 

각 태그에서 반환타입을 설정할 경우, resultType 속성을 이용하여 지정할 수 있는데,

resultType에 관한 설정은 myBatis 환경설정 파일에서 설정할 수 있다.

 

 

** 기존 SQL문과의 차이점

기존 방식)  UPDATE board SET title=? ~~~~
mapper)    UPDATE board SET title = #{ title } ~~~~

기존에 PreparedStatement를 사용하기 위하여 값이 들어오는 부분을 ? 으로 처리 했다면

myBatis에서는 변수명을 사용한다.(ex : #{title} )

 

 


DB 연동

DB연동을 하기위해서는 반드시 DataSource가 필요하다.

 

DataSource 필수 정보

: 접속 드라이버 / 접속 주소 / 사용자계정 / 비밀번호

 

src/main/resources => db.propertis 파일 생성

 

mapper 설정 파일 생성

마찬가지로 mybatis xml 파일을 생성한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
				"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration></configuration>

단, DOCTYPE 에서 configuration이라고 수정하고 public 내부에도 기존 mapper였던 부분을 config로 수정

이때, 대소문자 구분해줘야한다.

 

또한 mapper로 사용하는것이 아닌 설정파일이기에 <configuration>태그를 사용한다.

sql-map-config.xml (메인 설정파일)

<configuration>
	
	<!-- properties 파일 설정 -->
	<properties resource="프로퍼티스 파일명" />
	
	<!-- Alias 설정 -->
	<typeAliases>
		<typeAlias alias="객체명" type="패키지.클래스 경로"/>
	</typeAliases>
	
	<!-- DataSource 설정 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${  }" /> <-- db프로퍼티에 생성한 이름
				<property name="url" value="${  }" />
				<property name="username" value="${  }" />
				<property name="password" value="${  }" />
			</dataSource>
		</environment>
	</environments>

	<!-- SQL Mapper 설정 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml"/>
	</mappers>
	
</configuration>

 

<typeAlias alias="객체명"> 여기서 객체명은 반드시

mapper에서 설정했던 resultType 의 이름과 동일하게 설정 해야한다.

 

 

**  자바 코드에서 SqlSession 객체를 생성하는 순서

1. sql-map-config.xml 문서 읽기 => Reader reader = Resource.getResourceAsReader("읽어들일파일");

2. 읽은 문서를 이용하여 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Reader 객체);

3. SqlSessionFactory 객체를 통하여 SqlSession 객체를 얻기(생성)

   SqlSession session = SqlSessionFactory 객체.openSession();

 

SqlSession 객체 내부 주요 메서드

insert("Mapper의 네임스페이스.해당 id", 전달객체);

Mapper의 네임스페이스 : <Mapper namespace = "BoardDAO">

id : <insert id="insertBoard">

 

예) insert("BoardDAO.insertBoard", BoardVO 객체);

     selectOne(위와 동일) => 하나의 레코드

     selectList(위와 동일) => 여러개의 레코드

     commit(); => 실제 데이터베이스 수정을 확정하는 메서드 ( 오라클에서 사용했던 commit과 동일 )

 

 

SqlSessionFactoryBean 클래스 생성

package com.jdh.spring.common;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class SqlSessionFactoryBean {
	
	private static SqlSessionFactory sessionFactory = null;
	
	public SqlSessionFactoryBean() {
	}
	
    //static 변수에 대한 초기값 설정
	static {
		try{
			if(sessionFactory == null){
				Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
				sessionFactory = new SqlSessionFactoryBuilder().build(reader);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//DAO 호출
	public static SqlSession getSqlSessionInstance(){
		return sessionFactory.openSession();
	}

}

** 중요

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");

: Mybatis 메인 설정파일인 sql-map-config.xml 을 읽어 들이기 위함

 

sessionFactory = new SqlSessionFactoryBuilder().build(reader);

: 파일을 읽은 후에 SqlSessionFactory 객체 생성

 

 

BoardDAO 클래스 생성

public class BoardDAO {

	private SqlSession mybatis;
			
	public BoardDAO() {
		mybatis = SqlSessionFactoryBean.getSqlSessionInstance();
	}

	public void insertBoard(BoardVO vo) {
		mybatis.insert("BoardDAO.insertBoard",vo);  //SqlSession 내장 객체
		mybatis.commit();
	} // insertBoard(BoardVO vo) END

	public void updateBoard(BoardVO vo) {
		mybatis.update("BoardDAO.updateBoard",vo);  //SqlSession 내장 객체
		mybatis.commit();
	} // updateBoard(BoardVO vo) END

	public void deleteBoard(BoardVO vo) {
		mybatis.delete("BoardDAO.deleteBoard", vo);  //SqlSession 내장 객체
		mybatis.commit();
	} // deleteBoard(BoardVO vo) END

	public BoardVO getBoard(BoardVO vo) {
		return mybatis.selectOne("BoardDAO.getBoard", vo); //SqlSession 내장 객체
	} // getBoard(BoardVO vo) END

	public List<BoardVO> getBoardList(BoardVO vo) {
		return mybatis.selectList("BoardDAO.getBoardList", vo); //SqlSession 내장 객체
	} // getBoardList(BoardVO vo) END
}

 

SqlSession 타입 변수 생성

 

public BoardDAO() {
mybatis = SqlSessionFactoryBean.getSqlSessionInstance();
}

=> static으로 생성 했기때문에 바로 사용가능

 

<mapper namespace="BoardDAO">

       <insert id="insertBoard">

=> board-mapping.xml 중 매핑되있는 객체명

mybatis.insert("문자열" --> namespace 명과 insert id명과 동일하게 해야한다.

 

 


728x90
반응형