spring MyBatis 를 JPA 와 함께 이용하기
1. 프로젝트 생성하기
- Tool 은 아래와 같이 하기
2.Application.properties 설정하기
-Hikari 는 자동 적용됨
spring.datasource.url=jdbc:mariadb://mydb99.~~~~~:3306/nowon
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=nowon
spring.datasource.password=~~~~~
3.Configuration 생성
(1) main/java 의 패키지에 config class 생성
- 클래스에 @Configuration 어노테이션 적용
(2) Bean 생성 하기
- private final DataSource dataSource로 변수 선언하기
- http://mybatis.org/spring/factorybean.html 에서 붙여넣은 후 import 하고 dataSource 맞추기 이후 예외 적용
- @RequiredArgsConstructor 어노테이션 적용 후
- 하단에 http://mybatis.org/spring/sqlsession.html 에서 붙여넣은 후 import 하고 dataSource 맞추기
private final DataSource dataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
System.out.println(">>>>>>>>"+dataSource);
factoryBean.setDataSource(dataSource);
factoryBean.setConfiguration(mybatisConfiguration());
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSession() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
(3) SqlSeessionFactory 의 return 위에 하래와 같이 적용 후 메서드 자동 생성하기
factoryBean.setConfiguration(mybatisConfiguration());
>> 생성된 메서드
@Bean
private org.apache.ibatis.session.Configuration mybatisConfiguration() {
return null;
}
- private 지우기
- return 변경 :
return new SqlSessionTemplate(sqlSessionFactory());
- application.properties 에 하단 문구 추가 하기 :
mybatis.configuration.map-underscore-to-camel-case=true
spring.datasource.url=jdbc:mariadb://mydb99.~~~~~:3306/nowon
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=nowon
spring.datasource.password=~~~
mybatis.configuration.map-underscore-to-camel-case=true
- 다시 MybatisConfig 에 아래와 같이 수정
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public SqlSessionTemplate sqlSession() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
>> 1차완성
package com.green.nowon.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Configuration
public class MybatisConfig {
// JPA와 같이 사용하는 경우 DataSource Bean 을 구성할 필요없음 --> 이미 Hikari 데이터 소스로 만들어져있기에
private final DataSource dataSource;
// 순수 마이바티스 설정
// 1. SqlSessionFactory Bean
@Bean
SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
System.out.println(">>>>>>>>"+dataSource);
factoryBean.setDataSource(dataSource);
factoryBean.setConfiguration(mybatisConfiguration());
// factoryBean.setMapperLocations(null); xml 파일위치 설정 할때, 필요 시 적용
return factoryBean.getObject();
}
@Bean
@ConfigurationProperties
org.apache.ibatis.session.Configuration mybatisConfiguration() {
return new org.apache.ibatis.session.Configuration();
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration")
public SqlSessionTemplate sqlSession() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
}
3. 인터페이스 생성
(1) main/java에 domain 패키지 생성하여 MemoMapper 인터페이스 생성
- 여기에서 쿼리 생성 가능
- @Mapper 어노테이션 적용
- MemoDTO class 자동 생성
package com.green.nowon.domain.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
//MybatisConfig 에서 설정된 xml 파일과 바인딩 할 수 있음
@Mapper
public interface MemoMapper {
@Select("select * from memo")
List<MemoDTO> findAll();
}
(2) 테스트 해보기 : 오류 없으면 됨
- MemoMapper mapper;
- forEach
package com.green.nowon;
import java.util.function.Consumer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.green.nowon.domain.dto.MemoDTO;
import com.green.nowon.domain.dto.MemoMapper;
@SpringBootTest
class SpringMybatisJpaApplicationTests {
@Autowired
MemoMapper mapper;
@Test
void contextLoads() {
mapper.findAll().forEach((memo)->{
System.out.println(memo);
}); //필수로 표현할 것만 (아래랑 동일한 내용)
/* 위와 동일한 표현 1
* for(MemoDTO memo : mapper.findAll()) { System.out.println(memo); } // 아래랑 동일한
* 표현
*/
/*mapper.findAll().forEach(new Consumer<MemoDTO>() {
*
위와 동일한 표현 2
@Override
public void accept(MemoDTO t) {
}
} ); ;//자동생성 클릭하면 MemoMapper interface에 생성
}*/
}
}
4. mapping 하기
- 생성된 MemoDTO 에 아래와 같이 쿼리 맞추어 업데이트
- @ToString
- @Setter 의 경우 생성자를 표기하지 않았을때 안써도됨
package com.green.nowon.domain.dto;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
//@AllArgsConstructor //생성자
//@NoArgsConstructor
public class MemoDTO {
private long meno;
private String content;
private LocalDateTime createdDate;
}