본문으로 바로가기

[Spring] MyBatis 연동

category Framework/Spring 2021. 12. 6. 17:20

Dependency 추가

Maven

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>jdbc:mariadb-java-client</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle

dependencies {
    //...
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:2.7.3'
    implementation 'com.github.pagehelper:pagehelper-spring-boot-starter:1.4.1'
    //...
}

Property 추가

spring:
  datasource:
    url: jdbc:mariadb://localhost:3306/{dbname}
    username: {username}
    password: {password}
    
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:/mybatis/**/*Mapper.xml

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--가져온 컬럼의 데이터가 Null 이어도 Setter Method 를 통해 데이터를 바인딩 한다. -->
        <setting name="callSettersOnNulls" value="true"/>

        <!--가져온 Row 의 컬럼 데이터 전체가 Null 이어도 컬럼별 NULL 데이터를 생성한다. -->
        <setting name="returnInstanceForEmptyRow" value="true"/>
        
<!--        <setting name="lazyLoadingEnabled" value="true"/>-->
<!--        <setting name="multipleResultSetsEnabled" value="true"/>-->
<!--        <setting name="useColumnLabel" value="true"/>-->
<!--        <setting name="useGeneratedKeys" value="false"/>-->
<!--        <setting name="autoMappingBehavior" value="PARTIAL"/>-->
<!--        <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>-->
<!--        <setting name="defaultExecutorType" value="SIMPLE"/>-->
<!--        <setting name="defaultStatementTimeout" value="25"/>-->
<!--        <setting name="defaultFetchSize" value="100"/>-->
<!--        <setting name="safeRowBoundsEnabled" value="false"/>-->
<!--        <setting name="mapUnderscoreToCamelCase" value="false"/>-->
<!--        <setting name="localCacheScope" value="SESSION"/>-->
<!--        <setting name="jdbcTypeForNull" value="OTHER"/>-->
<!--        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>-->
    </settings>

<!--    <typeAliases>-->
<!--        <package name="com.tailerbox.data.dto."/>-->
<!--    </typeAliases>-->

</configuration>
  • mapUnderscoreToCamelCase : 컬럼명으로 snake case 를 사용하는 경우 필드의 camel case 변수명을 자동변환
    ※ 주의 : MyBatis 연동이 아닌 Scope (ex. Client -> Controller) 에서는 적용되지 않음. 
                spring.jackson.property-naming-strategy=SNAKE_CASE << RequestBody 의 경우 해당옵션과 함께 사용
                
       

UserMapper.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.tutorial.tailerbox.data.mapper.UserMapper">

    <select id="findAll" resultType="HashMap">
        select * from users
    </select>

</mapper>

UserMapper.java

package com.tutorial.tailerbox.data.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;

@Mapper
@Repository
public interface UserMapper {
    ArrayList<HashMap<String, Object>> findAll();
}

UserService.java

package com.tutorial.tailerbox.service;

import com.tutorial.tailerbox.data.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;

@Service
public class UserService {

    UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public ArrayList<HashMap<String, Object>> findAll() {
        return userMapper.findAll();
    }
}

UserController.java

package com.tutorial.tailerbox.controller;

import com.tutorial.tailerbox.service.UserService;
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.ArrayList;
import java.util.HashMap;

@Slf4j
@RestController
@RequestMapping(value = "users")
public class UserController {

    UserService userService;
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public ArrayList<HashMap<String, Object>> getUsers() {
        ArrayList<HashMap<String, Object>> result = userService.findAll();
        log.info("UserController.getUsers");

        return result;
    }
}

 

저장소 링크