DB를 좀더 객체지향적인 방법으로 접근하도록 다음의 클래스들을 사용할 수 있습니다. 다음의 클래스들로 할 수 있는 일은 모두(StoredProcedure 클래스만 빼고) JdbcTemplate에 있는 메소드를 사용하여 할 수 있습니다. 하지만 아래 있는 클래스를 사용하는 것이 편한 유저들을 굳이 말리진 않겠다는 군요.[footnote]if you feel that you are getting measurable value from using the RDBMS
operation classes, feel free to continue using these classes.[/footnote]

11.4.1. SqlQuery

SQL 쿼리를 객체화 한 것으로 재사용 가능하며 멀티쓰레드 환경에서 안전한 클래스입니다.
이 클래스를 상속하는 클래스는 반드시 newRowMapper(..) 메소드를 구현해야 합니다.
이 메소드는 ResertSet에 있는 각각의 row를 객체로 맵핑 시키는 일을 합니다.
보통은 row를 자바 클래스로 매핑하는 일을 좀 더 쉽게 하기 위해 구현해둔 MappingSqlQuery  클래스를 상속하여 사용합니다.

11.4.2. MappingSqlQuery

이 클래스를 상속할 때는 mapRow(..) 메소드를 구현해서 각 row를 객체로 매핑할 수 있도록합니다.
[#M_예제 코드 보기..|less..| 쿼리는 다음과 같이 이 클래스를 상속하여 생성자를 활용하여 만들어줍니다.
private class CustomerMappingQuery extends MappingSqlQuery {

   public CustomerMappingQuery(DataSource ds) {
       super(ds, “SELECT id, name FROM customer WHERE id = ?”);
       super.declareParameter(new SqlParameter(“id”, Types.INTEGER));
       compile();
   }

   public Object mapRow(ResultSet rs, int rowNumber) throws SQLException {
       Customer cust = new Customer();
       cust.setId((Integer) rs.getObject(“id”));
       cust.setName(rs.getString(“name”));
       return cust;
   }
}

쿼리를 사용하기 위해서 위에서 만든 클래스의 객체를 만들고 쿼리의 파라미터에 들어갈 값을 객체의 배열로 넣어 줍니다.
public Customer getCustomer(Integer id) {
   CustomerMappingQuery custQry = new CustomerMappingQuery(dataSource);
   Object[] parms = new Object[1];
   parms[0] = id;
   List customers = custQry.execute(parms);
   if (customers.size() > 0) {
       return (Customer) customers.get(0);
   }
   else {
       return null;
   }
}_M#]11.4.3. SqlUpdate

update문을 나타내는 객체로 다음과 같이 사용합니다.
[#M_예제 코드 보기..|less..| public class UpdateCreditRating extends SqlUpdate {

   public UpdateCreditRating(DataSource ds) {
       setDataSource(ds);
       setSql(“update customer set credit_rating = ? where id = ?”);
       declareParameter(new SqlParameter(Types.NUMERIC));
       declareParameter(new SqlParameter(Types.NUMERIC));
       compile();
   }

   /**
    * @param id for the Customer to be updated
    * @param rating the new value for credit rating
    * @return number of rows updated
    */
   public int run(int id, int rating) {
       Object[] params =
           new Object[] {
               new Integer(rating),
               new Integer(id)};
       return update(params);
   }
}_M#]11.4.4. StoredProcedure

RDBMS에 있는 프로시져라는 것을 객체화 할 떄 사용한다고 하는데 gg… DB 공부 해야겠습니다.

11.4.5. SqlFunction

SQL 함수를 표현하는 클래스로 JdbcTemplate의 queryForXXX와 비슷한 기능을 합니다. 장점으로는 JdbcTempate을 만들지 않아도 됩니다.

단일 row를 위해 사용하며 좀 더 복잡한 쿼리를 표현하고 싶을 땐 StoredProcedure 나 SqlCall 를 사용하랍니다.
[#M_예제 코드 보기..|less..| SqlCall public int countRows() {
    SqlFunction sf = new SqlFunction(dataSource, “select count(*) from mytable”);
    sf.compile();
    return sf.run();
}_M#]