1_mybatis_흐름

study/mybatis · 2020. 2. 13. 08:29

1. view

2. servlet

3. service

Mybatis 에서는 JDBC에서 사용하던 Connection과 Connection을 통해서 DB와의 데이터 교환, 트랜잭션 처리를

하던 부분을 SqlSession 이라는 객체 하나로 대체할 수 있다.

3-1 template

package com.kh.mybatis.common;

import java.io.InputStream;

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

public class Template {
	
	public static SqlSession getSqlSession() {
		// SqlSession 객체를 반환하기 위한 변수 선언
		SqlSession session = null;
		
		// JDBCTemplate에서 public static Connection getConnection()과 같은 개념의 메소드로
		// 기존에는 DB 접속 정보가 들어있는 properties파일을 불러와
		// 이 메소드 안에서 DBMS와 연결을 하였다.
		
		// 하지만 우리가 초반에 mybatis-config.xml 파일을 통해서 DB접속 관련한 정보를 작성했었다.
		// 그러면 그 mybatis-config.xml 파일을 불러와야 된다.
		
		// 현재 클래스 패스와 다른 위치에 있는 자원을 로드하는 것을 좀 더 쉽게 해주는
		// 마이바티스 라이브러리에서 제공하는 util성 클래스인
		// Resources라는 클래스를 가지고 파일을 불러와보도록 하자.
		try {								//리소시스와 리소스폴더를 검색
			InputStream stream = Resources.getResourceAsStream("/mybatis-config.xml");
			// -> source folder로 지정해 두어야지만 매개변수로 작성한 경로로 검색됨
			// SqlSession을 만들기 위해서 SqlSessionFactory에서 openSession이라는 것을 해줘야 되는데
			// SqlSessionFactory는 SqlSessionFactoryBuilder라는 클래스의 build()를 통해서 생성이된다.
			// openSession(false)의 의미는 자동 커밋을 하지 않게 설정하는 것이다.
			session = new SqlSessionFactoryBuilder().build(stream).openSession(false);
		}catch(Exception e) {
			System.out.println("Template Exception catch");
			e.printStackTrace();
		}
		return session;
	}
	
	// * commit(), rollback(), close() 함수는 안만드는 이유
	
	// SqlSession 클래스가 commit, rollback, close 함수를 제공해주고
	// Statement관련, ResultSet 관련한 close부분은 작성하지 않는데,
	// Dao쪽에서  마이바티스를 적용하면서 더 편리하게  sql문을 활용할 수 있게 되었기 때문에
	// Statement 관련, ResultSet 관련 내용을 사용하지 않게 된다. 
	
}

4. dao

session.알맞는메소드("네임스페이스.실행할셀렉아이디", 전달값)

5. 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의 네임스페이스 먼저 지정해주자. 네임스페이스는 이 매퍼의 별칭처럼 사용된다.-->
<mapper namespace="memberMapper">
<!-- 별칭를 사용하지않으면 /mappers/member-mapper.xml 경로를 다 써야됨 -->
<!-- 별칭 등록은 mybatis-config 에서함 -->
	<!--  2. ResultMap 작성
		resultMap 엘리먼트는 마이바티스에서 가장 중요하고 강력한 엘리먼트
		ResultSet에서 데이터를 가져올 때 작성되는 JDBC 코드를 대부분 줄여주는 역할을 담당하고
		DB와 자바 클래스를 매핑 시켜줄 때 보통 사용한다.
		
		type : ResultSet을 담을 VO 클래스명으로 어떤 타입을 참조할 것인지 기술(alias 사용가능)
		id : 해당 ResultMap의 고유 아이디 => select문에서의 resultMap 값으로 사용하는 부분->
	-->
	 
	<!-- ResultMap을 작성하기 앞서서 type부분에 클래스 작성 시
		com.kh.membner.model.vo.Member' 의 평식을 패키지 + 클래스명으로(풀네임)으로 적어야 함.
		하지만 매번 이렇게 패키지를 포함한 클래스명을 쓰는건 너무 귀찮으므로 
		 mybatis-config.xml에 가서  클래스명으로만 쓸 수 있도록 별칭을 지정함.	-->
	<resultMap type="Member" id="memberResultSet">
		<!-- property : 자바의 필드 변수 이름 / column : DB의 해당 컬럼 -->	
		
		<!-- DB의 기본 키 -->
		<id property="memberNo" column="MEMBER_NO"/>
		
		<!-- DB의 일반 컬럼들 -->
   		<result property="memberId" column="MEMBER_ID"/>
  		<result property="memberPwd" column="MEMBER_PWD"/>
  		<result property="memberName" column="MEMBER_NM"/>
  		<result property="memberPhone" column="MEMBER_PHONE"/>
  		<result property="memberEmail" column="MEMBER_EMAIL"/>
  		<result property="memberAddress" column="MEMBER_ADDR"/>
  		<result property="memberInterest" column="MEMBER_INTEREST"/>
  		<result property="memberEnrollDate" column="MEMBER_ENROLL_DT"/>
  		<result property="memberStatus" column="MEMBER_STATUS"/>
  		<result property="memberGrade" column="MEMBER_GRADE"/>
	</resultMap>
	
		<!-- Select 구문 -->
	<!-- 
		id : 외부(DAO)에서 참조하기 위한 쿼리문의 고유 아아디(네임스페이스 내 유일한 구분자)
		parameterType : 구문에 전달될 파라미터의 패키지 경로를 포함한 전테 클래스 명이나 별칭(mybatis-config.xml에 설정된 alias 이용가능)
		resultType/resultMap : 쿼리 실행 후 조회된 결과(ResultSet)를 자바에서 사용되게 끔 담게되는 객체
		resultType : resultset 결과를 매핑해서 반환되는 타입의 전체 클래스명이나 별명
		resultMap : resultset 결과를 매핑할 resultMap 참조 아이디명
		
	 -->
	 <!-- 
	 	쿼리문은 기본적으로 preparedStatment이다.
	 	?(위치 홀더) 대신 직접 파라미터로 전달받은 객체의 값을 꺼낼 때 #{필드명} 으로 값을 꺼낸다.
	 	
	 	그리고 여러줄로 줄바꿈 문자를 섞어 사용도 가능하다.
	 	단, 문장 마침을 나타내는 세미콜론은 여기서도 역시 에러를 유발한다!!
 	-->
	<!-- 1. select 기본형-->
	<!-- <select id="loginMember" parameterType="com.kh.member.model.vo.Member" 
	 							resultType="com.kh.member.model.vo.Member">
	 	SELECT * 
	 	FROM MEMBER 
	 	WHERE MEMBER_ID= #{memberId} 
	 	AND MEMBER_PWD= #{memberPwd} 
	 	AND MEMBER_STATUS='Y'
	
	</select> -->
	<!-- 
	 	해당 쿼리문 수행 결과가가 담긴 ResultSet은 resultType의 객체에 자동으로 mapping되어 리턴된다.
	 	
	 	DB에 존재하는 Member라는 테이블의 컬럼명과 자바에서의 Member클래스 필드명이 동일할 경우

	 	자동으로 컬럼과 필드가 mapping이 되어 Member 객체가 리턴이 됨
	 	
	 	하지만 현재 상황을 보면.. Member테이블들의 컬럼과 Member클래스의 필드명이 다르므로
	 	이때는 resultType보다 resultMap을 이용하여 명시적으로 컬럼명과 필드명을 mapping 시켜주는 작업이 필요하다.
	-->
	  
	<!-- 3. resultMap, Alias 적용 -->
	<!-- 처음에 작성했던 loginMember는 주석 후 -->
	<select id="loginMember" parameterType="Member" 
		resultMap="memberResultSet">
		SELECT * 
	 	FROM MEMBER 
	 	WHERE MEMBER_ID= #{memberId} 
	 	AND MEMBER_PWD= #{memberPwd} 
	 	AND MEMBER_STATUS='Y'
	</select>	  

	<!-- 4. 아이디 중복 체크 -->
	<!-- select를 할 경우 반드시 resultType 
	또는 resultMap을 반드시 지정해야함-->
	<select id="idDupCheck" parameterType="string" 
		resultType="_int">
		SELECT COUNT(*) FROM MEMBER
		WHERE MEMBER_ID = #{id}
	</select>
	
</mapper>

# dml은 mappiong중에 resulttype이 _int로 고정되어있어서 생략 가능하다

6. service

close

7. servlet

 

'study > mybatis' 카테고리의 다른 글

2_mybatis_(다중조건검색)  (0) 2020.02.17
0_mybatis_세팅,개요  (0) 2020.02.12