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

相关文章
相关标签/搜索