หลังจากพี่ @roofimon อธิบายการใช้ SimpleJDBCTemplate มาช่วยในการดึงข้อมูลกันแล้ว มาในบทความนี้ ผมจะมาอธิบายการใช้งาน Insert, Update, Delete ด้วย SpringJDBC กันบ้าง โดยอธิบายตั้งแต่วิธีดั้งเดิมจนถึงวิธีการใหม่ๆ ว่าใช้งานอย่างไรบ้าง [ เน้นการ coding มากกว่าการอธิบาย ]
มาเริ่มกันเลย Go Go Go ….
1. JdbcTemplate เป็น class แรกๆ ที่หลายๆ คนจะเริ่มจากตรงนี้ เนื่องจากเอกสารของ Spring Framework หรือหนังสือไหนๆ ก็ตามจะแนะนำให้ใช้ก่อนเลย [ ถ้าใช้ SpringJDBC นะครับ ]
มาดูตัวอย่างการใช้งาน เป็นดังนี้
public class User {
private Long id;
private String fname;
private String lname;
/** Getter/Setter methods **/
}
JdbcTemplate jdbcTemplate = ... ;
User user = .....;
/** Insert data **/
jdbcTemplate.update("insert into user (fname, lname)values (?, ?)", new Object[] {user.getFname(), .getLname()});
/** Update data **/
jdbcTemplate.update("update user set fname = ? where id = ?", new Object[] {user.getFname(), user.getId()});
/** Delete data **/
jdbcTemplate.update("delete from orders");
ข้อสังเกตในตัวอย่างข้างต้น
- กำหนดข้อมูลเรียงลำดับตามเครื่องหมาย ? ได้เลย ที่สำคัญกำหนดชนิดข้อมูลให้ถูกด้วยนะครับ ไม่เช่นนั้นจะเกิด error ขึ้นมา
- ถ้ามี parameters จำนวนมากๆ จะใช้จัดการยากมาก และที่สำคัญ code จะดูรกมากๆ ดังนั้นแบบแรกนี้ตกไป ไม่ผ่าน
ในเอกสารจะมีแนะนำ Map ด้วย แต่ผมมองว่าต้อง coding เยอะเกินไป จึงไม่ขอธิบายครับ
2. ปรับปรุงด้วยการนำ NamedParameterJdbcTemplate มาใช้ร่วมกับ JdbcTemplate ดังตัวอย่าง
private NamedParameterJdbcTemplate namedParameterJdbcTemplate; ...... User user = .....; String sql = "insert into user (fname, lname)values ( :fname , :lname )"; SqlParameterSource namedParameters = new BeanPropertySqlParameterSource( user ); namedParameterJdbcTemplate.update( sql, namedParameters );
ในส่วนของ update และ delete ก็ใช้งานเหมือนกับการ insert
ข้อสังเกตในตัวอย่างข้างต้น
- จะเห็นได้ว่าตัวอย่างนี้ ทำให้ code ดูสวยงามมากยิ่งขึ้น รวมทั้งไม่ต้องมาเสียเวลา mapping ข้อมูลเอง แต่ต้องระวังว่า property ของ Bean ต้องตรงกับ named parameters ที่กำหนดในคำสั่ง sql
ประเด็นที่ผมต้องการนำเสนอต่อไป คือ ถ้าระบบต้องการค่า pk ของข้อมูลที่ insert ไป จะทำอย่างไร ???
3. จากความต้องการดังกล่าวนั้น มีวิธีการใช้งาน 2 แบบ [ เท่าที่ผมรู้และเคยใช้งานมานะครับ ] มีดังนี้
3.1 ใช้ NamedParameterJdbcTemplate ร่วมกับ KeyHolder ซึ่งเขียน code ได้ดังนี้
private NamedParameterJdbcTemplate namedParameterJdbcTemplate; ...... User user = .....; String sql = "insert into user (fname, lname)values ( :fname , :lname )"; SqlParameterSource namedParameters = new BeanPropertySqlParameterSource( user ); KeyHolder keyHolder = new GeneratedKeyHolder(); namedParameterJdbcTemplate.update(sql, fileParameters, keyHolder); Integer int_id = keyHolder.getKey().intValue(); Long long_id = keyHolder.getKey().longValue();
โดยวิธีการนี้ก็สามารถทำงานตามแบบที่เราต้องการได้ แต่ไม่ได้มีเพียงวิธีการเดียวเท่านั้น เนื่องจากยังมี SimpleJdbcInsert ให้ใช้งานอีก
3.2 ใช้งานผ่าน SimpleJdbcInsert โดยจะใช้งานร่วมกับ DataSource และ JdbcTemplate ได้แบบสบายๆ แต่เข้าใจยากหรือง่ายกัน [ ตรงนี้คงอยู่ที่ความชอบนะครับ ] เนื่องจากคุณไม่ต้องเขียน sql statement ดังนี้
- ใช้ร่วมกับ DataSource + SqlParameterSource
DataSource dataSource = ...; User user = .....; SimpleJdbcInsert insertUser = new SimpleJdbcInsert( dataSource ).withTableName( "user" ).usingGeneratedKeyColumns( "id" ); SqlParameterSource parameters = new BeanPropertySqlParameterSource( user ); Number newId = insertUser.executeAndReturnKey(parameters); .....
- ใช้ร่วมกับ JdbcTemplate + SqlParameterSource
JdbcTemplate jdbcTemplate = ... ; User user = .....; SimpleJdbcInsert insertUser = new SimpleJdbcInsert( jdbcTemplate ).withTableName( "user" ).usingGeneratedKeyColumns( "id" ); SqlParameterSource parameters = new BeanPropertySqlParameterSource( user ); Number newId = insertUser.executeAndReturnKey(parameters); .....
ในส่วนของ SqlParameterSource นั้นสามารถกำหนดเองได้ ทำให้ไม่งงว่ามันทำงานอย่างไรบ้าง แต่จะเหนื่อยขึ้นมาอีกเล็กน้อย ดังนี้
SqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("fname", user.getFname())
parameters.addValue("lname", user.getLname());
ทั้งหมดนี้ก็เป็นการใช้งาน SpringJDBC สำหรับจัดการการ insert/update/delete ทั่วไปที่ผมใช้งานมาบ้าง อาจจะเป็นแนวทางเริ่มต้นได้ครับ และแน่นอนต้องมีวิธีการอื่นๆ ที่ดีกว่าและสะดวกกว่าแน่นอน ดังนั้น ถ้าใครมีวิธีอื่นๆ มาแนะนำ สามารถ comment ได้เลยครับ

หล่อมากครับ ขอบคุณที่มาช่วยเขียนนะครับส่วนตัวเริ่มชอบ SpringJDBC มากขึ้นเพราะจัดการง่าย ทีมงานโดยเฉพาะ DBA ชอบด้วยเพราะพูดภาษาเดียวกัน ทำให้ทำงานได้ง่ายมากขึ้นถึงแม้ code จะดูไม่สวยงามเท่าใช้ Hibernate, JPA