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;
  }
}



Spring Data JDBC Extensions - Core JDBC Extensions (概述)

Spring Data JDBC Extensions 项目提供了高级的JDBC功能,它扩展了Spring 框架的“spring-jdbc”模块。 Spring Data Extensions 项目大...
  • lucius_yu00
  • lucius_yu00
  • 2015年07月07日 12:12
  • 846

JDBC、JdbcTemplate、SpringData对比学习

Spring Data 入门学习写在最前:学习一项新的技术,一个新的框架,总是要基于某个问题去学习,而不能是为了学框架而学框架,这样不仅学习过程痛苦,学习成效也不高。俗话说,熟能生巧,大概说的是使用的...
  • Changui_
  • Changui_
  • 2017年11月09日 01:01
  • 232

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

Spring 框架参考文档(四)-数据访问之(Data access with JDBC) Part IV. 数据访问 这部分参考文档介绍有关于数据访问...
  • xiangjai
  • xiangjai
  • 2016年12月31日 11:40
  • 899

spring_对JDBC的支持

7.1  概述 7.1.1  JDBC回顾        传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示:   java代码: Java代码   ...
  • u012560902
  • u012560902
  • 2016年08月04日 20:03
  • 880

Spring Data MongoDB - Reference Documentation

Preface The Spring Data MongoDB project applies core Spring concepts to the development of solu...
  • yuwenruli
  • yuwenruli
  • 2013年01月13日 20:16
  • 9448

spring对JDBC的整合支持

1、Spring对jdbc等数据库技术编写Dao提供了重要支持。      a、Spring对DAO异常提供了统一处理      b、Spring对DAO编写提供了...
  • u013821825
  • u013821825
  • 2016年06月07日 19:47
  • 1260

Spring-Data配置、代码示例和普通JDBC比较(学习笔记)

一.JDBC的写法: /** * JDBC工具类: * 1) 获取Connection * 2) 释放资源 */ public class JDBCUtil { /** ...
  • u011287511
  • u011287511
  • 2017年09月05日 11:25
  • 227

Swift3.0学习笔记-Extensions

Swift3.0 Extension
  • brycegao321
  • brycegao321
  • 2016年11月24日 22:36
  • 600

Spring对JDBC的支持 Jdbc Template模板类

概述        Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作...
  • fg32f
  • fg32f
  • 2015年11月12日 18:43
  • 1184

spring学习笔记10--Spring+jdbc组合开发(注解方式配置事务)

Spring+jdbc组合开发 步骤: 一、配置数据源 主流数据库连接池之一(DBCP、c3p0、proxool),单独使用DBCP需要使用commons-dbpc.jar、commons-co...
  • Hollboy
  • Hollboy
  • 2013年05月05日 13:42
  • 1954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Data JDBC Extensions - Core JDBC Extensions (扩展Spring特性的支持类)
举报原因:
原因补充:

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