JDBC的封装

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值