DAY41 - MyBatis

은나현·2023년 3월 24일
0

📌 1. MyBatis

  • 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임워크
    • JDBC를 통해 데이터베이스에 액세스하는 작업을 캡슐화하고 일반 SQL쿼리, 저장 프로시저 및 고급 매핑을 지원
    • 모든 JDBC 코드 및 매개 변수의 중복작업을 제거
  • MyBatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있다.
    • MyBatis는 기존 JDBC방식과 달리 SQL문을 XML 파일에 작성함으로써 코드가 줄어들고 SQL문만 따로 관리하기 때문에 수정이 편해진다.
  • DBCP를 사용하기 때문에 JDBC만 사용하는 것보다 작업 효율과 가독성이 좋다.

📍 1-1. 다운로드

  • MyBatis 블로그 또는 폴더 내부의 pdf에서 공식 문서를 열람할 수 있다.

📍 1-2. 적용

  • 소스파일에 config.xml파일을 생성하여 공식 문서의 configuration 코드를 붙여넣는다. driver, url, username, password 부분을 개인 설정에 따라 변경한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    	<environments default="development">
    		<environment id="development">
    			<transactionManager type="JDBC" />
    			<dataSource type="POOLED">
    				<property name="driver" value="${driver}" />
    				<property name="url" value="${url}" />
    				<property name="username" value="${username}" />
    				<property name="password" value="${password}" />
    			</dataSource>
    		</environment>
    	</environments>
    	<mappers>
          	// sql문을 관리하는 리소스 파일의 url을 추가하는 부분
    		<mapper resource="org/mybatis/example/BlogMapper.xml" />
    	</mappers>
    </configuration>
    
  • MyBatis 폴더 내의 jar 파일을 lib에 추가하고 Build Path한다.

  • config.xml 파일을 리소스로 해서 커넥션을 생성하는 세션팩토리를 리턴하는 자바 클래스를 준비한다.

    • SqlMapConfig.java
    public class SqlMapConfig {
    	// static 변수 factory
    	private static SqlSessionFactory factory;
    	// 클래스 초기화 블럭(클래스가 처음 로딩될 때 한번만 수행)
    	static {
    		try {
    			String resource = "./com/codingbox/mybatis/config.xml";
    			Reader reader = Resources.getResourceAsReader(resource);
    			factory = new SqlSessionFactoryBuilder().build(reader);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
        // 클래스 초기화 블럭에서 만들어진 factory를 
    	public static SqlSessionFactory getFactory() {
    		return factory;
    	}
    }

📍 1-3. sql 작성 및 사용

  • MyBatis에서의 sql문은 xml 파일 내에 작성한다.
    • 공식문서 작성 가이드 코드
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
    	<select id="selectBlog" resultType="Blog">
    		select * from Blog where id = #{id}
    	</select>
    </mapper>
  • namespace, id : sql 호출 시 사용되는 값
  • sql type 태그 : select, insert, update, delete가 있다.
  • resultType : 리턴할 result type. select문에만 적용된다.
  • parameterType : #{}내에 전달할 파라미터 값의 타입.
  • 작성해 둔 sql을 호출할 때는 factory를 통해 연결 세션을 먼저 생성한다.

    • 클래스 내 기본 생성자로 세션 생성 예시
    public class MemberDao {
    	// 전역변수로 SqlSessionFactory, SqlSession 선언
    	SqlSessionFactory factory = SqlMapConfig.getFactory();
    	SqlSession sqlSession;
        // 기본 생성자로 factory에서 세션 열어주기
    	public MemberDao() {
    		sqlSession = factory.openSession(true);
    		// openSession(true) : auto commit
    	}
    }
  • sql문의 기본 호출 방법 :
    세션.실행할 sql타입에 해당하는 메서드("namespace값.id값",파라미터);

    • 예시
      sqlSession.selectOne("Member.checkId",userid);
      sqlSession.insert("Member.join",member)

➕ resultType, parameterType 용법

  • resultType, parameterType에는 myBatis에서 정해 놓은 별칭(Alias)를 사용한다.

    • 공식문서 발췌

  • 직접 작성한 자바빈즈 클래스 등을 사용할 때는 프로젝트 내에서 해당 빈즈가 위치한, 패키지명까지 포함한 경로 전체를 전달한다. 파라미터 전달 시에는 클래스 내 필드명을 그대로 사용할 수 있다.

    • 예시
    	<insert id="join" parameterType="com.codingbox.vo.MemberBean" >
    		INSERT INTO TBL_MEMBER VALUES 
    		(#{userid}, #{userpw}, #{username}, #{userphone})
    	</insert>
  • hashmap 등의 객체를 사용할 때는 생성 시의 키값을 사용할 수 있다.

    • 예시
    	<select id="login" parameterType="hashmap" 
                resultType="com.codingbox.vo.MemberBean">
    		SELECT * FROM TBL_MEMBER tm 
      		WHERE USERID = #{userid} AND USERPW = #{userpw}  
    	</select>

➕ sql 타입별 리턴 결과

  • select : select문에 해당하는 결과
  • insert : 1 (다중 insert문도 마찬가지)
  • update : update된 행의 개수 반환 (없으면 0)
  • delete : delete된 행의 개수 반환 (없으면 0)

0개의 댓글