11.4. Modeling JDBC operations as Java objects
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#]