✔️ SQL Mapping Framwork - Easy & Simple
java코드와 SQL을 매핑해줌
: SQL을 별도 XML로 분리해놓고 자바 코드에서 간단하게 사용할 수 있게 해 놓았다.
➡️ 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거. MyBatis가 알아서 해 준다.
➡️ 작성할 코드가 줄어서 생산성 향상 & 유지 보수 편리
JPA보다 쉽다. JPA는 oop와 SQL + 모델링을 잘해야 한다. 반면 MyBatis는 쉽다.
: 상황에 맞게 쓰면 된다.
spring 없이도 MyBatis를 쓸 수 있다.
spring과 함께 쓸려면 둘을 연결해 주는 mybatis-spring을 설치해야 한다.
원래는 이렇게 sql과 java코드를 함께 붙여놨었다. 하지만 MyBatis를 이용해서 분리해 놓을 수 있다.
sql ➡️ XML
: java 코드에서 try-catch문, setString 등이 사라졌다. ➡️ 더 간단해짐
Spring에서 MyBatis를 함께 사용할 때는 일반적으로 PreparedStatement가 직접 사용되지 않는다. 왜냐하면, MyBatis는 SQL 문을 처리하기 위해 내부적으로 PreparedStatement를 사용하기 때문이다.
MyBatis는 SQL 매핑 파일(XML)을 사용하여 데이터베이스와의 상호 작용을 정의한다.
이 매핑 파일에서는 SQL 문을 작성하고 매개 변수를 바인딩하는 등의 작업을 수행한다.
이러한 작업은 MyBatis가 자동으로 처리하므로 개발자는 PreparedStatement를 명시적으로 다룰 필요가 없다.
Spring과 MyBatis를 함께 사용할 때는 Spring이 MyBatis와의 통합을 제공하며, MyBatis의 SqlSessionFactoryBean을 사용하여 데이터베이스 연결 및 설정을 관리한다. 이를 통해 Spring은 MyBatis의 내부 동작을 추상화하고 개발자가 SQL 문 작성에만 집중할 수 있도록 도와준다.
결론
: Spring에서 MyBatis를 사용할 때는 PreparedStatement를 직접 다룰 필요가 없으며, MyBatis의 매핑 파일과 Spring의 통합을 통해 데이터베이스 상호 작용을 처리할 수 있다.
- MyBatis-Spring 2.0.X은 MyBatis 3.5 이상, Spring Framework 5.0 이상, Java 8 이상이어야 함
- MyBatis-Spring 1.3.X은 MyBatis 3.4 이상, Spring Framework 3.2.2 이상, Java 6 이상이어야 함
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property-->
<!--property name="url" value="jdbc:log4jdbc:mysql://localhost:3306/springbasic?useUnicode=true&characterEncoding=utf8"></property-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/springbasic?useUnicode=true&characterEncoding=utf8"></property>
<property name="username" value="castello"></property>
<property name="password" value="1234"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven/>
<context:component-scan base-package="kr.ac.jipark09"/>
</beans>
<?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>
<typeAliases>
<typeAlias alias="BoardDto" type="kr.ac.jipark09.domain.BoardDto"/>
</typeAliases>
</configuration>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
✔️ SqlSessionFactory
: SqlSession을 생성해서 제공
✔️ SqlSession
: SQL명령을 수행하는데 필요한 메서드 제공
✔️ SqlSessionFactoryBean
: SqlSessionFactory를 Spring에서 사용하기 위한 빈
SqlSessionFactory
을 구현한 클래스✔️ SqlSessionTemplate
: SQL명령을 수행하는데 필요한 메서드 제공
➡️ thread-safe
SqlSessionTemplate
을 이용해서 DAO를 작성.
: 이 DAO가 여러개 있으면SqlSessionTemplate
을 공유가능하다.
➡️ 공유가능한 이유는 thread-safe이기 때문
SqlSession
을 구현한 클래스
❗️ thread-safe
: 멀티 스레드의 안전함
: 여러 스레드가 동시에 접근해도 괜찮다는 의미
SqlSessionFactoryBean
을 등록할 때 Mapper.xml위치를 지정해 줘야 한다.❗️ Mapper.xml
: SQL문이 들어있는 xml문서
: 여러개의 종류를 만듬
: 이름 패턴
int
➡️ DB에 영향을 준 row 수
insert의 매개변수
: Object parameter
는 우리가 sql에서 insert into User info value(?,?,?)
이렇게 했는데 ?
들을 객체로 담아서 줘야 한다. 예를 들어, User 객체로도 줄 수 있고 Map으로 줄 수도 있다.
: String statement
은 sql문이 들어가있는 xml이름이 있다. insert문의 이름 줘야 한다.
namespace은 각 id를 구별할려고 써주는 것
: mapper들끼리 서로 구별만 되면 된다.
➡️ Mapper 인터페이스 설정
namespace가 일치해야 한다.
select는 우리가 줄 것이 없다. 시간을 String(resultType
)으로 반환한다.
MyBatis가 Integer를 내부적으로 int라고 지어놨다. 실제로는 Integer 타입이다.
➡️ <typeAliases>
<typeAliases>
로 이름 짧게 하기parameterType이 너무 길다. 짧게 할 수 없을까? 해서 나온 것이 <typeAliases>이다.
alias ➡️ 별명 / type ➡️ 실제 이름
: 별명은 대소문자를 구별하지 않는다.
Reference
: https://fastcampus.co.kr/dev_academy_nks