สรุปการใช้งาน Insert, Update, Delete ข้อมูลด้วย SpringJDBC ขั้นพื้นฐาน

November 20th, 2009 by http://somkiatspns.blogspot.com/ Leave a reply »

หลังจากพี่ @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 ได้เลยครับ

Advertisement

1 comment

  1. roofimon says:

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

Leave a Reply

You must be logged in to post a comment.