Spring Data JDBC Extensions - Core JDBC Extensions (扩展Spring特性的支持类)

翻译 2015年07月08日 22:47:14
Part I Core JDBC Extensions

1 扩展Spring特性的一些支持类

Spring 框架中JDBC支持是很好,但是时不时有一些功能看起来有用可是不包含在框架中。Spring Data JDBC Extensions 项目为这些类型的扩展提供了一个 “Home”。
1.1 一对多关系映射
我们常常会在我们的数据库项目中使用一对多的关系型映射。一个顾客会有多个地址,一个订单可能会包含多项等等。我们现在提供一个ResultSetExtractor 实现来处理这些公共的工作。
让我们来看看下面定义好的数据库结构
CREATE TABLE customer(
  id BIGINT IDENTITY PRIMARY KEY, 
  name VARCHAR(255));
CREATE TABLE address (
  id BIGINT IDENTITY PRIMARY KEY, 
  customer_id BIGINT CONSTRAINT address_customer_ref 
    FOREIGN KEY REFERENCES customer (id), 
  street VARCHAR(255), 
  city VARCHAR(255));
上面两张表是通过一个外键约束关联起来的。在具体实现类 - Customer 和Address 中, Customer 将有一个Address集合来映射这种关系。
public class Customer {

  private Integer id;

  private String name;

  private Set<Address> addresses = new HashSet<Address>();

  public Set<Address> getAddresses() {
    return addresses;
  }

  public void addAddress(Address address) {
    this.addresses.add(address);
  }

// other setters and getters

}

public class Address {

  private Integer id;

  private String street;

  private String city;

// setters and getters

}

执行下面查询语句,对于每个Customer 可能会有多条记录返回。
List<Customer> result = template.query(
  "select customer.id, customer.name, address.id, " +
    "address.customer_id, address.street, address.city " +
    "from customer " +
    "left join address on customer.id = address.customer_id " +
    "order by customer.id",
  resultSetExtractor);
为了能够获得多行记录,我们通过继承OneToManyResultSetExtractor来创建一个新的类CustomerAddressExtractor。 通过root class(Customer), child class(Address)以及主外键来参数化OneToManyResultSetExtractor。
public class CustomerAddressExtractor extends
    OneToManyResultSetExtractor<Customer, Address, Integer> {

  public CustomerAddressExtractor() {
    super(new CustomerMapper(), new AddressMapper());
  }

  @Override
  protected Integer mapPrimaryKey(ResultSet rs) throws SQLException {
    return rs.getInt("customer.id");
  }

  @Override
  protected Integer mapForeignKey(ResultSet rs) throws SQLException {
    if (rs.getObject("address.customer_id") == null) {
      return null;
    }
    else {
      return rs.getInt("address.customer_id");
    }
  }

  @Override
  protected void addChild(Customer root, Address child) {
    root.addAddress(child);
  }
}
我们需要一种方式来匹配Customer的主键与Address的外键。因此我们使用一种抽象的方法mapPrimaryKey 和mapForeignKey来映射这种关系。我们必须考虑对于Customer他的地址可能不存在,所以Customer 外键可能为空。我们同样需要把Address 对象映射到Customer中。通过实现一个抽象的方法addChild,可以在Customer 类中调用Address。
在CustomerAddressExtractor的构造方法中,我们调用父类构造方法为Customer 和 Address 实现RowMapper接口。 在本例中,这些标准的标准的RowMappers是通过内部类方式来实现的。

private static class CustomerMapper implements RowMapper<Customer> {

  public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
    Customer c = new Customer();
    c.setId(rs.getInt("customer.id"));
    c.setName(rs.getString("customer.name"));
    return c;
  }
}

private static class AddressMapper implements RowMapper<Address> {

  public Address mapRow(ResultSet rs, int rowNum) throws SQLException {
    Address a = new Address();
    a.setId(rs.getInt("address.id"));
    a.setStreet(rs.getString("address.street"));
    a.setCity(rs.getString("address.city"));
    return a;
  }
}



iOS 8新特性之扩展:App Extensions

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。 extension的出现,为用户提供了在其它应用中使用我们应用提供...

spring+Middlegen+hibernate-extensions.rar

  • 2017年11月08日 18:35
  • 69.6MB
  • 下载

Spring 框架参考文档(四)-数据访问之 Data access with JDBC

Spring 框架参考文档(四)-数据访问之(Data access with JDBC) Part IV. 数据访问 这部分参考文档介绍有关于数据访问...

谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别

最近乱点了篇博客,点击打开链接 博主总结得乱七八糟,虽然这知识点太过久远,还是我来谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别 吧。 简单的讲,通过Categ...
  • jaccty
  • jaccty
  • 2015年08月05日 14:08
  • 630

Kotlin Reference (十) 类的扩展:class extensions

在Kotlin中,可以自行对类进行扩展;不管是否是系统类 可以对类扩展函数与属性...

Spring中支持JDBC的JdbcTemplate模板类的使用

概述        Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作...

使用Spring对JDBC的Dao的支持类操作数据库

使用Spring对JDBC的Dao的支持类操作数据库

Spring对JDBC的支持

  • 2017年03月16日 17:28
  • 6.4MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Data JDBC Extensions - Core JDBC Extensions (扩展Spring特性的支持类)
举报原因:
原因补充:

(最多只允许输入30个字)