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 |