การใช้ JDBC with Spring Framework
posted on 27 Feb 2005 03:38 by somkiatการใช้ JDBC with Spring Framework
ตัวอย่างการใช้งาน jdbc เพื่อ access ข้อมูลใน database ซึ่งถูกจัดการโดย Spring Framework โดยตัวอย่างนี้จะเป็น java application (ไม่ใช่ web application)
Requirement
1. Database :: MySQL
2. My SQL driver :: mysql-driver.jar
3. Library of Spring frameowk สามารถ download ได้ที่ http://www.springframework
- spring.jar
- spring-core.jar
- spring-dao.jar
- common-logging.jar
มาดูตัวอย่างการใช้งานเลยครับ
1. Setup Datasource โดยทั่วไปใน web application นั้นจะทำการ config ไว้ที่ config file แต่ตัวอย่างนี้เราจะไม่ใช้ แต่ว่าจะใช้ org.springframework.jdbc.datasource.DriverManagerDataSource เป็นตัวจัดการดังนี้ครับ
private DriverManagerDataSource ds = null;
public void setupDataSource() {
ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/spring");
ds.setUsername("root");
ds.setPassword("");
}
public DriverManagerDataSource getDataSource() {
return ds;
}
2. หลังจากที่ทำการ setup datasource เสร็จแล้วมาดูกันว่าเราจะ manage data ผ่าน JDBC ด้วย spring framework กันอย่างไร
Spring's JDBC Framework นั้นจะใช้ org.springframework.jdbc.core.JdbcTemplate เป็นตัวจัดการ
การใช้งาน JdbcTemplate นั้นจะต้องทำการ set datasource ก่อนการใช้งานดังนี้
JdbcTemplate jt = null;
public void setupJdbcTemplate() {
jt = new JdbcTemplate();
jt.setDataSource(getDataSource());
}
public JdbcTemplate getJdbcTemplate() {
return jt;
}
3. หลังจากที่เราทำการ setup ทุกๆ อย่างเรียบร้อยแล้ว เรามาลองดึงข้อมูลจาก database มาใช้งานกันหน่อยครับ
Table1 ประกอบด้วย field ดังนี้
id number
name Varchar
ในการดึงข้อมูลนั้นจะต้องสร้าง class หรือว่าใช้ inner class ก็ได้ ในการ mapping row เพื่อเก็บไว้ใน bean object ดังนี้
class TestRowMapper implements RowMapper {
/* (non-Javadoc)
* @see org.springframework.jdbc.core.RowMapper#mapRow(java.sql.ResultSet, int)
*/
public Object mapRow(ResultSet rs, int index) throws SQLException {
TestValue value = new TestValue();
value.setId( rs.getString("id") );
value.setName( rs.getString("name") );
return value;
}
}
หลังจากที่สร้าง class สำหรับ map ข้อมูลลง beanobject แล้ว เรามาลองเรียกใช้งานบ้างครับ
String sql = " select * from table1 ";
/** Get data from database which using query() of JdbcTemplate. */
List allData = getJdbcTemplate().query(sql, new RowMapperResultReader( new TestRowMapper() ));
/** Retrive data */
for(Iterator it = allData.iterator(); it.hasNext();) {
TestValue value = (TestValue) it.next();
System.out.println("ID : " + value.getId());
System.out.println("Name : " + value.getName());
}
ถ้าต้องการนับจำนวน record จะต้องทำอย่างไร มาดูกันเลยครับ
public void countRecord() {
String sql = "select count(*) from table1";
System.out.println("All size : " + getJdbcTemplate().queryForInt(sql) );
}
4. การ update/delete/insert ข้อมูล
ทั้ง 3 นี้จะมีการทำงานที่เหมือนกัน ต่างกันเพียง sql statement เท่านั้นครับ
มาดูการ insert ข้อมูลกัน
/**ข้อมูลที่จะทำการ insert*/
TestValue value = new TestValue();
value.setId(new Integer(4) );
value.setName("test 4");
/**Sql statementสำหรับการinsert*/
String sql = "insert into table1 values (?,?)";
/** กำหนด parameter ของ sql statement*/
Object[] params = new Object[] { value.getId(), value.getName()};
/**กำหนด type ของcolumn ที่จะทำการ insert ข้อมูล*/
int[] types = new int[] { Types.NUMERIC, Types.VARCHAR };
/** Run การ SQL statement*/
setupJdbcTemplate().update(sql, params, types);
มาดูตัวอย่างการ delete ข้อมูลกันบ้าง
String sql = "delete from table1 where id = ?";
Object[] params = new Object[] { new Integer(2)};
getJdbcTemplate().update(sql, params);
และสุดท้ายการ update ข้อมูล
String sql = "update table1 set name = ? where id = ?";
Object[] params = new Object[] { "New data", new Integer(1)};
setupJdbcTemplate().update(sql, params);
จากการใช้งาน JDBC ด้วย Spring Framework นั้นจะเห็นได้ว่า
- Loc(Line Of Code) น้อยลงมาก
- ไม่ต้องมี try-catch-finally สำหรับการดักจับ exception และการ release resource ต่างๆ ให้แก่ระบบ
- ไม่ต้องจัดการเรื่อง connection เนื่องจากตัว spring framework เองจะจัดการให้
ต่อไปจะนำเรื่องการจัดการ transaction การใช้งานร่วมกับ OR mapping อื่นๆ และ web application ครับ
แต่ตอนนี้ไปนอนก่อนครับ ไม่ไหวแล้ว เหนื่อยมาทั้งวันเลยครับ

#1 By plynoi แว่วศรี on 2005-02-27 11:19