Java

spring boot + mybatis 연결

김모작자 2015. 4. 16. 14:52

spring 이 아닌 spring boot 의 경우 아직 starter 가 없어서 그런지 직접 코드로 연결 시켜야 하는데

xml 설정 파일도 없고 하여 코드로 연동 시켰다.

 

// 폴더 구조

[java]

 -[ROOT]  (네임스페이스의 최 상위)

   - DatabaseConfig.java

   - MyBatisProperties.java

   - [controller]

   - [domain]

   - [service]

   - [persistence]

      - mapper.java

      - abcMapper.java

 

[java]

 -[resource]

    - application.properties

    - mybatis.xml

    - [META_INF]

      - [mapper]

      - abcMapper.xml  

볼드 처리된 파일이 작업 대상이다

 

// resource/application.properties 에 DB 정보 입력

mybatis.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver      
mybatis.url=jdbc:sqlserver://192.168.0.1:1433
mybatis.username=test1
mybatis.password=****

mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-location=classpath:META-INF/mapper/**/*.xml

값은 알아서 입력하십시다~

 

// mybatis 기본 설정 (mybatis-config.xml)


<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="cacheEnabled" value="false" />
  <setting name="useGeneratedKeys" value="true" />
  <setting name="defaultExecutorType" value="REUSE" />
    </settings>
   
    <typeAliases>
     <typeAlias alias="HashMap" type="java.util.HashMap" />
     <typeAlias alias="List" type="java.util.List" />     
     <typeAlias alias="ContentProvider" type="web.domain.ContentProvider" />
     <typeAlias alias="HelpEntry" type="web.domain.HelpEntry" />
    </typeAliases>
</configuration>

기본 설정과 typeAlias 를 설정하는 파일로, typeAlias 는 parameterType 이나 resultType 에 자주 사용되는 도메인 모델을 쓰면 유용하다.

 

 

// 위의 설정을 읽을 클래스(MyBatisProperties.java) 만들기

@ConfigurationProperties(prefix = "mybatis")
public class MyBatisProperties {
 @Setter @Getter
 private String driverClassName;
 @Setter @Getter
 private String url;
 @Setter @Getter
 private String username;
 @Setter @Getter
 private String password;
 
 @Setter @Getter
 private String configLocation;
 @Setter @Getter
 private String mapperLocation;

}  

위의 properties 와 1:1 대응되는 클래스.. prefix 는 위의 mybatis.xxxxx 를 읽게 만든다. 별도 properties 안만들고 하긴 좋아뵈서..

@Setter, @Getter 는 project lombok 에서 제공하는 애노테이션임. getter, setter 자동으로 맹글어줌..

 

// MyBatis 초기화를 위한 클래스 (DatabaseConfig.java)

package blah.blah;


 

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework. ~~~~ (생략)

import javax.sql.DataSource;

import ROOT.persistence.Mapper;

 

// 아래 MapperScan annotation 과 더 밑에 setMapperLocation 설정이 중요


 

@Configuration
@EnableTransactionManagement
@MapperScan(basePackages="ROOT.persistence", annotationClass=Mapper.class)

public class DatabaseConfig {
 
 @Autowired
 MyBatisProperties properties;     // 바로 위에서 만든 properties 읽는 클래스
 
 @Bean public DataSource dataSource(){
  BasicDataSource dataSource = new BasicDataSource();
  dataSource.setDriverClassName(properties.getDriverClassName());
  dataSource.setUrl(properties.getUrl());
  dataSource.setUsername(properties.getUsername());
  dataSource.setPassword(properties.getPassword());
  return dataSource;  
 }
 
 @Bean
 public SqlSessionFactoryBean sqlSessionFactoryForMyBatis(DataSource dataSource, ApplicationContext applicationContext) throws IOException  {
  SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  sqlSessionFactoryBean.setDataSource(dataSource);
  sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource( properties.getConfigLocation() ));
  sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources( properties.getMapperLocation() ));
  return sqlSessionFactoryBean;
 }
 
 // 트랜잭션
 @Bean
 public DataSourceTransactionManager transactionManager() {
  return new DataSourceTransactionManager(dataSource());
 }
 
 @Bean public SqlSession sqlSessionForMyBatis(SqlSessionFactory sqlSessionFactory) {
  return new SqlSessionTemplate(sqlSessionFactory);
 }
 
}

 

// Mapper 설정(persistence/Mapper.java)

package ROOT.persistence;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Mapper {
 
}

 

여기까지 사전 준비 끝

본격 sql 처리할 준비 시작~!

 

// sql 이 들어있는 mapper xml 만들기(AbcMapper.xml)

</mapper>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="root.persistence.AbcMapper">
 <select id="selectAllHelpList" resultType="HelpEntry">
  select * from VIEW_HelpList
 </select>
 
 <select id="selectContent" parameterType="HashMap" resultType="HelpEntry">
  select * from HELP where EntryID = #{EntryID}
 </select>
 
 <update id="updateHelpContent" parameterType="HashMap">
  update HELP set content = #{Content} where EntryID = #{EntryID}
 </update>
</mapper>

mapper 노드의 namespace 에는 package + class name 까지 다 들어간다. 밑에 select 에 id 는 다음에 나올 함수 이름과 매칭된다.

 

 

// 인터페이스 코드 (AbcMapper.java)

package ROOT.persistence;

 

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import ROOT.domain.HelpEntry;

 

@Mapper
public interface HelpMapper {

 public List<HelpEntry> selectAllHelpList();
 public HelpEntry selectContent(HashMap<String, String> param);
 public void updateHelpContent(HashMap<String, String> param);
}

 

대략 여기까지 하면 쓸 준비 완료!

저걸 사용하려면 아래처럼 인터페이스를 호출하면 된다~!

~~~~~~

 @Autowired
 HelpMapper hm;
 

 @Override
 public List<HelpEntry> selectAll(){
  return hm.selectAllHelpList();
 }

 

~~~~~~

 

 

 

 

 

참 쉽죠잉..