MyBatis
- JDBC 프레임워크의 일종
- SQL 파일과 java 파일을 분리
- Connection Pool 개념 사용
※Connection Pool : 연결 자원을 미리 생성하여 연결 시 호출하여 사용하는 방식, 연결 자체의 양이 한정 되어 있음
기존의 java 에서의 DB링크가 SQL과 java 코드와 혼재한 것과 다르게 각각 분리되어 있음
※사용법
1. Maven project의 pom.xml 파일의 <dependencies> 태그 내부에 아래 링크의 <dependency> 태그를 삽입(<dependencies> 태그가 없는 경우 직접 생성)
2. config.xml 파일을 생성 하여 DB와 연결
<mappers> 내부의 <mapper>태그는 사용할 mapper(실제 사용될 sql 구문이 있는 파일)로 설정해야 함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="sql 구문이 있는 xml 파일 경로"/> </mappers> </configuration> | cs |
3. 실행할 sql 구문이 있는 xml 파일 생성
1 2 3 4 5 6 7 8 9 | <?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="org.mybatis.example.BlogMapper"> <select/delete/insert/... id="식별 id" resultType="반환 타입" parameterType="입력 인자 타입"> sql 구문 </select> </mapper> | cs |
※주의 사항
- sql 구문에서 입력 받는 인자 값은 다음과 같이 표기
ex) select * from emp where emp_id = #{emp_id}
- 입력 받는 인자 값은 반드시 하나만 가능하므로, 다수의 값 전달 시 별도의 VO가 필요
- 반환 값이 여러 개라면, list 형태로 반환함
- commit은 자동으로 실행됨
4. connection pool 생성을 위한 SqlSessionManager.java 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.database; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SqlSessionManager { // Connection Pool // SqlSessionFactory : SQL 연결을 만들어내고, 가지고있는 객체 private static SqlSessionFactory sqlSessionFactory; // 초기화 블럭 : 프로그램 시작시 static 변수들이 할당되자마자 실행 static { try { // resource -> config.xml 파일의 경로 String resource = "com/database/config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { e.printStackTrace(); } } // 다른 DAO 파일에서 sqlSessionFactory를 꺼낼 수 있도록하는 // Getter public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } } | cs |
5. DAO를 통한 SQL 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | package kr.smhrd.model; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import kr.smhrd.mapper.SQLSessionManager; public class BoardDAO { //동적로딩-> Mybatis의 경우 필요 x //connection 객체 생성 //Connection pool 가져오기 SqlSessionFactory sqlsessionfactory = SQLSessionManager.getSqlSessionFactory(); //SQL문 실행 준비 //글 전체를 가져오는 메서드 public List<BoardVO> boardList() { //1. SqlSession 빌려오기 //행값 변화가 있는 경우 필요 : openSession(auto commit) SqlSession session = sqlsessionfactory.openSession(true); //2.sql문 실행 //delete, insert, update : 똑같은 이름의 메소드 사용 //select : 1) selectOne : select문의 결과가 하나 // 2) selectList : select 문의 결과가 다수 //?(바인드 변수)가 있는 경우 : selectList(String 타입 id 값, parameter : 바인드 변수) VO //?(바인드 변수)가 없는 경우 : selectList(String 타입 id 값) -> List<VO> //BoardMapper의 sql 쿼리와 연동 List<BoardVO> list = session.selectList("boardlist"); //3. 빌려온 session 반환 session.close(); //4.쿼리 실행 결과 리턴 return list; } . . . } | cs |
※주의 사항
-session.sql유형별 메소드("mapper 식별 id")
유형별 메소드 : selectOne, selectList, delete, insert, update 등
mapper 식별 id 는 반드시 존재하는 mapper에 정의한 sql의 식별 id와 일치해야함
-session open/close는 반드시 쌍으로 실행되어야함
댓글
댓글 쓰기