데이터 입력, 조회, 수정, 삭제를 보다 편하게 하기 위해 xml로 구조화 한 Mapper설정 파일을 통하서 JDBC를 구현한 영속성 프레임워크
기존의 JDBC를 통해 구현했던 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 xml설정을 통해 쉽게 구현하 수 있게 해준다.
이전에 JDBC Template를 통해 SQL을 실행하였다면 Mybatis는 해당 흐름을 전용 라이브러리를 통해 대체하여 동작한다고 생각하면 된다.
JDBC 드라이버 (ojdbc11) https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11 Spring에서 JDBC지원하는 모듈 (spring-jdbc) https://mvnrepository.com/artifact/org.springframework/spring-jdbc Mybatis 라이브러리 (mybatis) https://mvnrepository.com/artifact/org.mybatis/mybatis Spring에서 쉽게 Mybatis를 사용 가능하게 만드는 모듈(spring-mybatis) https://mvnrepository.com/artifact/org.mybatis/mybatis-spring DataBase Connection Pool 사용을 위한 라이브러리(commons-dbcp2) https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
Window - Preferences - XML - XML Catalog - User Specified Entries클릭 – Add… 클릭
- Config Location : http://mybatis.org/dtd/mybatis-3-config.dtd Key type : Public ID Key : -//mybatis.org//DTD Config 3.0//EN - Mapper Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd Key type : Public ID Key : -//mybatis.org//DTD Mapper 3.0//EN
‘src/main/resources’폴더에 mybatis-config.xml 파일 생성
‘src/main/resources’폴더에 mybatis-config.xml 파일 생성
‘src/main/resources’폴더에 mybatis-config.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>
<!-- SqlSessionTemplate 생성 시 적용될 설정 작성 부분 -->
<settings>
<!-- insert 또는 update에 사용되는 값 중 null이 있을 경우에 대한 설정
해당 설정이 없을 경우 -> SQL 구문에 null 포함되어 있다는 오류 발생.
해상 설정이 있을 경우 -> 오류를 발생 시키지 않고 NULL 값을 컬럼에 대입
단, NOT NULL 제약조건이 없는 컬럼에만 가능함.
** value 설정 시 NULL 은 반드시 대문자로 작성 (소문자 null은 오류가 발생함) -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<!-- 별칭 작성 부분 -->
<!-- VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여 -->
<typeAliases>
<typeAlias type="edu.kh.fin.member.model.vo.Member" alias="Member"/>
</typeAliases>
<!-- mapper 파일(SQL 작성되는파일) 위치 등록 부분 -->
<mappers>
<mapper resource="/mappers/member-mapper.xml"/>
</mappers>
</configuration>
DBCP(커넥션풀)설정
!-- DBCP 사용을 위한 DataSource를 Bean으로 등록 -->
<!-- DataSource란? : java에서 Connection Pool을 지원하기 위한 인터페이스 -->
<!-- BasicDataSource : DataSource인터페이스를 구현한 클래스, 아파치 commons.dbcp에서 제공 -->
<!-- destroy-method="close" : 주어진 세션을 자동으로 반환(close)하라는 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value=“kh_final" />
<property name="password" value=“kh_final1234" />
<!-- defaultAutoCommit: SQL 수행 후 자동 COMMIT 설정. (기본값 : true) -->
<property name="defaultAutoCommit" value="false" />
<!-- 커넥션 풀 설정 -->
<property name="initialSize" value="10" /> <!-- 초기 커넥션 수, 기본 0 -->
<property name="maxTotal" value="500" /> <!-- 최대 커넥션 수, 기본 8 -->
<property name="maxIdle" value="100" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최대 수, 기본 8 -->
<property name="minIdle" value="10" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최소 수, 기본 0 -->
<property name="maxWaitMillis" value="-1" /> <!-- 예외 발생 전 커넥션이 반환 될 떄 까지 대기하는 최대 시간(ms), 기본 -1(무기한) -->
</bean>
<!-- SqlSession : sql구문을 DB에 전달, 실행하는 객체
SqlSessionFactory : SqlSession을 만드는 객체
sqlSessionFactoryBean : mybatis 설정 파일(mybatis-config.xml)과 Connection Pool 정보를 이용하여 SqlSessionFactory를 만드는 객체
sqlSessionTemplate : SqlSession 객체에 트랜잭션 처리 역할이 가능하도록 하는 객체 -->
<!-- 마이바티스 SqlSession 등록하기 (xml 방식으로 bean 등록) -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- mybatis-config.xml 설정 불러오기 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 관리 역할을 하는 SqlSession을 생성할 수 있게 하는 객체(Spring bean으로 등록해야함.) -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" />
</bean>
<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우 추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
‘src/main/resources’폴더에 ‘mappers’ 폴더 생성 후 mapper.xml 파일 생성
src/main/resources’폴더에 ‘mappers’ 폴더 생성 후 mapper.xml 파일 생성
- <resultMap태그> : select조회 결과(ResultSet)컬럼명과
컬럼 값을 옮겨 담을 DTO의 필드명이 같지 않을 때
이를 매핑 시켜 SELECT 시 자동으로 담기게 하는 역할- 태그 예시
<resultMap type="Member" id="member_rm"> <!-- DB의 기본키 (복합키면 여러개 작성)--> <id property="memberNo" column="MEMBER_NO"/> <!-- DB의 일반 컬럼들 --> <result property="memberEmail" column="MEMBER_EMAIL"/> <result property="memberPw" column="MEMBER_PW"></result> <result property="memberNickname" column="MEMBER_NICKNAME"/> <result property="memberTel" column="MEMBER_TEL"/> <result property="memberAddress" column="MEMBER_ADDR"/> <result property="profileImage" column="PROFILE_IMG"/> <result property="enrollDate" column="ENROLL_DATE"/> <result property="memberDeleteFlag" column="MEMBER_DEL_FL"/> <result property="authority" column="AUTHORITY"/> </resultMap>
⭐<resultMap>의 type속성은 실제로 구현해 놓은 자바 POJO 객체를 사용해야 하며, mybatis-cconfig.xml에서 typeAlias를 지정하지 않은 경우, 패키지 명부터 클래스까지 모두 기술해야 됨
- xml 최상단에 다음과 같이 xml 형식을 지정하여 이하의 설정 내용이 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="memberMapper">
- 이어서 태그를 작성하고, 외부에서 접근할 수 있는 이름인 namespace 속성을 기입, 이 후 작성된 태그들을 태그 안에 기록하면 됨
- <select> 태그 : SQL의 조회구문을 작성할 때 사용되는 태그로, 해당 쿼리를 외부에서 접근하고자 할 때 namespace.id명을 적어 접근 가능
⭐MyBatis에 작성되는 SQl에서 #{}/ ${}의 의미⭐
- #{}: prepareStatement 의 위치홀더(?)의 역할로 전달된 값을 의미함
- ${}: Statement의 역할로 SQL 구문 자체를 의미함
<mapper namespace="memberMapper">
<!-- namespace : 공간(영역, 지역, 태그)의 이름 -->
<!-- mapper 파일 생성시 아래 태그는 반드시 삭제 !!!! -->
<!-- <cache-ref namespace=""/> -->
<!--
resultMap
- select조회 결과(ResultSet)컬럼명과
컬럼 값을 옮겨 담을 DTO의 필드명이 같지 않을 때
이를 매핑 시켜 SELECT 시 자동으로 담기게 하는 역할
-속성
Type : 연결할 DTO (패키지명 + 클래스 또는 별칭)
id : 만들어진 resultMap을 지칭할 식별면(이름)
<id> 태그 : PK 역할 컬럼 - 필드 매핑
<result>태그 <id> 제외 나머지
-->
<resultMap type="Member" id="member_rm">
<!-- DB의 기본키 (복합키면 여러개 작성)-->
<id property="memberNo" column="MEMBER_NO"/>
<!-- DB의 일반 컬럼들 -->
<result property="memberEmail" column="MEMBER_EMAIL"/>
<result property="memberPw" column="MEMBER_PW"></result>
<result property="memberNickname" column="MEMBER_NICKNAME"/>
<result property="memberTel" column="MEMBER_TEL"/>
<result property="memberAddress" column="MEMBER_ADDR"/>
<result property="profileImage" column="PROFILE_IMG"/>
<result property="enrollDate" column="ENROLL_DATE"/>
<result property="memberDeleteFlag" column="MEMBER_DEL_FL"/>
<result property="authority" column="AUTHORITY"/>
</resultMap>
<!--
SQL관련 태그 속성
- parameterType : 전달 받은 값의 자료형
기본 : 패키지명 + 클래스 명
별칭 : Mybatis 별칭 또는 사용자 지정 별칭
- parameterMap : (사용 안함)
- resultType : select 결과을 담아서 반환할 자료형
단, DTO을 작성할 경우 필드명= 컬럼명 경우만 가능
memberNo MEMBER_NO
- resultMap : select결과의 컬럼명과
결과를 저장할 DTO 필드명이 다른 경우
이를 알맞게 매핑(연결)시켜주는 <resultMap> id작성
-->
<!--
** 마이바티스에서 전달 받은 값을 SQL에 작성하는 방법**
#{변수명|필드명} : preparedStatement
: SQL에 값 대입시 양쪽에 '' 붙여서 대입
${변수명|필드명} : Statment
: SQL값 대입시 양쪽에 아무것도 붙이지 않은
(사용예시)
test1= "user01"
test2=MEMBER_EMAIL
- MEMBER_EMAIL이 'user01'인 회원 조회
SELECT * FROM MEMBER WHERE ${test2} = #{test1}
MEMBER_EMAIL = 'user01'
-->
<select id="login" parameterType="Member" resultMap="member_rm">
SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICKNAME, MEMBER_PW,
MEMBER_TEL, MEMBER_ADDR, PROFILE_IMG, AUTHORITY,
TO_CHAR(ENROLL_DATE, 'YYYY"년" MM"월" DD"일" HH24"시" MI"분" SS"초"') AS ENROLL_DATE
FROM "MEMBER"
WHERE MEMBER_DEL_FL = 'N'
AND MEMBER_EMAIL = #{memberEmail}
<!--
AND MEMBER_EMAIL = ?
AND MEMBER_PW = ?
-->
</select>
</mapper>