mybatis를 이용하면 XML 매핑 파일을 작성하는 대신 annotation 이용하여 개발이 가능하다.
SQL 코드를 클래스로부터 분리하여 별도의 리소스(sqlmap xml)파일로 관리할 수 있도록 하는 방식에서
인터페이스 안에 매핑정보를 넣어야 하는 게 올바른 방향인지는 궁금하다.
쿼리가 변경되면 인터페이스를 재 컴파일해서 올려야 할 듯.
아무튼 간단히 개발하는 곳에서는 적용해볼만 한듯해서 관련 소스를 올려둔다.
- 스프링 설정 파일
스프링 설정 파일에서는 dataSource, sqlSessionFactory 및 매퍼 인터페이스를 지정해야 한다.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.archnal.samples.mybatis"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <context:property-placeholder location="spring/jdbc.properties" /> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="accountMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.archnal.samples.mybatis.mapper.AccountMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> </beans>
- Mapper 인터페이스
Mapper 인터페이스에서는 mybatis에서 제공하는 @Select, @Insert 등의 annotation을 이용하여 쿼리를 작성할 수 있다.
package com.archnal.samples.mybatis.mapper; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.archnal.samples.mybatis.dto.Account; public interface AccountMapper { String INSERT = "INSERT INTO tbl_account (name, email) values (#{name}, #{email})"; @Select("SELECT * FROM tbl_account WHERE email = #{email}") Account getByEmail(@Param("email") String email); @Insert(INSERT) void insert(Account account); }
- test 클래스
아래의 소스 코드에서 처럼 실행하면 실제로 데이터베이스에서 값을 읽어 오거나 추가시킬 수 있다.
package com.archnal.samples.mybatis.mapper; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional; import com.archnal.samples.mybatis.dto.Account; @ContextConfiguration(locations={"classpath*:spring/*-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true) @Transactional(readOnly=true) public class AccountMapperTest { @Resource(name="accountMapper") AccountMapper accountMapper; @Test public void testGetByEmail() throws Exception { String email = "crexxx@gmail.com"; Account account = accountMapper.getByEmail(email); System.out.println("account: " + account); } @Test @Rollback(true) @Transactional(readOnly=false) public void testInsert() throws Exception { String name = "ko"; String email = "koxxx@gmail.com"; Account account = new Account(); account.setName(name); account.setEmail(email); accountMapper.insert(account); } }
void insert(
답글삭제@Param("email2") String email2,
Account account);
위처럼 bean 과 String 을 다 같이 받으면 에러가 나는데
혹시 아시나 싶어서요