[Spring] MyBatis

Jeini·2023년 5월 29일
0

🍃  Spring

목록 보기
22/33
post-thumbnail

💡 MyBatis


✔️ SQL Mapping Framwork - Easy & Simple

  • java코드와 SQL을 매핑해줌
    : SQL을 별도 XML로 분리해놓고 자바 코드에서 간단하게 사용할 수 있게 해 놓았다.
    ➡️ 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거. MyBatis가 알아서 해 준다.
    ➡️ 작성할 코드가 줄어서 생산성 향상 & 유지 보수 편리

  • JPA보다 쉽다. JPA는 oop와 SQL + 모델링을 잘해야 한다. 반면 MyBatis는 쉽다.
    : 상황에 맞게 쓰면 된다.

  • spring 없이도 MyBatis를 쓸 수 있다.

  • spring과 함께 쓸려면 둘을 연결해 주는 mybatis-spring을 설치해야 한다.

✏️ MyBatis로 sql과 java코드의 분리

  • 원래는 이렇게 sql과 java코드를 함께 붙여놨었다. 하지만 MyBatis를 이용해서 분리해 놓을 수 있다.

  • sql ➡️ XML
    : java 코드에서 try-catch문, setString 등이 사라졌다. ➡️ 더 간단해짐


❓ PreparedStatement를 직접 사용안해도 되는 건가?

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 Setting


  • 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 이상이어야 함

✏️ root-context.xml

<?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&amp;characterEncoding=utf8"></property-->
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/springbasic?useUnicode=true&amp;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>

✏️ 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>
    <typeAliases>
        <typeAlias alias="BoardDto" type="kr.ac.jipark09.domain.BoardDto"/>
    </typeAliases>
</configuration>

✏️ 폴더 설정

  • mapper
    : sql이 들어있는 xml파일을 넣어 줌

✏️ board table 만들기

✏️ MyBatis & MyBatis Spring 리포지토리 등록

  • 이거 두개 다 필요함
		<!-- 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>
        

💡 SqlSessionFactoryBean & SqlSessionTemplate


📌 MyBatis가 제공하는 인터페이스

✔️ SqlSessionFactory
: SqlSession을 생성해서 제공

  • SqlSessionFactory가 있어야 SqlSession이 사용 가능하다.
    : openSession() 메서드로 SqlSession반환

✔️ SqlSession
: SQL명령을 수행하는데 필요한 메서드 제공

📌 MyBatis Spring이 제공하는 클래스

  • MyBatis가 제공하는 인터페이스를 구현

✔️ SqlSessionFactoryBean
: SqlSessionFactory를 Spring에서 사용하기 위한 빈

  • SqlSessionFactory 을 구현한 클래스

✔️ SqlSessionTemplate
: SQL명령을 수행하는데 필요한 메서드 제공
➡️ thread-safe

  • SqlSessionTemplate 을 이용해서 DAO를 작성.
    : 이 DAO가 여러개 있으면SqlSessionTemplate 을 공유가능하다.
    ➡️ 공유가능한 이유는 thread-safe이기 때문

  • SqlSession 을 구현한 클래스

❗️ thread-safe
: 멀티 스레드의 안전함
: 여러 스레드가 동시에 접근해도 괜찮다는 의미

✏️ root-context.xml에다가 저장

  • SqlSessionFactoryBean 을 등록할 때 Mapper.xml위치를 지정해 줘야 한다.

❗️ Mapper.xml
: SQL문이 들어있는 xml문서
: 여러개의 종류를 만듬
: 이름 패턴

💡 SqlSession의 주요 메서드


  • int ➡️ DB에 영향을 준 row 수

  • insert의 매개변수
    : Object parameter 는 우리가 sql에서 insert into User info value(?,?,?) 이렇게 했는데 ? 들을 객체로 담아서 줘야 한다. 예를 들어, User 객체로도 줄 수 있고 Map으로 줄 수도 있다.
    : String statement 은 sql문이 들어가있는 xml이름이 있다. insert문의 이름 줘야 한다.

💡 Mapper XML의 작성


  • 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

profile
Fill in my own colorful colors🎨

0개의 댓글