์ถ์ฒ https://jason-moon.tistory.com/130
MyBatis๋ ํํ SQL ๋งคํ(mapping) ํ๋ ์์ํฌ๋ก ๋ถ๋ฅ๋๋๋ฐ, ๊ฐ๋ฐ์๋ค์ JDBC ์ฝ๋์ ๋ณต์ฅํ๊ณ ์ง๋ฃจํ ์์ ์ ํผํ๋ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉํ๋ค. ์ ํต์ ์ธ JDBC ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌ์กฐ์ ๋น๊ตํด๋ณด๋ฉด, MyBatis๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ์๋์ผ๋ก Connection close() ํ๋ ๊ธฐ๋ฅ
- MyBatis ๋ด๋ถ์ ์ผ๋ก PreparedStatement ์ฒ๋ฆฌ
- #[prop]์ ๊ฐ์ด ์์ฑ์ ์ง์ ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์๋ ์ฒ๋ฆฌ
- ๋ฆฌํด ํ์ ์ ์ง์ ํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๊ฐ์ฒด ์์ฑ ๋ฐ ResultSet ์ฒ๋ฆฌ
์คํ๋ง ํ๋ ์์ํฌ์ ํน์ง ์ค ํ๋๋ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๊ณผ์ ์ฐ๋์ ์ฝ๊ฒ ํ๋ ์ถ๊ฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ง๋ค๋ ๊ฒ์ด๋ค. Mybatis ์ญ์ mybatis-spring์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ฝ๊ฒ ์ฐ๋ํ ์ ์๋ค.
๊ธฐ์กด๊บผ ์ญ์ ํ ๋ณต๋ถ + ์ฝ๋ผ๋ฆฌ ๋๋ฅด๊ธฐ๐
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.app'
version = '1.0'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
@Configuration ์ค์ ํ๋ ๊ฑฐ์ผ ํ๊ณ Spring์๊ฒ ์๋ ค์ค
ApplicationContext ์ธ๋ถ์ ์๋ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ค๊ธฐ์ํด์(๊ทธ ํ์ผ์ ๊ฒฝ๋ก๋ง ๋ฑ ๊ฐ์ ธ์ค๋๊ฒ)
์คํ ๋๋ฉด ์๋๋๊น ๋ณต๋ถํด์ ์จ๋ผ!!
package com.app.mybatis.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
@RequiredArgsConstructor
public class MyBatisConfiguration {
private final ApplicationContext applicationContext;
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig(){
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath*:/mapper/*.xml"));
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:/config/config.xml"));
try {
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
return sqlSessionFactory;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
<?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">
<?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">
server:
port: 10000
#MyBatis
spring:
datasource:
hikari:
driver-class-name: oracle.jdbc.OracleDriver
jdbc-url: jdbc:oracle:thin:@//localhost:1521/XE
username: hr
password: hr
mybatis ํด๋ ์์ฑ
Connections > localhost ๋ก ์ฐ๊ฒฐ(Driver์์ jarํ์ผ ์๋ ํ์ธํ๊ณ connect ํ๊ธฐ)
์ค์ ๋ก ํ ์ด๋ธ ๋ง๋ค์ด์ ์กฐํ ํด๋ณด๊ธฐ
CREATE SEQUENCE SEQ_MEMBER; //(ctrl + Enter)๋ก ์ฟผ๋ฆฌ ๋๋ฆฌ๊ธฐ
CREATE TABLE TBL_MEMBER(
ID NUMBER CONSTRAINT PK_MEMBER PRIMARY KEY,
MEMBER_ID VARCHAR2(1000) UNIQUE NOT NULL,
MEMBER_PASSWORD VARCHAR2(1000) NOT NULL,
MEMBER_NAME VARCHAR2(1000)
);
์ถ๊ฐ๋ void
INSERT INTO TBL_REPLY
(SEQ_REPLY.NEXTVAL, ..., 1, SEQ_REPLY.CURRVAL)
[1 depth - ๋๊ธ] โป SEQ_REPLY.CURRVAL
๋๊ธ 1: ์๋
ํ์ธ์! (groupId = 1)
๋๊ธ 2: ์ ๋ ๊ณต์ ! (groupId = 2)
๋๊ธ 3: ๊ฐ์ฌํฉ๋๋ค^^7 (groupId = 3)
[2 depth - ๋๋๊ธ]
๋๋๊ธ 1: ๋ฐ๊ฐ์์~!(groupId = 1)
๋๋๊ธ 2: ์ด์์ค์ธ์~!(groupId = 1)
๋๋๊ธ 3: ๊ณต์ ๋๋ ธ์ด์!(groupId = 2)