본문으로 바로가기

마이바티스 CRUD(조회)

category 데이터베이스/마이바티스 2019. 1. 3. 18:17

마이바티스 CRUD(조회)

 

마이바티스에서 데이터를 조회하는 것이 가장 중요하다고 생각합니다.

 

물론 나머지 CUD도 중요합니다.

 

우선 마이바티스 파라미터 표기법에 대해 들어보셨나요?

 

매핑 구문에서 파라미터를 설정하기 위해 사용하는 건데요

 

#{ commentNo }와 같은 형식으로 쓰입니다.

 

조회 같은 경우 SQL에서 값을 설정 하기 때문이죠.

 

즉 XML에 분리하였기 때문에 이러한 문법이 필요한겁니다.

 

파라미터 이름을 그대로 적어주시면 됩니다.

 

자바빈의 경우엔 getter/setter에서 get/set을 제외한 소문자로 적어 주시면 될거구요.

 

즉 마이바티스 파라미터 표기법은 PreparedStatement의 ? 표현식으로 바뀌게 됩니다.

 

뒤에서 더 자세히 보도록 하죠.

 

데이터를 조회!! 하기 위해서는 우선 데이터가 존재해야 합니다.

 

여러분들은 아래 같이 SQL 구문을 통해 데이터를 삽입합니다.

 

insert into `comment` (`comment_no`,`user_id`,`comment_content`,`reg_date`) values('2','manager','test','2019-01-01 09:22:39');

 

우선 마이바티스 코드로 변환 하기 전인 전통적인 JDBC 코드를 살펴보겠습니다.

 

public Comment selectCommentByPrimaryKey(Long commentNo) {
  Connection conn = null;
  PreparedStatement stmt = null;
  ResultSet rs = null;
  try {
   conn = this.getConnection();
   StringBuilder sql = new StringBuilder("");
   sql.append("SELECT comment_no, user_id, comment_content, reg_date ");
   sql.append("FROM COMMENT ");
   sql.append("WHERE comment_no = ?");
   stmt = conn.prepareStatement(sql.toString());
   stmt.setLong(1, commentNo);
   rs = stmt.executeQuery();

   if (rs.next()) {
    Comment comment = new Comment();
    comment.setCommentNo(rs.getLong("comment_no"));
    comment.setUserId(rs.getString("user_id"));
    comment.setCommentContent(rs.getString("comment_content"));
    comment.setRegDate(rs.getDate("reg_date"));
    return comment;
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try { rs.close(); } catch (SQLException e) {}
   try { stmt.close();} catch (SQLException e) {}
   try { conn.close();} catch (SQLException e) {}
  }
  return null;
 }

위 코드에서

 

초록색 부분 코드는 데이터베이스 연결 생성 코드입니다.

 

Connection 객체는 데이터베이스 연결 객체

PreparedStatement 객체는 SQL구문 정보 갖는 객체

ResultSet 객체는 조회 결과를 갖는 객체

 

3개의 객체로 나누어지며 이중 ResultSet 객체 제외 2개 객체는 필수 조건입니다. 이 객체들은 try 전에 선언되어야합니다.

 

그리고 무조건 해제를 해줘야합니다.

 

이 부분은 마이바티스 코드로 변환 할 경우 SqlSession 객체를 생성하는 것으로 대체 됩니다.

 

 

보라색 부분 코드는 SQL 준비 후 PreparedStatement 객체를 생성 코드입니다.

 

데이터 조회를 하는 SQL을 생성 합니다. 이때 너무 길기 때문에 StringBuilder 객체를 생성하고 append로 붙여주었습니다.

 

댓글 번호로 조회하기 때문에 PreparedStatement의 ?로 표기하였습니다. 그리고 PreparedStatement 객체를 생성합니다.

 

이 부분은 마이바티스 코드려 변환 할 경우 매핑 구문을 정의하는 것으로 대체 됩니다.

 

 

하늘색 부분 코드PreparedStatement 객체에 파라미터를 설정 후 실행하는 코드입니다.

 

stmt(PreparedStatemtn의 객체)를 가지고 실행하여 반환 부분은 ResultSet 객체가 가집니다.

 

이 부분은 마이바티스 코드로 변환 할 경우 select, selectList 등 호출 하는 것으로 대체 됩니다.

 

분홍색 부분 코드는 조회 결과를 Comment 객체에 설정 하는 코드입니다.

 

ResultSet 객체에서 값을 가져옵니다. 그 다음 앞서 설정한 자바 모델 클래스에 setter 메서드를 통해 설정합니다.

 

이 부분은 마이바티스 코드로 변환 할 경우 매핑구문과 마이바티스 API를 사용하는 것으로 대체 됩니다.

 

 

노란색 부분 코드는 데이터베이스 자원을 해체합니다.

 

finnalyy 부분에 쓰였으며

 

이 부분은 마이바티스 코드로 변환 할 경우 SqlSession 객체의 close() 메소드로 대체됩니다.

 

 

 

우선 데이터를 조회하는 매핑 구문으로 분리을 해야합니다.

 

즉 SQL을 별도 XML에 분리합니다.

 

이 XML 파일은 매핑 구문을 담고 있으므로 매퍼 XML이라고 불립니다.

 

해당 xml 파일을 만들어 줍니다. src/ldg/mybatis/repository/mapper 안에 만들어줍니다.

 

경로 설정은 알아셔 하셔두 되겠습니다.

 

즉 이 xml의 네임스페이스를 ldg.mybatis.repository.mapper로 설정할 겁니다.

 

CommentMapper.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="ldg.mybatis.repository.mapper.CommentMapper">

 

<select id="selectCommentByPrimaryKey" parameterType="long" resultType="ldg.mybatis.model.Comment">
  SELECT
      comment_no AS commentNo,

      user_id AS userId,

      comment_content AS commentContent,

      reg_date AS regDate
  FROM COMMENT
  WHERE comment_no = #{commentNo}
 </select>

 </mapper>

 

 

 이렇게 작성을 합니다.

 

빨간색 코드 부분은 XML과 DOCTYPE 선언 문입니다.

 

해당 코드는 XML 이고 DTD 선언입니다.

 

 

 

초록색 코드 부분은 위에서 말한 네임스페이스 선언입니다.

 

네임스페이스는 매핑 구문들의 그룹이라고 볼 수 있습니다.

 

아이디가 같더라도 네임스페이스로 잘 분류가 된다고 볼 수 있습니다.

 

 

 

보라색 코드 부분은 매핑 구문으로 JDBC 코드에서 SQL문을 따온 것이다.

 

select 태그에서 id와 파라미터 타입 결과 데이터 타입을 작성해줍니다.

 

id는 필수 요건입니다. 연결고리가 필요하기 때문입니다.

 

파라미터 타입은 조회 조건에 사용 값 타입을 지정해줍니다.

 

결과 데이터 타입은 말 그대로 결과 데이터의 타입을 지정해줍니다. 흔히 자바빈 또는 맵을 이용합니다.

 

 

이렇게 매핑 구문은 select/insert/update/delete 앨리먼트를 적절히 사용하시면 됩니다.

 

마지막으로 이 작성한 매핑 구문을 사용해야 겠지요.

 

그러기 위해서는 마이바티스 코드를 생성합니다.

 

즉 자바코드에서 이 매핑 구문을 사용해야합니다.

 

먼저 자바코드(CommentSessionRepository.java)를 생성해줍니다.

 

패키지는 ldg.mybatis.repository.session으로 지정합니다.

 

public class CommentSessionRepository {
 private final String namespace = "ldg.mybatis.repository.mapper.CommentMapper";

 private SqlSessionFactory getSqlSessionFactory() {
  String resource = "mybatis-config.xml";
  InputStream inputStream;
  try {
   inputStream = Resources.getResourceAsStream(resource);
  } catch (IOException e) {
   throw new IllegalArgumentException(e);
  }
  return new SqlSessionFactoryBuilder().build(inputStream);
 }

 public Comment selectCommentByPrimaryKey(Long commentNo) {
  SqlSession sqlSession = getSqlSessionFactory().openSession();
  try {

   String statement="ldg.mybatis.repository.mapper.CommentMapper.selectCommentByPrimaryKey";
   return (Comment)sqlSession.selectOne(statement, commentNo);
  } finally {
   sqlSession.close();
  }
 }

 

 

첫 메소드는 앞서 배웠던 SqlSessionFactory 객체를 생성하는 부분입니다.

 

두 번째 메소드가 매핑 구문을 사용하는 메소드입니다.

 

이 메소드에서 우선 sqlSession 객체를 얻습니다. 있으면 기존 객체를 사용합니다.

 

이 객첸느 설정을 갖는 매우 중요한 객체입니다.

 

즉 매핑 구문을 사용하려면 기본적으로 이 객체를 이용해야합니다.

 

왜냐하면 Context-mapper.xml에는 mapper 태그가 설정돼있습니다.

 

이 작업은 연결 객체를 생성하는 것과 비슷하다고 보면 되겠습니다.

 

그 후 데이터를 조회합니다.

 

selectOne 메소드에 첫 파라미터로 매핑 구문을 지정해주면 됩니다.

 

이 작업은 executeQuery 메소드와 ResultSet 객체에서 데이터를 설정해주는 두 작업을 모두 처리해주는 역할입니다.

 

마지막으로 자원을 해체합니다.

 

얻은 SqlSession 객체를 close를 해주면 되겠습니다.

 

 

이제 진짜 마지막으로 데이터를 조회하는 코드만 남았습니다.

 

 

지금 까지 설정파일을 설정하고 마이바티스 객체를 만든 후 SQL을 XML에 분리하여 이를 API를 사용하여 호출했습니다.

 

이제 준비는 완료했습니다.

 

이를 가져오기만 하면 됩니다.

 

public class CommentSessionRepositoryTest{

public static void main(String[] args){

Long commentNo=1L;

 

CommentSessionRepository commentSessionRepository=new CommentSessionRepository();

 

Comment comment=commentSessionRepository.selectCommentByPrimaryKey(commentNo);

}

}

 

이렇게 데이터 조회를 해주는 부분을 봤습니다.

 

다음 포스팅은 입력에 대해 포스팅하겠습니다.

 

감사합니다.

 

 

 

 

 

 

'데이터베이스 > 마이바티스' 카테고리의 다른 글

마이바티스 CRUD(수정)  (0) 2019.01.07
마이바티스 CRUD(삽입)  (0) 2019.01.04
마이바티스 CRUD(자바모델클래스)  (0) 2019.01.02
마이바티스 시작  (0) 2018.12.30
마이바티스(Mybatis) 개요  (0) 2018.12.28