아이인포

IBatis 아이바티스 사용하기 본문

카테고리 없음

IBatis 아이바티스 사용하기

아이인포 2020. 3. 1. 01:44

아이바티스 SQL 매핑 프레임워크다....

나름 개인적으로 SQL 매핑 유틸성 클래스들이 더 편리하지만... 이런것도 알고 있어야지...

일단 돌아가게끔 설정하는 법부터...

아이바티스 로딩 설정 파일이다. DBCP를 이용하기 위해하는 것. 밑의 설정은

기존의 Datasource를 JNDI로 가져올때 쓴다.

 

 

<?xml version="1.0" encoding="UTF-8" ?>

 

<!DOCTYPE sqlMapConfig     

    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     

    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

 

<sqlMapConfig>

 

  <!-- Configure a built-in transaction manager.  If you're using an

       app server, you probably want to use its transaction manager

       and a managed datasource -->

       <transactionManager type="EXTERNAL">

        <dataSource type="JNDI">

            <property name="DataSource"    value="JNDI 명"/>

        </dataSource>

    </transactionManager>

  <!-- List the SQL Map XML files. They can be loaded from the

       classpath, as they are here (com.domain.data...) -->

  <sqlMap resource="/ibatis/Test.xml"/>

  <!-- List more here...

  <sqlMap resource="com/mydomain/data/Order.xml"/>

  <sqlMap resource="com/mydomain/data/Documents.xml"/>

  -->

 

</sqlMapConfig>

 

 

쿼리를 id로 검색하여 사용할수 있게 한다. 하지만 이 xml 같은거 만들기도 짜증난다... 특히

resultMap 이 귀찮을거 같다... jsp 태그처럼 * 안먹는겨??

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     

    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     

    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="User">

  <!-- Use type aliases to avoid typing the full classname every time. -->

  <typeAlias alias="User_Info_Bean" type="ibatis.User_Info_Bean"/>

 

  <!-- Result maps describe the mapping between the columns returned

       from a query, and the class properties.  A result map isn't

       necessary if the columns (or aliases) match to the properties

       exactly. -->

 <resultMap id="UserResult" class="ibatis.User_Info_Bean">

    <result property="user_NO" column="user_NO" />

  </resultMap>

 

  <!-- Select with no parameters using the result map for Account class. -->

  <select id="selectAllUsers" resultMap="UserResult">

    select * from User_T

  </select>

 

 

 

</sqlMap>

자바

 

package ibatis;

 

import java.io.IOException;

import java.io.Reader;

import java.sql.SQLException;

import java.util.List;

import java.util.Map;

 

import com.ibatis.common.resources.Resources;

import com.ibatis.sqlmap.client.SqlMapClient;

import com.ibatis.sqlmap.client.SqlMapClientBuilder;

 

/**

 * This is not a best practices class.  It's just an example

 * to give you an idea of how iBATIS works.  For a more complete

 * example, see JPetStore 5.0 at http://www.ibatis.com.

 */

public class IBatis_Test {

 

  /**

   * SqlMapClient instances are thread safe, so you only need one.

   * In this case, we'll use a static singleton.  So sue me.  ;-)

   */

  private static SqlMapClient sqlMapper;

 

  /**

   * It's not a good idea to put code that can fail in a class initializer,

   * but for sake of argument, here's how you configure an SQL Map.

   */

  static {

    try {

      Reader reader = Resources.getResourceAsReader("/ibatis/SqlMapConfig.xml");

      sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);

      reader.close();

    } catch (IOException e) {

      // Fail fast.

      throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);

    }

  }

 

  public static List selectAllAccounts () throws SQLException {

    return sqlMapper.queryForList("selectAllUsers");

   

  }

 

  public static Map selectAllUsersForMap() throws SQLException

  {

         return sqlMapper.queryForMap("selectAllUsers", null, "user_NO");

  }

 

  public static User_Info_Bean selectAccountById  (int id) throws SQLException {

    return (User_Info_Bean) sqlMapper.queryForObject("selectAccountById", new Integer(id));

  }

 

  public static void insertAccount (User_Info_Bean account) throws SQLException {

    sqlMapper.insert("insertAccount", account);

  }

 

  public static void updateAccount (User_Info_Bean account) throws SQLException {

    sqlMapper.update("updateAccount", account);

  }

 

  public static void deleteAccount (int id) throws SQLException {

    sqlMapper.delete("deleteAccount", new Integer(id));

  }

 

}

 

덧붙여서... 자바 빈 클래스는 대소문자 제대로 지켜서 써야한다... 제대로 안쓰면 에러 빠바박... 민감한 녀석 같으니라고...

 

난 Map 으로 리턴받는게 더 편하다 ;; Map 으로 리턴 받으려고 해도.... 안될거 같다.. 이게 그래도 DAO 짜는거보다야 편할수도

 

있겠지만... 어째... 비슷해보인다 -_-?? DAO 가 아무리 40~50줄이지만 어차피 카피엔페이스트이고 SQL 문만 바꿔주고 파라미터 세팅만

 

바뀌는데 ... 으휴... 어차피 SQL을 언어에 종속적이지 않고 컴파일이 필요없고.... 등의 이유가 있을수 있지만... 언어에 종속적이지 않을

 

프로젝트가 얼마나 되며 , SQL 문 테스트 없이 코드에 반영하는 프로그래머가 얼마나 될것이며... 파라미터 세팅같은 반복작업을 틀릴 사람은

 

얼마나 되겠는가? 따라서 나름 편한거 써도 된다는 생각을 가진다....





Comments