|
您可以使用JdbcTemplate的execute()方法執行SQL陳述,例如: jdbcTemplate.execute(
"CREATE TABLE USER (user_id integer, name varchar(100))"); 如果是UPDATE或INSERT,您可以使用update()方法,update()方法有數個重載(Overload)版本,例如接受實作 org.springframework.jdbc.core.PreparedStatementCreator介面的物件, PreparedStatementCreator介面的定義如下: package org.springframework.jdbc.core;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public interface PreparedStatementCreator { PreparedStatement createPreparedStatement(Connection con) throws SQLException; } 例如您可以將 使用 JdbcTemplate 中UserDAO的insert()方法改寫如下:
...
public void insert(User user) { final String name = user.getName(); final int age = user.getAge().intValue(); jdbcTemplate.update( new PreparedStatementCreator() { public PreparedStatement createPreparedStatement( Connection con) throws SQLException { String sql = "INSERT INTO user (name,age) VALUES(?,?)"; PreparedStatement ps = con.prepareStatement(sql); ps.setString(1, name); ps.setInt(2, age); return ps; } }); } ... 在這個例子中,可以使用PreparedStatement預先編譯SQL,JdbcTemplate上實現了Template-callback機制,在執行JDBC的流程中,必要時會呼叫callback方法。 與PreparedStatementCreator互補的介面是org.springframework.jdbc.core.PreparedStatementSetter介面:
package org.springframework.jdbc.core;
import java.sql.PreparedStatement; import java.sql.SQLException; public interface PreparedStatementSetter { void setValues(PreparedStatement ps) throws SQLException; } 例如您可以將 使用 JdbcTemplate 中UserDAO的insert()方法改寫如下:
...
public void insert(User user) { final String name = user.getName(); final int age = user.getAge().intValue(); jdbcTemplate.update( "INSERT INTO user (name,age) VALUES(?,?)", new PreparedStatementSetter() { public void setValues(PreparedStatement ps) throws SQLException { ps.setString(1, name); ps.setInt(2, age); } }); } ... JdbcTemplate會自動建立PreparedStatementCreator的實例,以提供傳遞給setValues()方法的PreparedStatement物件。 您也可以直接提供SQL,就如 使用 JdbcTemplate 中所示範的UserDAO中的insert()方法:
...
public void insert(User user) { String name = user.getName(); int age = user.getAge().intValue(); jdbcTemplate.update("INSERT INTO user (name,age) " + "VALUES('" + name + "'," + age + ")"); } ... 在直接下SQL語句時,也可以使用"?"作為佔位字元,並使用物件陣列作為引數傳遞給JdbcTemplate的update()方法,例如改寫 使用 JdbcTemplate 中所示範的UserDAO中的insert()方法:
...
public void insert(User user) { jdbcTemplate.update( "INSERT INTO user (name, age) VALUES(?,?)", new Object[] {user.getName(), user.getAge()}); } ... JdbcTemplate會自動建立PreparedStatementCreator與PreparedStatementSetter的實例,然而這些細節您不用理會,您只要提供SQL與引數就好了。 如果需要批次處理時,可以實作org.springframework.jdbc.core.BatchPreparedStatementSetter介面:
package org.springframework.jdbc.core;
import java.sql.PreparedStatement; import java.sql.SQLException; public interface BatchPreparedStatementSetter { void setValues(PreparedStatement ps, int i) throws SQLException; int getBatchSize(); } 例如您可以在 使用 JdbcTemplate 中的IUserDAO介面及UserDAO類別上增加一個insertUsers()方法的定義與實作,像是以下的內容:
...
public int[] insertUsers(final List users) { String sql = "INSERT INTO user (name,age) VALUES(?,?)"; BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() { public void setValues( PreparedStatement ps, int i) throws SQLException { User user = (User) users.get(i); ps.setString(1, user.getName()); ps.setInt(2, user.getAge().intValue()); } public int getBatchSize() { return users.size(); } }; return jdbcTemplate.batchUpdate(sql, setter); } ... 如果您的JDBC驅動程式支援批次處理的話,則直接使用它的功能,如果不支援,則Spring會自動一個一個處理更新以模擬批次處理。 |