개발 무지렁이

[JDBC] Mapper문서와 SqlSessionFactory 빌드 및 SqlSession의 내장 메서드 본문

Backend/JDBC

[JDBC] Mapper문서와 SqlSessionFactory 빌드 및 SqlSession의 내장 메서드

Gaejirang-e 2023. 5. 7. 13:33

𐂂 Mapper문서
쿼리작성해놓은 문서

📜 sqlmapper형식.xml

  <?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="org.mybatis.example.CustMapper">
    <select id=" "
            parameterType=" "
            resultType=" "
            or
            resultMap=" ">
    </select>
  </mapper>
🦉 mapper namespace
각각의 mapper유일하게 만들어주는 이름공간

📜 custmapper.xml

  <mapper namespace="cust">
    <select id="select" parameterType="String" resultType="cust">
        SELECT * FROM cust WHERE id=#{id} 
    </select>
    <select id="selectall" resultType="cust">
      SELECT * FROM cust
    </select>
    <insert id="insert" parameterType="cust">
      INSERT INTO cust VALUES (#{id}, #{pwd}, #{name})
    </insert>
    <update id="update" parameterType="cust">
      UPDATE TABLE cust SET password=#{password}, name=#{name}, WHERE id=#{id}
    </update>
    <delete id="delete" paramterType="String">
      DELETE FROM cust WHERE id=#{id}
    </delete>
  </mapper>
🦔 parameter로 전달되는 데이터 처리
#{ }: PreparedStatement방식, ' '로 묶어서 매핑
${ }: Statement방식, 값이 그대로 연결되어 매핑

⚠️ 인수(parameter)가 하나만 들어올 때, 관례적으로 ${_parameter}를 쓴다.

𖠃 sql 태그
재사용 가능한 SQL구문 정의
  <sql id="custColumns">id, email, password, name</sql>
  <sql id="select" parameterType="int" resultType="hashmap">
      select <include refid="custColumns" />
    from [table]
    where id = #{id}
  </sql>
𐁍 SqlSessionFactory build

📜 ver1.

  public class GetSessionFactory {
      private static SqlSessionFactory instance;

      public static synchronized SqlSessionFactory getInstance() {
          if(instance == null) {
              try {
                  instance = new SqlSessionFactoryBuilder().build(
                                  Resources.getResourceAsReader("mybatis.xml");
                                  );
              } catch(IOException e) {
                  e.printStackTrace();
              }
          }
          return instance;
      }
  }

📜 ver2

  public classs DBManager {
      private static SqlSessionFactory factory;

      static {
          try {
              String resource = "mybatis.xml"
              Reader reader = Resources.getResourceAsReader(resource);

              factory = new SqlSessionFactoryBuilder().build(reader);
          } catch(Exceptino e) {
              e.printStackTrace();
          }
      }//static End..

      public static SqlSession getSession() {
          return factory.openSession();
      }

      public static void sessionClose(SqlSession session) {
          if(session != null) session.close();
      }

    /**
     * 트랜잭션(Transaction) 처리
       * @param: state가 true인 경우 commit(), false인 경우 rollback()
     * */
      public static void sessionClose(SqlSession session, boolean state) {
          if(session != null) {
              if(state) session.commit();
              else session.rollback();

              session.close();
          }
      }
  }
🦉 Reader reader = Resources.getResourceAsReader("path/to/resource.xml");
해당 path리소스파일로드하여 Reader 객체로 반환

🎯 목적: 주로 mybatis설정파일(xml)을 읽어오는데 사용

𐁍 DAO에서 쿼리 호출하기, SqlSession의 내장 메서드 이용
🌝 select
- 레코드가 0 or 1 리턴될 때(리턴 숫자는 레코드 개수를 의미)
Object obj = sqlSession.selectOne("cust.select", id); ////"[namespaces].[select 태그 id]", parameter
- 레코드가 2 이상 리턴될 때
List<> obj = sqlSession.selectList("cust.selectall");

🌚 insert, update, delete
int result = insert("cust.insert", cust);
int result = update("cust.update", cust);
int result = delete("cust.delete", id);

⚠️ MyBatis 내부에서 executeUpdate()가 실행된다.

📜 XxxDAO.java

  public class XxxDAO {
      public void selectByXxxName() {
          SqlSession session = null;
          try {
              session = DBManager.getSession();
              List<String> list = session.selectList("cust.selectName");
              System.out.println("list: " + list);
          } finally {
              DBManager.sessionClose(session);
          }
      }
  }
Comments