MyBatis

최주영·2023년 7월 6일
0

MyBatis

목록 보기
2/8

✅ Framework

  • 개발자가 소프트웨어를 개발함에 있어 코드를 구현하는 개발 시간을 줄이고
    코드의 재사용성을 증가시키기 위한 일련의 클래스 묶음이나 뼈대, 틀을
    제공하는 라이브러리를 구현해놓은 것
  • 종류

✅ MyBatis

  • SQL Mapper 의 한 종류로 MyBatis 는 JDBC를 편리하게 사용할 수 있도록 도와주는 기술

  • 장점
    (1) : SQL 응답 결과를 객체로 편리하게 변환해준다
    (2) : JDBC의 반복 코드를 제거해준다
  • 단점
    (1) : 개발자가 SQL을 직접 작성해야한다

  • SQL Mapper 대표기술
    (1) MyBatis , JdbcTemplate


✅ 초기 세팅

(1) 워크 스페이스 새로 만들기
(2) 서버 다시 설정

(2) Preferences -> General -> Editors -> Text Editors -> Spelling 에서 UTF-8로 바꿔줌
(3) WorkSpace 에서도 UTF-8로 바꿔주기
(4) Web 에서도 css, jsp, html 부분 다 UTF-8로 변경
(5) lib에 [OJDBC와 MyBatis] 라이브러리 넣어줌
(6) MyBatis 라이브러리 설치방법
https://mybatis.org/mybatis-3/ -> 좌측메뉴 시작하기 -> jar파일다운 ->
(7) : mybatis-config 파일 설정 (프로젝트당 하나만 있으면 됨)

-> xml파일을 열때, 파일우클릭 -> open with -> XML Editor 로 하는것이 편함

  • 위 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> <!-- configuration -> 루트태그임 -->
	<!-- 연결할 DB에 대한 정보를 설정하는 태그 
		1개이상의 DB연결정보를 설정할 수 있다.
		environment태그를 이용한다.
	-->
  	<properties resource="driver.properties"> 
      <!-- properties의 resource 속성으로 해당 프로펄티파일안의 값을 가져옴  -->
	</properties>
	
	<settings>
		<setting name="jdbcTypeForNull" value="NULL"/> 
      <!-- null값 에러처리하는 방법(setting)에 적음 = 에러값이 없으면 오류 발생 --> 
	</settings>
	
	<typeAliases>
	<typeAlias type="com.employee.model.vo.Employee" alias="emp"/> 
      <!-- 해당 타입을 별명으로 지어서  mapper에서 편하게 사용 가능 -->
	</typeAliases>
  
  
  
	<environments default="mybatis"> <!-- 기본연결이 mybatis임 -->
		<environment id="mybatis">
			<transactionManager type="JDBC"/> <!-- 트렌젝션을 처리하는 방법설정 -->
			<dataSource type="POOLED">
			<!-- DB 연결에 필요한 정보를 등록하는 태그 
				1. 드라이버, 2.DB서버 주소, 3.사용계정  4.계정비밀번호
			-->
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
				<property name="username" value="mybatis"/>
				<property name="password" value="mybatis"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 실행할 sql문을 설정한 mapper를 등록 -->
	<mappers>
		<mapper resource="/mappers/student-mapper.xml"/>
	</mappers> 
</configuration>

(8) : SqlSession 객체 생성

  • SqlSessionFactoryBuilder 생성
  • build() 메소드를 실행, build()메소드의 인수로 (7)에서 만든 파일을 전달
  • openSession() 메소드를 이용
  • 인수로 true, false를 설정 -> autoCommit에 대한 설정
  • SqlSession 클래스를 가져옴
package com.mybatis.common;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SessionTemplate {
	// mybatis가 제공하는 SqlSession객체를 생성해주는 공용메소드를 선언 -> static
	public static SqlSession getSession() { // service 에서 getSession으로 받을 수 있음

		SqlSession session = null;
		String file="mybatis-config.xml"; // 파일 명은 변경해도됨
		try { 
			InputStream is=Resources.getResourceAsStream(file);
			SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
			SqlSessionFactory factory =builder.build(is);
			session=factory.openSession(false);
		}catch(IOException e) {
			e.printStackTrace();
		}
		return session;
	}
}

(9) : Dao 에서 사용하는 메소드

  • Dao에서는 SqlSession 이 제공하는 메소드를 호출함
  • selectOne() selectList() insert() update() delete()
    ex) session.insert(statement인수) , session.update(statement인수), session.selectOne(statement인수)
  • 위 statement 인수는 -> "mapper태그 namespace값.sql태그id값" 을 넣으면됨
    ex) session.insert("student.insertStudent")
public class StudentDao {
	
	public int insertStudent(SqlSession session) {
    	// selectOne() -> (하나의 로우)
		// selectList() -> (다수의 로우)
		// sql문을 실행할 때 session이 제공하는 메소드를 호출하면됨
		// selectOne(), selectList(), insert(), update(), delete()
		// statement인수는 "mapper태그 namespace값.sql태그id값"
		int result = session.insert("student.insertStudent");
		return result;
	}
 }

(10) mapper.xml 파일 생성

  • mapper태그에 namespace 속성을 설정
    namespace -> session 객체가 sql문을 메소드에 의해 실행할 때 사용하는 mapper구분 값
  • parameterType -> 매개변수가 있는 경우 타입 설정 (INSERT,UPDATE,DELETE,SELECT 다 사용)
  • 파라미터값은 #{매개변수명} 으로 전달받는다
<?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="student">
  	<!-- 
  		실행할 sql문에 맞는 태그를 선언하면됨.
  		<select>,<insert>,<update>,<delete>
  		sql문은 시작태그와 끝태그 사이에 작성, ;를 작성하지 않는다.
    -->
  
       <insert id="insertStudent">
          INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,'유병승','0102341234','YOO@YOO.COM','경기도 시흥시',DEFAULT)	
      </insert>    
  
  	    <insert id="insertStudentByName" parameterType="string">
    	    <!--  메소드 실행시 매개변수가 있는 경우에 sql태그에 parameterType 속성을 이용해서 매개변수 타입을 설정
    			  파라미터값은 #{매개변수명}로 전달받을 수 있다. --> 	
    		INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,#{name},'0102341234','YOO@YOO.COM','경기도 시흥시',DEFAULT)
   		 </insert>
  
  	   <insert id="insertStudentAll" parameterType="com.mybatis.model.vo.Student">
         	<!-- type을 작성할 때 클래스를 작성하려면 패키지명까지 작성을 해야한다 -->
    		INSERT INTO STUDENT VALUES(SEQ_STUDENT.NEXTVAL,#{studentName},#{studentTel},#{studentEmail},#{studentAddress},default)
  	   </insert>
  
       <update id="updateStudent" parameterType="com.mybatis.model.vo.Student">
            UPDATE STUDENT SET STUDENT_NAME=#{studentName},STUDENT_TEL=#{studentTel},STUDENT_EMAIL=#{studentEmail},STUDENT_ADDR=#{studentAddress} WHERE STUDENT_NO=#{studentNo}
	  </update>    
	
	<delete id="deleteStudent" parameterType="_int"> // 매개변수가 int형임
		DELETE FROM STUDENT WHERE STUDENT_NO=#{n}
	</delete>
  
  	<!-- 
		<select> 태그를 이용하고
		resultType || resultMap -> 쿼리문의 실행결과를 반환할 타입을 지정
		   resultType : java코드로 작성되어있는 타입(기본, 클래스타입)
		   resultMap : mybatis에서 <resultMap>을 이용해서 만든 타입 
		   * 컬럼명과 매핑할 java클래스 필드명이 같으면 resultType 다르면 resultMap 만들어서 직접 매핑해줌
		   * 클래스간의 연관관계를 설정했을때(has a) 사용
		   * 반드시 resultMap이나 resultType 둘 중 하나 있어야함 
	-->
  
  	<select id="selectStudentCount" resultType="_int"> <!-- 개수는 반환형이 정수로 반환하므로 -->
		SELECT COUNT(*) FROM STUDENT
	</select>
  
  <!-- vo객체와 resultset의 컬럼명 불일치할때 resultMap을 이용해서 맵핑시켜줄수있다.
		<resultMap id="구분" type="">
		<id property="type에 설정된 객체의 필드명" column="resultset컬럼명"> id pk값 
		<result > 나머지 필드값들 
		<associtation>  has a 관계
		<collection>  리스트로 객체를 가질 때 
	-->
		  <!-- resultMap 예시 -->
  		<resultMap id="studentMap" type="com.mybatis.model.vo.Student">
			<id property="studentNo" column="student_no"/>
			<result property="studentName" column="student_name"/>
			<result property="studentTel" column="student_tel"/>
			<result property="studentEmail" column="student_email"/>
			<result property="studentAddress" column="student_addr"/>
		</resultMap>
	
	<!--<select id="selectStudent" resultType="com.mybatis.model.vo.Student" parameterType="_int"> -->
	<select id="selectStudent" resultMap="studentMap" parameterType="_int">
		<!-- SELECT STUDENT_NO AS STUDENTNO,
				STUDENT_NAME AS STUDENTNAME, 
				STUDENT_TEL AS STUDENTTEL, 
				STUDENT_EMAIL AS STUDENTEMAIL, 
				STUDENT_ADDR AS STUDENTADDRESS, 
				REG_DATE 
				FROM STUDENT WHERE STUDENT_NO=#{no} -->
				
				SELECT * FROM STUDENT WHERE STUDENT_NO=#{NO}
	</select>
  	
  
  	<select id="selectStudentByName" resultMap="studentMap" parameterType="string">
		SELECT * FROM STUDENT WHERE STUDENT_NAME LIKE '%'||#{name}||'%'  <!-- 문자열끼리 합쳐준거임 -->
	</select>
	
	
	<select id="selectStudentMap" resultType="map" parameterType="_int"> <!-- 맵 자료형 반환 -->
		SELECT * FROM STUDENT WHERE STUDENT_NO=#{no}
	</select>
  
</mapper>
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글