การใช้ 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 ครับ

แต่ตอนนี้ไปนอนก่อนครับ ไม่ไหวแล้ว เหนื่อยมาทั้งวันเลยครับ

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

อ้าว ไหงข้ามเป็นเรื่อง JDBC ซะงั้น

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

ต้องขออภัยครับ ลืมเอาขึ้นพอดีช่วงนี้ยังไม่ว่างเอา AXIS ขึ้นครับ

#2 By somkiat (61.91.179.29) on 2005-02-27 21:15

นั่นสิ รอ AXIS อยู่ งงเลย :-D

แต่ก็ดีครับ ยังไงก็มีประโยชน์ :-)

#3 By dog mulder on 2005-02-28 09:54

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver
มีปัญหาอย่างนี้ครับ

#4 By art (58.10.187.230 /unknown) on 2005-06-14 17:47

น่าจะมีการขั้นตอนการติดต่อฐานข้อมูล

#5 By (61.19.22.68 /192.168.135.109) on 2005-09-05 10:56

ดีครับ จะลองใช้งานดู

#6 By GuXRu (203.170.231.230 /172.16.19.110) on 2007-01-17 12:15

#7 By (124.157.182.157) on 2007-01-17 15:55

ไอ้ปุ๋ย แล้วตูจะรู้เรื่องไหมฟ่ะ เอาให้มันละเอียดกว่านี้หน่อย

#8 By siribom (203.147.60.22) on 2007-03-23 18:25

k.somkiat, do you have complete code of this class?

I would like to test it ka.
Thanks inadvance.

#9 By ochin (203.154.145.10) on 2008-04-23 11:09

ขอบคุณที่ให้ความรู้คับ

#10 By devcha (58.8.157.218) on 2008-07-17 01:14