您可以使用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會自動一個一個處理更新以模擬批次處理。