2016년 10월 28일 금요일

68day / Framework / MyBatis 연습


MyBatis 예제를 통하여 학습하기

  • SqlSessionFactoryManager.java
MyBatis 설정 정보(SqlSessionConfig.xml->mapper 계열xml) 를 로딩하는 객체

public class SqlSessionFactoryManager {
    private static SqlSessionFactoryManager instance = new SqlSessionFactoryManager();
    private SqlSessionFactory factory;
    private SqlSessionFactoryManager() {
        String config = "mybatis/config/SqlSessionConfig.xml";
        try {
            Reader r = Resources.getResourceAsReader(config);
            factory = new SqlSessionFactoryBuilder().build(r);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSessionFactoryManager getInstance() {
        return instance;
    }
    public SqlSessionFactory getFactory() {
        return factory;
    }
    public static void main(String[] args) {
        System.out.println(SqlSessionFactoryManager.getInstance().getFactory());
    }
}
cs

  • SqlSessionConfig.xml
MyBatis DataSource에 대한 설정 및 SQL 정의 xml 에 대한
매핑 spring과 연동시에는 spring 설정에서 DataSource(dbcp) 를 정의한다.

<?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 type="model.MemberVO" alias="mvo" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
                <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
                <property name="username" value="scott" />
                <property name="password" value="tiger" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/config/member.xml" />
    </mappers>
</configuration>
cs

MyBatis를 사용하면 이런 과정들이 필요하다
Mapper와 설정정보를 통하여 기본 작업들을 준비한다고 보면된다
(예를들면 기존에 DAO에서 매번 접속하고 끊었던 반복코드들이 사라졌다)

  • SqlMapper
갑자기 xml의 mapper가 추가되었다 하지만 정말 보기좋고 깔끔하게
sql문들을 볼수 있으며 그전에 물음표 (?)로 사용되었던 표기법이
#{value}와 #{param}등으로 바뀌었다.

<?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="member">
    <sql id="selectMember">
        select id,password,name,address from spring_member
    </sql>
    <select id="findMemberById" resultType="map">
        <include refid="selectMember"></include>
        where id=#{value}
    </select>
    <select id="findMemberById2" resultType="mvo">
        <include refid="selectMember"></include>
        where id=#{value}
    </select>
    <select id="getAllMemberList" resultType="mvo">
        <include refid="selectMember"></include>
    </select>
    <insert id="registerMember" parameterType="mvo">
        insert into
        spring_member(id,password,name,address)
        values(#{id},#{password},#{name},#{address})
    </insert>
</mapper>
cs

  • DAO
 당연히 DAO가 빠질 수는 없다.
일단 Sql 설정정보가 저장된 Mapper 객체를 사용하여야한다.
핵심은 sessoin을 꼭 열고 닫는다!
그리고 ("namespace로 연동", 매개변수);
를 통하여 SqlMapper와 연동되어 값이 전달된 후 Sql문이 수행된다

public class MemberDAO {
    private static MemberDAO instance = new MemberDAO();
    private SqlSessionFactory factory;// MyBatis Mapper 객체
    private MemberDAO() {
        factory = SqlSessionFactoryManager.getInstance().getFactory();
    }
    public static MemberDAO getInstance() {
        return instance;
    }
    public Map<StringString> findMemberById(String id) {
        Map<StringString> map = null;
        SqlSession session = factory.openSession();
        try {
            map = session.selectOne("member.findMemberById", id);
        } finally {
            session.close();
        }
        return map;
    }
    public MemberVO findMemberById2(String id) {
        MemberVO vo = null;
        SqlSession session = factory.openSession();
        try {
            vo = session.selectOne("member.findMemberById2", id);
        } finally {
            session.close();
        }
        return vo;
    }
    public List<MemberVO> getAllMemberList() {
        SqlSession session = factory.openSession();
        List<MemberVO> list = null;
        try {
            list = session.selectList("member.getAllMemberList");
        } finally {
            session.close();
        }
        return list;
    }
    public void registerMember(MemberVO paramVO) {
        SqlSession session = factory.openSession();
        try {
            session.insert("member.registerMember", paramVO);
            session.commit();
        } finally {
            session.close();
        }
    }
}
cs


역시나 초반에는 달라진 표기법으로 애를 먹었다.
하지만 표기법에 익숙해지고 Sql에 대한 이해도가 높아진다면
비즈니스 로직에 집중할 수 있을 것 같다 물론 파일이 하나 더 생기지만
가독성이 좋아 만족스럽다

0 개의 댓글:

댓글 쓰기