마이바티스
위의 링크로 들어가 jar 파일을 다운받은후 추가 하자.
신세계 마이바티스를 공부해 보자. (아이바 티스를 안보신분은 먼저 그것부터 보길 바란다 ) http://sararing.springnote.com/pages/10976942
MyBatis-3-User-Guide_ko.pdf <== 마이바 티스 한글 유저 가이드 .
먼저 마이바티스란. odbc 프레임웍으로 웹페이지 에서 필요한 디비를 최대한 능동적으로 (빠른 접속시간및 코드의 효율 최상화)를 위해 사용 하게 된다.
먼저 우리가 기본적으로 생성하게 되는 MemberDaoOracleMpl.java 파일을 보자
findByPk 메서드를 중심으로 설명해 보겠다.
rs 생성후 파라미터 연결 또 보드객체 생성 받고 rs psmt conn 닫고 ./ 여기서 이러한 코드들이 거의 의미 없이 무제한 적으로 사용 하게 되는것에 의문을 가질수 있다.
실제로 쿼리 문장은 매우 규칙적이고 심플 하기 때문에 이러한 의미 없는 코딩을 줄이고 풀링및 접속 환경 까지 제어 해주는것이 마이바티스 이다.
위와 같은 코드식을
이렇게 만들었다. DAO 의 인터페이스인 IMDAO를 implement 했다. 이렇든 간단하게 형식에 맞추어 구현이 가능한 것이 마이바 티스 이다.
사용에 먼저 가장 먼저 할일은
res 소스 폴더를 만든다 이후에 kr.or.ddit.mybatis 패키지를 생성후 패키지의 루트에 config.xml 파일을 생성 하자.
마이바티스 기본 설정 이다. jar 파일은 이미 추가 했다는 전제 이다.
config.xml 의 소스 내용 이다. 중요한 부분으로는 typeAliases 를 볼수 있다 . 위 소스를 보면 MemberBean 및 BoardBean 과 같은 bean 파일을 type 으로 지정 하여
애칭을 주며. 차후에 factory 등에서 쉽게 kr.or.ddit.member.vo.MemberBean 를 member 라고 적어 구현 할수 있다.
여기서 중간 내용을 적용 하여 dataSource pooled 에서 드라이브및 url username password 등을 적어 구현 한다.
밑단에 보면 mappers 를 확인해 보자. 이하 매핑 이라고 하면 mappers 라고 알고 있자
mapper 의 리소스에는 mapping 에 각기 member.xml board.xml 이 있다 이이곳에서 실질적인 데이터베이스에 필요한 sql 문을 구현 하게 된다.
위 사진은 member.xml 구현부 이다. 여기서 namespace 를 DAO 에 잡으며 반드시 select 문의 id 값은 DAO 에서 구현한 메서드의 이름과 같아야 자동 매칭이 가능하다.
구문 에서 parameterType="String" resultType="member" 메서드 실행시 파라미터 의 종류로 String 과 돌려주는 값이 member 임을 알수 있다.
여기서 member는 위에서 알리아스(애칭)을 적용 한값을 사용 함을 알수 있다.
받은 값에 대하여 마치 파라미터를 받는것과 마찬 가지로 #{mem_id} 등의 형식으로 적어 member 객체로 받아 MemberDaoMyBatis.java 에서 구현 한다.
위의 사진에서 MemberDaoMyBatis.java 의 구현 사진이다. 실질적으로 MemberServiceIMpl.java 에서는 이 명령을 구현 하게 된다 . session factory 구현에 메퍼를 사용함을
주의 깊게 보자. openSession파라미터 true commit()을 의미 하니 셀렉트 문에는 구지 안넣어도 되나 db 값이 변화 하는 경우 반드시 추가 해야만 한다.
위의 사진에서 보면 실질적으로 jsp 단에서 파일을 생성 구현 하는 부분은 두 부분이다. 먼저 직접적인 생성및 사용하게 되는 BoardServiceIMple 이 있다.이곳 에서 일차 적으로 jsp 에서 사용 하게 되며
service 에서는 두가지 선택이 가능 하다. BoardDaoOracle 과 BoardDaoMybatis 이다. 기본적인 factory 단을 이용 하여 구현 하는게 훨신 간단하게 소스구현을 할수 있다는것을 알수 있다.
추가로 member의 UML 도 확인하자.
소스
config.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>
<typeAliases>
<typeAlias alias="member" type="kr.or.ddit.member.vo.MemberBean"/>
<typeAlias alias="board" type="kr.or.ddit.board.vo.BoardBean"/>
</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="hun"/>
<property name="password" value="java"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="kr/or/ddit/mapping/member.xml"/>
<mapper resource="kr/or/ddit/mapping/board.xml"/>
</mappers>
</configuration>
MyBatisFactory.java
package kr.or.ddit.mybatis;
import java.io.IOException;
import java.io.Reader;
import javax.management.RuntimeErrorException;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
public class MyBatisFactory {
private static SqlSessionFactory sqlMapper;
static{
try {
String resource = "kr/or/ddit/mybatis/config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(),e);
}
}
public static SqlSessionFactory getSqlMapper() {
return sqlMapper;
}
}
member.xml (member 의 매핑 파일)|| 실제 sql문 구현
<?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="kr.or.ddit.board.dao.IBoardDao">
<cache eviction="LRU" flushInterval="600000" size="512" readOnly="true" />
<select id="findAllByPage" parameterType="map" resultType="board">
select *
from (select rownum rn,a.*
from (select *
from board
order by bo_no desc
)a
where <![CDATA[ rownum <= #{endRow}]]>
)
where <![CDATA[rn >= #{startRow}]]>
</select>
<select id="findByPk" parameterType="int" resultType="board">
select * from BOARD where bo_no=#{bo_no}
</select>
<select id="getBoardCount" resultType="int" parameterType="map">
select count(*) from board
</select>
<insert id="insertBoard" parameterType="board" >
INSERT INTO board (bo_no,bo_title,bo_writer,bo_passwd,bo_email,bo_ip,
bo_content,bo_hit,bo_date)
VALUES(board_seq.nextval,#{bo_title}, #{bo_writer}, #{bo_passwd}, #{bo_email}, #{bo_ip},
#{bo_content}, 0, sysdate)
</insert>
<update id="hitCount" parameterType="board">
update board set
BO_HIT =#{bo_hit}
where BO_NO=#{bo_no}
</update>
<update id="updateBoard" parameterType="board">
update board set
BO_TITLE =#{bo_title},
BO_WRITER =#{bo_writer},
BO_EMAIL =#{bo_email} ,
BO_IP =#{bo_ip} ,
BO_CONTENT =#{bo_content}
where BO_NO=#{bo_no}
</update>
</mapper>
board.xml (mapper 구현부)
<?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="kr.or.ddit.member.dao.IMemberDao">
<select id="findByPk" parameterType="String" resultType="member">
select * from member where mem_id= #{mem_id}
</select>
<select id="findByAll" resultType="member">
select * from member
</select>
<insert id="insertMember" parameterType="member">
INSERT INTO MEMBER
(MEM_ID,MEM_PASS, MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_BIR,
MEM_ZIP, MEM_ADD1, MEM_ADD2, MEM_HOMETEL, MEM_COMTEL, MEM_HP,
MEM_MAIL, MEM_JOB, MEM_LIKE, MEM_MEMORIAL,MEM_MEMORIALDAY,
MEM_MILEAGE, MEM_DELETE)
VALUES
(#{mem_id},#{mem_pass}, #{mem_name},#{mem_regno1},#{mem_regno2},#{mem_bir},
#{mem_zip}, #{mem_add1}, #{mem_add2}, #{mem_hometel}, #{mem_comtel}, #{mem_hp},
#{mem_mail}, #{mem_job}, #{mem_like}, #{mem_memorial},#{mem_memorialday},0,'N' )
</insert>
<update id="updateMember" parameterType="member">
update MEMBER set
MEM_NAME =#{mem_name},
MEM_REGNO1 =#{mem_regno1},
MEM_REGNO2 =#{mem_regno2},
MEM_BIR =#{mem_bir},
MEM_ZIP =#{mem_zip},
MEM_ADD1 =#{mem_add1},
MEM_ADD2 =#{mem_add2},
MEM_HOMETEL =#{mem_hometel},
MEM_COMTEL =#{mem_comtel},
MEM_HP =#{mem_hp},
MEM_MAIL =#{mem_mail},
MEM_JOB =#{mem_job},
MEM_LIKE =#{mem_like},
MEM_MEMORIAL =#{mem_memorial},
MEM_MEMORIALDAY =#{mem_memorialday},
MEM_MILEAGE =#{mem_mileage},
MEM_DELETE =#{mem_delete}
where MEM_ID =#{mem_id}
</update>
<select id="findByJob" resultType="member">
select * from member
<where>
<if test="array !=null">
<foreach collection="array" item="item" open=" mem_jop in(" close=")" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>
BoardDaoMyBatise.java
package kr.or.ddit.board.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import kr.or.ddit.board.vo.BoardBean;
import kr.or.ddit.mybatis.MyBatisFactory;
public class BoardDaoMyBatis implements IBoardDao {
private SqlSessionFactory factory = MyBatisFactory.getSqlMapper();
@Override
public int insertBoard(BoardBean board) {
SqlSession session = factory.openSession(true);
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.insertBoard(board);
} finally{
session.close();
}
}
@Override
public int updateBoard(BoardBean board) {
SqlSession session = factory.openSession(true);
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.updateBoard(board);
} finally{
session.close();
}
}
@Override
public int deleteBoard(BoardBean board) {
SqlSession session = factory.openSession();
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.deleteBoard(board);
} finally{
session.close();
}
}
@Override
public int getBoardCount(Map<String, Object> paramMap) {
SqlSession session = factory.openSession();
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.getBoardCount(paramMap);
} finally{
session.close();
}
}
@Override
public List<BoardBean> findAllByPage(Map<String, Object> paramMap) {
SqlSession session = factory.openSession();
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.findAllByPage(paramMap);
} finally{
session.close();
}
}
@Override
public BoardBean findByPk(int bo_no) {
SqlSession session = factory.openSession();
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.findByPk(bo_no);
} finally{
session.close();
}
}
@Override
public int hitCount(BoardBean board) {
SqlSession session = factory.openSession(true);
try {
IBoardDao boardDao = session.getMapper(IBoardDao.class);
return boardDao.hitCount(board);
} finally{
session.close();
}
}
}
MemberDaoMyBatis.java
package kr.or.ddit.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import kr.or.ddit.member.vo.MemberBean;
import kr.or.ddit.mybatis.MyBatisFactory;
public class MemberDaoMyBatis implements IMemberDao {
private SqlSessionFactory factory = MyBatisFactory.getSqlMapper();
@Override
public int insertMember(MemberBean member) {
// factory.openSession(true); 오토코밋 가능
SqlSession session = factory.openSession(true);
try {
//return session.insert("kr.or.ddit.member.dao.IMemberDao.insertMember",member);
// 위에엇을 밑에 것으로 변환 해서 사용.
IMemberDao dao = session.getMapper(IMemberDao.class);
return dao.insertMember(member);
} finally {
session.close();
// session 을 close 하면서 dao를 null로 돌려 주므로 IMemberDao 를 전역 변수로 사용 하지 않아도 된다..
}
}
@Override
public int updateMember(MemberBean member) {
// factory.openSession(true); 오토코밋 가능
SqlSession session = factory.openSession(true);
try {
IMemberDao dao = session.getMapper(IMemberDao.class);
return dao.updateMember(member);
//return session.update("kr.or.ddit.member.dao.IMemberDao.updateMember",member);
} finally {
session.close();
}
}
@Override
public int deleteMember(String mem_id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<MemberBean> findByAll() {
SqlSession session = factory.openSession();
try {
//return session.selectList("kr.or.ddit.member.dao.IMemberDao.findByAll");
IMemberDao dao = session.getMapper(IMemberDao.class);
return dao.findByAll();
} finally {
session.close();
}
}
@Override
public MemberBean findByPk(String mem_id) {
SqlSession session = factory.openSession(true);
try {
IMemberDao dao = session.getMapper(IMemberDao.class);
return dao.findByPk(mem_id);
} finally {
session.close();
}
}
}
이 글은 스프링노트에서 작성되었습니다.
'JSP' 카테고리의 다른 글
Multiple Parameter (0) | 2012.05.08 |
---|---|
log4j구현환경제공. (0) | 2012.05.08 |
MVC패턴 (0) | 2012.05.08 |
Login&Logout 기본패턴 (0) | 2012.05.08 |
log4j (0) | 2012.05.08 |