JAVA/Spring

[Spring] Mybatis 연동절차

JongHyun99 2021. 4. 21. 15:25
728x90

1. pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        <!-- MyBatis -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis-version}</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>
cs

maven 원격 저장소(remote repo) 사이트(https://mvnrepository.com/)에서 maven 라이브러리 의존성 정보를 적용

단, 버전 어울림을 생각하여 선정하는 것이 바람함.

 

 

2. root-context.xml

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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="dataSourceOracle"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">                 
          <property name="driverClassName"
                       value="oracle.jdbc.OracleDriver" />
          <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
          <property name="username" value="hr" />
          <property name="password" value="hr" />
    </bean>
    
    <bean id="sqlSessionFactory" 
          class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSourceOracle" />
        <property name="typeAliasesPackage" 
            value="com.javateam.mybatis_project.domain" />
        <property name="mapperLocations" 
            value="classpath:com/javateam/mybatis_project/mapper/*.xml" />    
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="mapUnderscoreToCamelCase" value="true" />
            </bean>
        </property>              
    </bean>    
 
    <bean id ="sqlSession"
          class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
      </bean>
      
</beans>
cs

property 태그는 Setter 메소드를 통해 의존관계를 주입하고

constructor-arg 태그는 빈에 해당 속성을 생성자로 세팅한다는 뜻이다.

 

 

dataSource(DB접근정보) -> SqlSessionFactoryBean (DB연결과 SQL실행) -> SqlSession (SqlSessionTemplate객체로 명 령문 구현) 위 와 같이 3중 참조 구조가 되도록 의존성 정보를 구성한다.

(트랜잭션 구성 시 다른 의존성 정보 추가될 수 있음)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 1) Spring 설정 방식 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="typeAliasesPackage" value="com.javateam.myBatisSample.domain" />
    <property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
 
<!-- 2) 혼합 방식 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />    
    <property name="mapperLocations" value="classpath:/mapper/*.xml" />
    <property name="configLocation" value="classpath:/config/mybatis-config.xml" />
</bean>
cs

sqlSessionFactory에  속성을 별도의 xml파일(mybatis-config)을 참고하여 사용할 수도 있고 Spring Bean 설정방식을 사용할 수도 있다.

 

 

3. Domain(VO)

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
package com.javateam.myBatisSample.domain;
 
import java.sql.Date;
 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
 
@Getter
@Setter
@ToString
public class Employees {
 
     private int employeeId;
     private String lastName;
     private String firstName;
     private String email;
     private String phoneNumber;
     private Date hireDate;
     private String jobId;
     private long salary;
     private int commissionPct;
     private int managerId;
     private int departmentId;
     
}
cs

d

VO가 있어야 각종 정보를 취급할 수 있으므로 위치를 고려하여 설정하고 VO작성한다. (Table이 있다는 전제하에)

Getter/Setter 메소드는 Lombok 라이브러리를 이용하여 약식화했다.

 

 

4. Mybatis 세팅 파일

 

Mybatis 플러그인을 이용하는 xml mapper의 위치는 기본적으로 ava Resources → src/main/resources (자원 관련 파일들 지정 폴더) 를 활용

 

전자정부 프레임워크에는 mybatis 설정 파일 템플렛이 기본적으로 세팅되어있다

 

 

1
2
3
4
5
<?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>
 
</configuration>
cs

위와 같은 설정파일이 형성됨

https://mybatis.org/mybatis-3/ko/configuration.html

 

MyBatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

설정파일에 대한 자세한 매뉴얼이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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>
    
    <settings>           
        <!-- table field(EMP_ID) => VO(empId) -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <typeAliases>
        <!-- domain(VO) package -->
        <package name="com.javateam.myBatisSample.domain"/>
    </typeAliases>    
    
</configuration> 
cs

세팅 값으로 mapUnderscoreToCamelCase옵션 (DB칼럼명을  VO형태의 멤버 형태로 매핑해줌)

을 주었고

 

typeAliases는 sql구문을 작성할 mapper파일에 타입, 변수 선언에 풀네임을 적지 않아도 되게 만들어주는 옵션이다.

 

5. Mapper 파일(xml)

 

Mybatipse 플러그인이 있다면 위 메뉴로 mapper을 작성할 수 있다.

 

1
2
3
4
5
6
7
<?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="mapper.EmployeesMapper2">
 
<select id="getMember" resultType="EmployeesVO">
SELECT * FROM EMPLOYEES
WHERE employee_id = #{employeeId}
</select>
    
</mapper>
cs

select태그에 sql구문을 작성한다.

 

 

6. DAO

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
package com.javateam.myBatisSample.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.javateam.myBatisSample.domain.Employees;
import com.javateam.myBatisSample.domain.EmployeesMapper;
@Repository
public class EmployeesDAOImpl implements EmployeesDAO {
    
    private static final Logger log 
        = LoggerFactory.getLogger(EmployeesDAOImpl.class);
    @Autowired
    private SqlSession sqlSession;

    @Override
    public Employees getMember(int employeeId) {
        return sqlSession.getMapper(EmployeesMapper.class).getMember(employeeId);
        /*
         * return sqlSession.selectOne("EmployeesMapper.getMember", employeeId);
         */
    } //
}
 
cs

sql문 호출할 DAO클래스 작성 (selectOne은 개체 한개만 호출, Mapper은 mapper객체 제공)

 

이렇게 기본적인 mybatis 연동을 이용한 select 호출이 완성되었다.