스프링프레임워크 mybatis 설정방법

728x90

항상 개발환경 설정으로 고통받는다.

어찌저찌 모든 방법을 시도해본 결과, 이 방법이 DB SQL과 연동을 잘 해주었기에 여기에 기록한다

 

* Spring 프레임워크 이클립스 마켓 플레이스에서 미리 다운받았다고 가정

* DB는 MySQL을 기반으로 연동

 

1. src/main/resources 에 있는 application property 설정

아래 바꿀 것만 바꾸고 그대로 설정

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:본인 포트 번호/본인 DB 이름?characterEncoding=UTF-8&serverTimezone=UTC&SSL=false
spring.datasource.username= 본인 DB 아이디
spring.datasource.password= 본인 DB 비밀번호

# 아래는 SQL 문장을 log에 출력하는 문장이므로 넣어놓고 필요없을 때 지우자
# 좀더 세밀하게 출력하려면 DEBUG대신 TRACE 사용
logging.level.com.tjoeun.mybatisTest = DEBUG

 

2. Dependency 추가

 

porm.xml에 설정. 아래 그대로 추가. 다만 버전은 변동될 수 있으므로 maven respiratory에서 받는걸 추천

https://mvnrepository.com/

	    <!-- MyBatis -->
	    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>2.2.2</version>
		</dependency>
		
			<!-- MyBatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.9</version>
		</dependency>
		<!-- MyBatis-Spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>2.0.7</version>
		</dependency>
		
       <!-- spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>5.3.17</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<!-- spring test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>5.3.17</version>
		    <scope>test</scope>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
		<!-- spring에서 DB처리 + Transaction 처리-->
		<dependency>
		    <groupId>commons-dbcp</groupId>
		    <artifactId>commons-dbcp</artifactId>
		    <version>1.4</version>
		</dependency>

		
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
	    	<groupId>mysql</groupId>
	    	<artifactId>mysql-connector-java</artifactId>
	    	<version>8.0.28</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
		<!-- spring에서 DB처리 + Transaction 처리-->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-tx</artifactId>
		    <version>5.3.17</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.22</version>
		    <scope>provided</scope>
		</dependency>

 

이러면 일단 세팅은 끝이다! 알고나니 정말 아무것도 아니다 ㅜㅜㅠㅜㅠ

 

이제 mySQL과 연동이 잘 되나 실험할 차례

 

1. 실험하기 위해 mySQL에 company라는 table을 하나 만들고 시작

table의 column 값은 name, address로 설정 (VARCHAR())

 

2. company 클래스 하나 생성

package com.tjoeun.mybatisTest;

import org.springframework.stereotype.Component;

import lombok.Data;

@Component
@Data
//lombok, getter and setter를 자동으로 생성해주는 라이브러리
public class Company {
	private int id;
	private String name;
	private String address;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

 

 

3. Mapper interface 생성

 

SQL을 연동할 때 mybatis에서 애노테이션으로 @select, @insert, @delete, @update를 지원해준다.

이 애노테이션을 사용해서 Mapper 라는 interface에 메서드만 생성하면 그 메서드를 Controller에서 구현하여 값을 Mapper로 전달하여 SQL문장을 실행한다. 

 

@Repository
@Mapper
public interface companyMapper {
//	서비스에서 sql에 연동할 때 구현할 메서드
//	insert에 넣은 sql 함수를 실행해서 param을 통해 받아온 company객체의 name과 address를 대입한다 
//	이때 다른 EL과 JQuery와는 다르게 #을 쓰는 것에 주의
	@Insert("INSERT INTO company(name, address)"
			+ "VALUES(#{company.name}, #{company.address})")
//	Option을 줘서 SQL객체가 생성될 때 마다 자동 키값을 생성하고 name이라는 변수값을 통해서 키값에 접근할 수 있다.
//	이 키값으로(name) 삭제, 혹은 조회에 사용가능
	@Options(useGeneratedKeys = true, keyProperty = "id")
//	int의 반환 이유는 입력이 성공하면 1을 반환하고 실패하면 0이 반환된다
	int insert(@Param("company") Company company);
	
	
	@Select("SELECT * FROM company")
//	만약 Results를 재활용해야한다면 id를 지정하고 value로 다수의 result를 지정해서
//	@ResultMap("compMapper")라는 함수로 축약할 수 있다
	@Results( id = "compMapper", value ={ //s 까먹지 말자
//		column(SQL)의 값인 name, id, address의 값을 찾아온다음에 = sql과 column의 변수 이름은 반드시 동일해야하고
//		company객체(property)의 값에 넣고 list로 반환시킨다 = 객체 인스턴스 변수명과 property 변수명은 반드시 동일해야한다
		@Result(property = "id", column = "id"),
		@Result(property = "name", column = "name"),
		@Result(property = "address", column = "address")
	})
	List<Company> getList(@Param("company") Company company);
	
	@Select("SELECT * FROM company WHERE id = #{id} ")
	@ResultMap("compMapper")
	Company getbyid(@Param("id") int id);
}

 

 

4. 마지막으로 위의 interface의 메서드를 구현해서 일반적인 Spring MVC모델을 사용하면 작동된다.

@Controller
@RequestMapping("/company")
public class CompanyController {
	@Autowired
	private companyMapper companyMapper;
	
//	인터페이스를 통해 받은 companyMapper를 통해 insert를 company 객체로 넣는다
	@GetMapping("")
	public String post(Company company, Model m) {
		company.setName("화신정공");
		company.setAddress("서울시");
		int i = companyMapper.insert(company);
		System.err.println("test용 " + i);
		m.addAttribute("i", i);
		return "index";
	}
	
	@GetMapping("/list")
	public String getList(Company company, Model m) {
		List<Company> list = companyMapper.getList(company);
		
		m.addAttribute("list", list);
		return "company";
	}
	
	@GetMapping("/detail")
	public String getbyid(@RequestParam("id")int id, Company company, Model m) {
		System.err.println("pathvariabletest " + id);
		Company com = companyMapper.getbyid(id);
		m.addAttribute("com", com);
		
		return "compdetail";
	}
}

 

참조:

https://www.youtube.com/watch?v=4YOk7oLGTKI&t=501s 

 

728x90