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.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) 만들기
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();
}
~~~~~~
참 쉽죠잉..