Spring과 Mybatis 연결

김민창·2021년 10월 27일
0
post-thumbnail

MyBatis

  • mybatis 는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object Relational Mapping) 프레임워크다.
  • JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개변수의 중복작업을 제거한다.
  • mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.

Maven

  • 다음 두개 dependencypom.xml에 삽입한다.

mybatis

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

mybatis-spring

<!-- 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-config.xml

  • mybatis 를 사용하기 전, 해당 기능을 수행하는 동작을 설정하는 XML 문서

  • root elementconfiguration 이다.

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

mapper.xml

  • 해당 SQL문을 작성하는 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>

root-context.xml

SqlSessionTemplate

  • SqlSessionTemplatemybatis 연동모듈의 핵심이다. SqlSession 을 구현하고 코드에서 SqlSession 을 대체하는 역할을 한다.
<bean id="sqlSession"
	class="org.mybatis.spring.SqlSessionTemplate"
	destroy-method="clearCache">
	<constructor-arg ref="sqlSessionFactoryBean"></constructor-arg>
</bean>

SqlSessionFactoryBean

  • mybatis 에서는 SqlSessionFactorySqlSessionFactoryBuilder를 사용해서 생성하며, mybatis-spring 연동 모듈에서는 SqlSessionFactoryBean이 대신 사용된다.

  • SqlSessionFactoryDataSource의 필수 프로퍼티가 필요하며, 다른 스프링 데이터베이스 연결처럼 설정되어야 한다.

  • configLocation 프로퍼티는 mybatisXML 설정파일의 위치를 지정하기 위해 사용한다.

  • 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>

MapperScannerConfigurer

  • 하나씩 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.xml 사용하기

namespace 설정

  • mappernamespace 에는 참고하는 interface 형식의 mapper 클래스의 경로를 기술한다.

  • 또한, mapper XML파일의 idmapper클래스의 메서드 이름과 일치시켜준다.

<mapper namespace="com.test.book.mapper.BookDAO">

insert, delete, update

  • 출력형을 지정하는 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>

select

  • 출력형을 고정해주는것이 큰 차이점이다.

  • 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>
profile
개발자 팡이

0개의 댓글