使用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源创计划”,欢迎正在阅读的你也加入,一块儿分享。