mybatis
는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object Relational Mapping)
프레임워크다.JDBC
를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하며 모든 JDBC
코드 및 매개변수의 중복작업을 제거한다.mybatis
에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.dependency
를 pom.xml
에 삽입한다.<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
mapper
클래스에 어노테이션으로 @Mapper
를 달아준다.mybatis
를 사용하기 전, 해당 기능을 수행하는 동작을 설정하는 XML 문서
root element
는 configuration
이다.
<?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>
XMl 문서
<?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>
SqlSessionTemplate
은 mybatis
연동모듈의 핵심이다. SqlSession
을 구현하고 코드에서 SqlSession
을 대체하는 역할을 한다.<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate"
destroy-method="clearCache">
<constructor-arg ref="sqlSessionFactoryBean"></constructor-arg>
</bean>
mybatis
에서는 SqlSessionFactory
는 SqlSessionFactoryBuilder
를 사용해서 생성하며, mybatis-spring
연동 모듈에서는 SqlSessionFactoryBean
이 대신 사용된다.
SqlSessionFactory
는 DataSource
의 필수 프로퍼티가 필요하며, 다른 스프링 데이터베이스 연결처럼 설정되어야 한다.
configLocation
프로퍼티는 mybatis
의 XML
설정파일의 위치를 지정하기 위해 사용한다.
mapperLocations
프로퍼티를 통해 Mapper에 관련된 자원의 위치를 나열한다. classpath:
는 src/main/resources/
를 의미한다.
<bean id="sqlSessionFactoryBean"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"></property>
<property name="configLocation"
value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations"
value="classpath:mappers/*.xml"></property>
</bean>
하나씩 Mapper를 모두 등록할 필요가 없이, mybatis-spring
연동모듈의 자동스캔기능을 중 하나이다.
MapperScannerConfigurer
를 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주되어 Mapper 인터페이스의 객체가 DI 컨테이너에 등록된다.
basePackage
속성은 Mapper 인터페이스를 검색할 대상의 Package를 삽입한다.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.test.book.mapper"></property>
</bean>
mapper
의 namespace
에는 참고하는 interface
형식의 mapper
클래스의 경로를 기술한다.
또한, mapper
XML
파일의 id
는 mapper
클래스의 메서드 이름과 일치시켜준다.
<mapper namespace="com.test.book.mapper.BookDAO">
resultType
은 고정, 파라미터에 해당하는 parameterType
은 써준다면 고정, 써주지 않는다면 mybatis
에서 적절하게 매핑해준다. <!-- 매핑된 mapper의 메서드는 int insert(Person person) -->
<insert id="insert">
insert into person (no,name,age,job)
values (#{no},#{name},#{age},#{job})
</insert>
<!-- 매핑된 mapper의 메서드는 int update(Person person) -->
<update id="update" >
update person set age=#{age}, job=#{job} where no=#{no}
</update>
<!-- 매핑된 mapper의 메서드는 int delete(int no) -->
<delete id="delete">
delete from person where no=#{no}
</delete>
출력형을 고정해주는것이 큰 차이점이다.
resultType
에는 원하는 DTO
의 경로를 적어주고
List
형식으로 받아온다면 hashmap
을 사용하여 출력형식을 명시해준다.
<!-- 출력형식이 dto.Person -->
<select id="select" resultType="com.test.book.dto.Person">
select no,name,age,job from person where no=#{no}
</select>
<!-- 출력형식이 dto.User -->
<select id="login" resultType="com.test.book.dto.User">
select name from user where id=#{id} and pwd=#{pwd}
</select>
<!-- 출력형식이 List -->
<select id="selectAll" resultType="hashmap">
select no,name,age,job from person order by no desc
</select>