[Spring Boot] MyBatis 설정 및 사용법
Spring Boot에서 MyBatis 설정 방법 및 간단 사용법에 대해 알아보겠다.MyBatis는 java에서 쿼리를 실행을 돕는 라이브러리다.
[수행 환경]
Windows 10 IntelliJ 2020.3.4 MariaDB 10.11 java 11 gradle-7.6 |
[Gradle 설정] |
// MyBatis implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' |
[Yml 설정] |
mybatis: type-aliases-package: com.test.main.data.mapper mapper-locations: static/mapper/*.xml #해당 위치에 xml 파일을 둬야 한다. 밑에서 다시 설명하겠다. |
[테이블 생성] |
CREATE TABLE `agree` ( `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '시퀀스', `MEM_ID` varchar(50) NOT NULL COMMENT '아이디', `PHONE` varchar(50) DEFAULT NULL COMMENT '전화번호', `EMAIL` varchar(50) DEFAULT NULL COMMENT '이메일', `CONTENTS_SEQ` int(11) NOT NULL COMMENT '동의서 컨텐츠 아이디', `AGREE_YN` varchar(1) DEFAULT NULL COMMENT '동의여부', `SYS_CREATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간', `SYS_CREATE_USR` varchar(50) NULL COMMENT '등록한사람', `SYS_UPDATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간', `SYS_UPDATE_USR` varchar(50) NULL COMMENT '수정한사람', PRIMARY KEY (`SEQ`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; |
[디렉토리 구조 확인하기] |
아래 부터 Mybatis를 구동하는데 필요한 맵퍼를 살펴볼 것인데 파일 저장 위치는 위와 같다. AgreeMapper.xml은 위에 YML에 설정 한 것 처럼 resources/static/mapper에 뒀다. 둘다 위치가 같지 않으면 실행이 되지 않으니 주의 하여야 한다. |
[AgreeMapper.xml 작성] |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.test.main.data.mapper.AgreeMapper"> <select id="findAgree" resultType="com.test.main.data.dto.AgreeDto"> <![CDATA[ SELECT AGREE_YN AS agreeYn, CONTENTS_SEQ As contentsSeq FROM AGREE WHERE MEM_ID = #{memId} ]]> </select> </mapper> |
[Agree Mapper interface 작성] |
package com.test.main.data.mapper; import com.test.main.data.dto.AgreeDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository @Mapper public interface AgreeMapper { List<AgreeDto> findAgree(@Param("memId") String memId); } |
[Generate POJOs.groovy 파일 내용 작성] |
import com.intellij.database.model.DasTable import com.intellij.database.util.Case import com.intellij.database.util.DasUtil /* * Available context bindings: * SELECTION Iterable<DasObject> * PROJECT project * FILES files helper */ packageName = "com.main.service.data.entity;" typeMapping = [ (~/(?i)int/) : "long", (~/(?i)float|double|decimal|real/): "double", (~/(?i)datetime|timestamp/) : "LocalDateTime", (~/(?i)date/) : "LocalDateTime", (~/(?i)time/) : "LocalDateTime", (~/(?i)/) : "String" ] FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } } def generate(table, dir) { def className = javaName(table.getName(), true) def fields = calcFields(table) new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields) } } def generate(out, className, fields) { out.println "package $packageName" out.println "" out.println "import lombok.*;" out.println "import javax.persistence.*;" out.println "import java.time.LocalDateTime;" out.println "import java.math.BigDecimal;" out.println "" out.println "@Entity" out.println "@Getter" out.println "@Setter" out.println "@Builder" out.println "@NoArgsConstructor" out.println "@AllArgsConstructor" out.println "public class $className {" out.println "" fields.each() { out.println " /**" out.println " * " out.println " */" if (it.annos != "") out.println " ${it.annos}" out.println " private ${it.type} ${it.name};" out.println "" } out.println "}" } def calcFields(table) { DasUtil.getColumns(table).reduce([]) { fields, col -> def spec = Case.LOWER.apply(col.getDataType().getSpecification()) def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value fields += [[ name : javaName(col.getName(), false), type : typeStr, annos: ""]] } } def javaName(str, capitalize) { def s = co m.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) .collect { Case.LOWER.apply(it).capitalize() } .join("") .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1] } |
[서비스 클래스 작성] |
package com.test.main.domain.agree; import com.test.main.data.dto.AgreeDto; import com.test.main.data.mapper.AgreeMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; @Slf4j //로그 기능 추가 Annotation @Service //서비스 컴포넌트로 spring boot에 등록하는 Annotation @RequiredArgsConstructor //final로 지정된 맴버변수에 대해서 생성자 자동 생성 public class AgreeService { final private AgreeMapper agreeMapper; public List<AgreeDto> findAgree(String memId) { List<AgreeDto> agrees = null; try { agrees = agreeMapper.findAgree(memId); } catch (Exception e) { log.error(e.getMessage()); } return agrees; } } |
[Controller 클래스 작성] |
package com.test.main.domain.agree; import com.test.main.data.dto.AgreeDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Slf4j //로그 기능 추가 Annotation @RequestMapping("/v1") @RestController //RestController 컴포넌트로 spring boot에 등록하는 Annotation @AllArgsConstructor //final로 지정된 맴버변수에 대해서 생성자 자동 생성 @Api(tags = {"20.동의 API"}) public class AgreeController { private final AgreeService agreeService; @GetMapping("/agree") @ApiOperation(value = "동의 조회") public List<AgreeDto> selAgree (String memId) { return agreeService.findAgree(memId); } } |
반응형
'프로그램 > Spring Boot' 카테고리의 다른 글
[Spring Boot] JPA 설정 및 사용 방법 (0) | 2023.07.16 |
---|---|
[Spring Boot] Intellij를 이용한 Entity 자동 생성 (0) | 2023.07.15 |
[Spring Boot] 이미지 캐싱, CDN 기능 설정 (0) | 2023.07.10 |
[Spring Boot] swagger 설정 방법 (0) | 2023.07.09 |
[Spring Boot] QueryDsl 설정 방법 (0) | 2023.07.08 |