使用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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。