Spring JDBC - 2.구현방법 :: 스프링(spring)/아이바티스(IBatis)/하이버네이트(Hibernate)[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

스프링(spring)/아이바티스(IBatis)/하이버네이트(Hibernate)
[1]
등록일:2008-06-11 11:28:12 (0%)
작성자:
제목:Spring JDBC - 2.구현방법
Spring  JDBC에서는  JDBC에서  지원하던  기능들을  [표4-6]의  API를  이용하고  지원하고  있다.  데이터베이스와의  Connection을  관리하기  위하여  DataSource만을  이용하고  있으며,  쿼리를  실행하는  방법으로는  JdbcTemplate과  SQLObject  두  가지  방식을  지원하고  있다.  이  두  가지  방법으로  쿼리를  실행하는  쿼리를  실행하는  과정을  살펴보면서  각각의  장단점에  대해서  살펴보도록  하겠다.  또한  JDBC에서  ResultSet과  RowSet으로  반환되던  쿼리  결과는  POJO  List  또는  Map으로  변환할  수  있다.

  

*  JdbcTemplate  기반  하에서  구현

JdbcTemplate을  이용하는  방법은  모든  클래스를  JdbcTemplate클래스가  가지고  있는  메소드를  이용하여  실행하는  것이다.

  

[예제4-6]  SpringJDBCWithTemplateBoardDAO.java

public  class  SpringJDBCWithTemplateBoardDAO  extends  MyJdbcDaoSupport  implements
    BoardDAO  {

  

  ...  중간  생략  ...

  

  public  Board  insert(Board  board)  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage("board.sql.insert");
    int  boardNo  =  getIncrementer().nextIntValue();
    board.setBoardNo(boardNo);
    Object[]  values  =  {  new  Integer(boardNo),  board.getTitle(),
        board.getName(),  board.getEmail(),  board.getPassword(),
        board.getCreateDate(),  board.getContent()  };

    getJdbcTemplate().update(sql,  values);

    return  board;
  }

  

  public  Board  update(Board  board)  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage("board.sql.update");
    Object[]  values  =  {  board.getTitle(),  board.getName(),
        board.getEmail(),  board.getContent(),
        new  Integer(board.getBoardNo())  };
    getJdbcTemplate().update(sql,  values);

    return  board;
  }

  

  ...  중간  생략  ...

  

  public  Board  findBoard(int  boardNo)  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage(
        "board.sql.select.byboardno");

    RowMapper  rowMapper  =  new  RowMapper()  {
      public  Object  mapRow(ResultSet  rs,  int  rownum)  throws  SQLException  {
        Board  board  =  new  Board();
        board.setTitle(rs.getString("title"));
        board.setName(rs.getString("name"));
        board.setEmail(rs.getString("email"));
        board.setPassword(rs.getString("password"));
        board.setCreateDate(rs.getString("createdate"));
        board.setContent(rs.getString("content"));
        board.setHitCount(rs.getInt("hitCount"));

        return  board;
      }
    };

    Board  board  =  (Board)  getJdbcTemplate().queryForObject(sql,
        new  Object[]  {  new  Integer(boardNo)  },  rowMapper);
    board.setBoardNo(boardNo);

    return  board;
  }

  

  

  public  List  findBoardList(int  currentPage,  int  countPerPage)
      throws  DataAccessException  {
    int  start  =  (currentPage  -  1)  *  countPerPage;

    String  sql  =  getMessageSourceAccessor().getMessage(
        "board.sql.select.list");

    RowMapper  rowMapper  =  new  RowMapper()  {
      public  Object  mapRow(ResultSet  rs,  int  rownum)  throws  SQLException  {
        Board  board  =  new  Board();
        board.setBoardNo(rs.getInt("boardNo"));
        board.setTitle(rs.getString("title"));
        board.setName(rs.getString("name"));
        board.setEmail(rs.getString("email"));
        board.setCreateDate(rs.getString("createdate"));
        board.setHitCount(rs.getInt("hitCount"));

        return  board;
      }
    };

    List  list  =  getJdbcTemplate().query(sql,
        new  Object[]  {  new  Integer(start),  new  Integer(countPerPage)  },
        rowMapper);

    return  list;
  }

  

  

  public  int  getTotalNo()  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage(
        "board.sql.totalcount");
    return  getJdbcTemplate().queryForInt(sql);
  }

  

}

  

  

  

[예제4-7]SpringJDBCWithTemplateBoardFileDAO.java

public  class  SpringJDBCWithTemplateBoardFileDAO  extends  MyJdbcDaoSupport
    implements  BoardFileDAO  {

  

  ...  중간  생략  ...

  

  public  int  insert(final  int  boardNo,  final  List  boardFileList)
      throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage(
        "boardfile.sql.insert");

    BatchPreparedStatementSetter  bpsSetter  =  new  BatchPreparedStatementSetter()  {
      public  void  setValues(PreparedStatement  ps,  int  i)
          throws  SQLException  {
        BoardFile  boardFile  =  (BoardFile)  boardFileList.get(i);
        int  boardFileNo  =  getIncrementer().nextIntValue();
        ps.setInt(1,  boardFileNo);
        ps.setInt(2,  boardNo);
        ps.setInt(3,  boardFile.getFileSize());
        ps.setString(4,  boardFile.getFileName());
        ps.setString(5,  boardFile.getContentType());
        ps.setString(6,  boardFile.getTempFileName());
      }

      public  int  getBatchSize()  {
        return  boardFileList.size();
      }
    };

    int  result[]  =  getJdbcTemplate().batchUpdate(sql,  bpsSetter);

    int  insertResult  =  0;
    for  (int  i  =  0;  i  <  result.length;  i++)  {
      insertResult  +=  result[i];
    }
    return  insertResult;
  }

  

  

  public  int  deleteByBoardFileNo(int  boardFileNo)  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage(
        "boardfile.sql.delete.byboardfileno");

    return  getJdbcTemplate().update(sql,
        new  Object[]  {  new  Integer(boardFileNo)  });
  }

  

  

  public  List  findBoardFileList(int  boardNo)  throws  DataAccessException  {
    String  sql  =  getMessageSourceAccessor().getMessage(
        "boardfile.sql.select.byboardno");

    RowMapper  rowMapper  =  new  RowMapper()  {
      public  Object  mapRow(ResultSet  rs,  int  rownum)  throws  SQLException  {
        BoardFile  boardFile  =  new  BoardFile();
        boardFile.setFileNo(rs.getInt("fileNo"));
        boardFile.setFileSize(rs.getInt("fileSize"));
        boardFile.setFileName(rs.getString("fileName"));

        return  boardFile;
      }
    };

    List  boardFileList  =  getJdbcTemplate().query(sql,
        new  Object[]  {  new  Integer(boardNo)  },  rowMapper);

    return  boardFileList;
  }

  

}

  

JdbcTemplate  클래스는  SQL쿼리의  CRUD를  지원하기  위하여  다양한  메소드를  지원하고  있다.

  

Insert,  Update,  Delete

JdbcTemplate  클래스는  insert,  update,  delete쿼리를  지원하기  위하여  update  메소드를  다음과  같이  지원하고  있다.

int  update(String  sql)

int  update(String  sql,  Object[]  args)

int  update(String  sql,  Object[]  args,  int[]  argtypes)

  

Select

JdbcTemplate  클래스는  select  쿼리를  지원하기  위하여  다음과  같이  지원하고  있다.

int  queryFoInt(String  sql)

int  queryForInt(String  sql,  Object[]  args)

long  queryForLong(String  sql)

long  queryForLong(String  sql,  object[]  args)

Object  queryForObject(String  sql,  Class  requiredType)

Object  queryForObject(String  sql,  Object[]  args,  RowMapper  rowMapper)

List  queryForList(String  sql)

List  queryForList(String  sql,  Object[]  args)

  

JdbcTemplate  클래스는  select쿼리를  실행가히  위하여  지원하고  있는  queryXXX()메소드  외에도  많은  API를  지원하고  있다.  이  책에서  다루지  못한  queryXXX()메소드는  API  문서를  참고하기  바란다.

  

[예제4-6]과[예제4-7]을  보면  Resultset으로  반환되는  데이터를  POJO  또는  POJO  또는  POJO  List로  변환하는  작업을  RowMapper클래스의  mapRow()메소드에서  구현하고  있다.  RowMapper  클래스의  mapRow()  메소드는  JdbcTemplate에서  ResultSet데이터를  POJO로  변환할  때  호출되는  콜백(Callback)메소드이다.  만약  데이터베이스  컬럼의  이름과  도메인  모델  속성의  이름이  같다면  RowMapper클래스를  사용할  필요  없이  queryForObject(String  sql,  Class  requiredType)메소드를  이용하여  자동적으로  데이터  바인딩을  할  수  있다.  데이터베이스  컬럼의  이름과  도메인  모델  속성의  이름이  같지  않을  경우에는  [예제4-6]과  [예제4-7]에서  보는  바와  같이  RowMapper클래스의  mapRow()메소드를  이용하여  수종적으로  데이터  바인딩을  해야  한다.

  
[출처]  Spring  JDBC  -  2.구현방법  |작성자  타이거


[본문링크] Spring JDBC - 2.구현방법
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=30330
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.