[KH정보교육원 당산] 73일( Spring - Mybatis )
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명과 동일하게 해야한다.
'Learn > KH정보교육원' 카테고리의 다른 글
[KH정보교육원 당산] 연습문제9 (인터페이스 구현) (0) | 2021.07.01 |
---|---|
[KH정보교육원 당산] 74일 (Spring흐름 및 Ajax를 활용한 To-Do list) (0) | 2021.06.30 |
[KH정보교육원 당산] 73일 (Spring - 파일업로드, 다국어처리, 데이터 변환) (0) | 2021.06.29 |
[KH정보교육원 당산] 72일 ( 어노테이션 방식) (0) | 2021.06.23 |
[KH정보교육원 당산] 71일 (model2 -> MVC 아키텍쳐) (0) | 2021.06.22 |