[  Mybatis  ]
데이터의 CRUD를 보다 편하게 하기 위해 xml로 구조화한 Mapper 설정 파일을 통해
 JDBC를 구현한 영속성 프레임워크

 

=> SQL 내부에 값을 직접 작성 가능 (? 안쓰고 바로 가능)
=> 조회 rs -> VO 객체로 옮겨담기 과정 축소됨
=> stmt, pstmt 기호화 (생성 X , 섞어서 사용)
=> 동적 SQL (SQL 내부에 if, for 등을 사용 가능)

 

<설정>

1. pom.xml 에 OJDBC 라이브러리 추가

 

<!-- mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>21.1.0.0</version>
</dependency>

 

2. spring - jdbc 추가

<!-- mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

3. mybatis 추가

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>

 

4. mybatis Spring 추가

<!-- mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

 

4. DBCP 사용 추가

<!-- mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.9.0</version>
</dependency>

 

5. mybatis.config 설정하기 

<동작구조>

--> SqlSession 동작을 살펴보면 됨

SqlSession Factory Bean => SqlSessionTemplate  => 실행

(mybatis.config.xml에 설정)       (mapper.xml에 설정)

 

1. Mybatis 설정용 xml파일 DTD(Document Type Definition 추가 

 

(경로) Window - Preferences - XML Catalog - User Specified Entries -add

 

<Config>

[ location 작성] = http://mybatis.org/dtd/mybatis-3-config.dtd (빈칸없이 그대로)

 

[Key 작성] = -//mybatis.org//DTD Config 3.0//EN

 

<Mapper>

[ location 작성] = http://mybatis.org/dtd/mybatis-3-mapper.dtd (빈칸없이 그대로)

 

[Key 작성] = -//mybatis.org//DTD Mapper 3.0//EN

 

 

2. resources에 mybatis-config.xml 생성 후 설정하기

<settings>

     <setting name="jdbcTypeForNull" value="NULL"/>
</settings>

// insert update 에 사용되는 값 중 null 이 있을 경우 NULL을 대입하도록 함 (NOT NULL제약이 없는 경우만 가능)

 

<!-- mapper(SQL이 작성된 파일) 위치 등록 부분 -->
<mappers>
       <mapper resource="/mappers/member-mapper.xml" />
</mappers>

 

<!-- mapper에서 사용되는 VO를 간단히 부르기 위한 별칭 지정 -->
<typeAliases>
       <typeAlias alias="Member" type="edu.kh.fin.member.model.vo.Member"></typeAlias>
</typeAliases>

 

3. root-context.xml 설정 추가

 

<!-- Root Context: defines shared resources visible to all other web components -->
<!-- root-context.xml
web.xml 파일이 가장 먼저 읽어 들이는 설정 파일.
프로젝트 전체에 공유되는 자원(DB연결, 트랜잭션처리, 파일업로드 등)
설정 내용을 작성
 -->
 
<!-- 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:@  주소  :xe" />
      <property name="username" value=" DB아이디 "/>
      <property name="password" value=" DB비밀번호 " />

      <!-- 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에 전달, 실행하는 객체 (Connection 역할)
      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>

 

5. mapper 설정하기

 

resources’폴더에 ‘mappers’ 폴더 생성 후 mapper.xml 파일 생성

 

[ 사용 ] 

---- 최상단 : 마이바티스 매퍼 설정임을 선언 & namespace 선언 ----

<?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">

    <!-- 내용 -->

</mapper>

 

---- <resultMap> 태그 ----

 

-> SELECT 조회 결과(ResultSet)의 컬럼명과 VO객체의 필드명이 일치하지 않을 때 어떤 컬럼과 필드가

매칭되어야 하는지 지정하는 태그

 

->resultMap의 type 속성은 실제로 구현해 놓은 자바 POJO 객체를 사용해야 하며, mybatis-config.xml에서 typeAlias를 지정하지 않은 경우, 패키지 명부터 클래스 명 까지 모두 기술해야 됨

 

---- <insert> <update> <delete> 태그로 SQL문 작성 ----

(개별로 id , parameterType , resultType 등 속성 작성)

 

 

서블릿에서 일일이 getParameter로 받아내던 것과 달리 스프링에서는 더 쉽게 파라미터들을 받아올 수 있다!

 

파라미터 받는 방법 5

 

1. HttpServletRequest

-> 서블릿 방식

2. @RequestParam

-> value / required / defaultValue 속성을 가지고 있음

-> value : input태그 name

-> required : 파라미터 필수 여부 ( 기본값 : true)

-> defaultValue : 전달 받은 파라미터 값이 없을 때 기본 값

3. @RequestParam을 생략

-> ("태그명==매개변수명") 일때

4. @ModelAttribute == 커맨드객체

-> 요청 시 전달 받은 파라미터를 객체 형태로 매핑하는 역할을 해줌

-> 해당 객체 클래스에 기본생성자 getter setter등 생성 

-> 해당 객체 멤버 변수명과 input 태그 name 일치

5. @ModelAttribute을 생략

 

 

 

+ Recent posts