카테고리 없음

[String] MyBatis 를 JPA 와 함께 이용하기

Journey Jeong 2023. 4. 26. 10:58

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 어노테이션 적용 후 
	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;

}