19 MyBatis

p378 - build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.4'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'spring.jdbc'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
//	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'

	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' // MyBatis 의존성 추가
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // JPA 추가

}

tasks.named('test') {
	useJUnitPlatform()
}

p379 - src/main/resources/application.properties

# Application Name
spring.application.name=template

# MySQL Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# HikariCP Configuration
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.pool-name=HikariPool

# MyBatis
mybatis.type-aliases-package=spring.jdbc.template.domain
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.spring.jdbc.template.mybatis=trace

# JPA
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE

p381 - src/main/java/spring/jdbc/template/mybatis/UserMapper

@Mapper
public interface UserMapper {
    // 유저 저장 메서드
    int save(User user);

    // 유저 정보 업데이트 메서드
    void update(@Param("userIdx") Long userIdx, @Param("userUpdateDto") UserUpdateDto userUpdateDto);

    // 유저 ID로 찾기 메서드
    Optional<User> findByIdx(Long userIdx);

    // 모든 유저 찾기 메서드 (검색 조건을 이용할 수 있음)
    List<User> findAll(UserListDto dto);
}

p382 ~ 386 - src/resources/spring/jdbc/template/mybatis/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="spring.jdbc.template.mybatis.UserMapper">
    <!-- 유저 저장 메서드 -->
    <insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="userIdx">
        INSERT INTO users (userId, age)
        VALUES (#{userId}, #{age})
    </insert>

    <!-- 유저 정보 업데이트 메서드 -->
    <update id="update">
        UPDATE users
        SET userId = #{userUpdateDto.userId}, age = #{userUpdateDto.age}
        WHERE userIdx = #{userIdx}
    </update>

    <!-- 유저 ID로 찾기 메서드 -->
    <select id="findByIdx">
        SELECT userId, userIdx, age
        FROM users
        WHERE userIdx = #{userIdx}
    </select>

    <!-- 모든 유저 찾기 메서드 (검색 조건을 이용할 수 있음) -->
    <select id="findAll" parameterType="spring.jdbc.template.dto.UserListDto" resultType="User">
        SELECT userId, userIdx, age
        FROM users
        <where>
            <if test="userId != null and userId != ''">
                AND userId LIKE CONCAT('%', #{userId}, '%')
            </if>
            <if test="minAge != null">
                AND age >= #{minAge}
            </if>
            <if test="maxAge != null">
                <![CDATA[
                    AND age <= #{maxAge}
                ]]>
            </if>
        </where>
    </select>

</mapper>

Last updated