Spring 5.2.2 數據訪問(22)

使用SimpleJdbc簡化JDBC操做java

     SimpleJdbcInsert SimpleJdbcCall 經過利用JDBC驅動程序檢索的數據庫元數據提供了簡化的配置。這意味着能夠減小預先配置的工做量,但若是但願在代碼中提供全部詳細信息,則能夠重寫或關閉元數據處理。typescript

   今天先將SimpleJdbcInsert 相關的4個內容。明天講SimpleJdbcCall 相關的5個主題。數據庫

使用SimpleJdbcInsert插入數據微信

    咱們首先查看SimpleJdbcInsert ,該類具備最少的配置選項。在數據訪問層的初始化方法中實例化SimpleJdbcInsert 。對於本例,初始化方法是setDataSource 方法。不須要對SimpleJdbcInsert 繼承。相反,能夠建立一個新實例,並使用withTableName 方法設置表名。此類的配置方法遵循流體樣式,該樣式返回SimpleJdbcInsert 的實例,該實例容許連接全部配置方法。如下示例僅使用一種配置方法(稍後咱們將顯示多個方法的示例):app

public class JdbcActorDao implements ActorDao {
private SimpleJdbcInsert insertActor;
public void setDataSource(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource).withTableName("t_actor"); }
public void add(Actor actor) { Map<String, Object> parameters = new HashMap<String, Object>(3); parameters.put("id", actor.getId()); parameters.put("first_name", actor.getFirstName()); parameters.put("last_name", actor.getLastName()); insertActor.execute(parameters); }
// ... 另外methods}

這裏使用的execute方法只接受一個普通的java.util.Map參數。這裏要注意的重要一點是,用於Map 的鍵必須與數據庫中定義的表的列名匹配。這是由於咱們讀取元數據來構造實際的insert語句。ui


使用SimpleJdbcInsert檢索自動生成的keythis

     下一個示例使用與上一個示例相同的insert,但它不傳遞id,而是檢索自動生成的鍵並將其設置在新的Actor 對象上。當它建立SimpleJdbcInsert 時,除了指定表名以外,它還使用usingGeneratedKeyColumns 方法指定生成的鍵列的名稱。下面的列表顯示了它的工做原理:spa

public class JdbcActorDao implements ActorDao {
private SimpleJdbcInsert insertActor;
public void setDataSource(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource) .withTableName("t_actor") .usingGeneratedKeyColumns("id"); }
public void add(Actor actor) { Map<String, Object> parameters = new HashMap<String, Object>(2); parameters.put("first_name", actor.getFirstName()); parameters.put("last_name", actor.getLastName()); Number newId = insertActor.executeAndReturnKey(parameters); actor.setId(newId.longValue()); }
    // ... 其它methods}

使用第二種方法運行insert時的主要區別在於,你沒有將id 添加到Map,而是調用executeAndReturnKey 方法。這將返回一個java.lang.Number對象,能夠用它建立域範圍類中使用的數值類型的實例。你不能依賴於全部數據庫在這裏返回特定的Java類。java.lang.Numbe是能夠依賴的基類。若是有多個自動生成的列或生成的值不是數字,則能夠使用executeAndReturnKeyHolder 方法返回的KeyHolder .net


爲SimpleJdbcInsert指定列code

     能夠經過使用usingColumns 方法指定列名列表來限制插入的列,以下例所示:

public class JdbcActorDao implements ActorDao {
private SimpleJdbcInsert insertActor;
public void setDataSource(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource) .withTableName("t_actor") .usingColumns("first_name", "last_name") .usingGeneratedKeyColumns("id"); }
public void add(Actor actor) { Map<String, Object> parameters = new HashMap<String, Object>(2); parameters.put("first_name", actor.getFirstName()); parameters.put("last_name", actor.getLastName()); Number newId = insertActor.executeAndReturnKey(parameters); actor.setId(newId.longValue()); }
// ... 其它 methods}

插入的執行與依賴元數據來肯定要使用哪些列的狀況相同。


使用SqlParameterSource提供參數值

     使用Map 提供參數值能夠很好地工做,但它不是最方便的類。Spring提供了幾個SqlParameterSource 接口的實現,能夠使用它們來代替。第一個是BeanPropertySqlParameterSource,若是你有一個包含值的JavaBean,那麼它是一個很是方便的類。它使用相應的getter方法來提取參數值。下面的示例演示如何使用BeanPropertySqlParameterSource

public class JdbcActorDao implements ActorDao {
private SimpleJdbcInsert insertActor;
public void setDataSource(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource) .withTableName("t_actor") .usingGeneratedKeyColumns("id"); }
public void add(Actor actor) { SqlParameterSource parameters = new BeanPropertySqlParameterSource(actor); Number newId = insertActor.executeAndReturnKey(parameters); actor.setId(newId.longValue()); }
// ... 其它methods}

另外一個選項是MapSqlParameterSource ,它相似於一個Map ,可是提供了一個更方便的addValue 方法,能夠連接。下面的示例演示如何使用它:

public class JdbcActorDao implements ActorDao {
private SimpleJdbcInsert insertActor;
public void setDataSource(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource) .withTableName("t_actor") .usingGeneratedKeyColumns("id"); }
public void add(Actor actor) { SqlParameterSource parameters = new MapSqlParameterSource() .addValue("first_name", actor.getFirstName()) .addValue("last_name", actor.getLastName()); Number newId = insertActor.executeAndReturnKey(parameters); actor.setId(newId.longValue()); }
// ... 其它methods}

如上所示,配置是相同的。只有正在執行的代碼必須更改才能使用這些可選的輸入類。


明天講 SimpleJdbcCall 相關的內容。

歡迎關注和轉發Spring中文社區:


本文分享自微信公衆號 - Spring中文社區(gh_81d233bb13a4)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索