如何在Spring JDBC中创建对象之间的关系?

Eng*_*ine 4 java spring hibernate jpa jdbc

我想实现从JPA到Spring JDBC的关系.例如,假设我有Account和Advert对象.根据JPA ,账户和广告之间的关系是@OneToMany.

帐户类:

public class Account {

private Long id;
private String username;
private Set<Advert> adverts = new HashSet<Advert>();

// getters + setters
}
Run Code Online (Sandbox Code Playgroud)

广告类:

public class Advert {

private Long id;
private String text;
private Account account;

// getters + setters
}
Run Code Online (Sandbox Code Playgroud)

AccountMapper:

public class AccountMapper implements RowMapper<Account> {

public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
    Account account = new Account();
    account.setId(rs.getLong("id"));
    account.setUsername(rs.getString("username"));
    return account;
}
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试为Advert类创建一个Mapper.如何将广告类中的帐户变量映射到行?非常感谢

Ser*_*sta 7

好吧,如果您不使用 ORM ……您就没有对象关系映射!在为此创建了所有 ORM 之后:-)

更严重的是,ORM 使您免于编写大量样板代码。使用直接 JDBC 而不是 JPA 是一种代码优化。像任何其他代码优化一样,应该在适当的时候使用它。这相关的:

  • 使用一些不想依赖 ORM 的表的库(例如:spring security 中的用户、角色和 ACL)
  • 确定大型应用程序中的瓶颈

我的建议应该是首先使用隐藏在 DAO 层中的 JPA 或本机休眠。然后仔细分析你的性能问题,重写JDBC中最昂贵的部分。

当然,您可以直接在 JDBC 中对 DAO 实现进行编码,但是编写起来会花费更长的时间。

我几乎忘记了基本部分:在 ORM 中您映射类和关系,在 JDBC 中您编写独立的 SQL 查询。


Vla*_*cea 6

您可以在不影响应用程序性能的情况下使用Hibernate,只需查看此Hibernate教程中的数百个与映射实体相关的示例.

至于在JDBC中执行此操作,您需要执行以下步骤:

  1. 您需要对所有选定的列使用别名,以便ids列不会发生冲突.

  2. 您可以定义两个行映射器并使用从广告到帐户的连接并将其传递给AccountMapper:

    public class AdvertMapper implements RowMapper<Advert> {
    
        public Advert mapRow(ResultSet rs, int rowNum) throws SQLException {
            Advert advert = new Advert();
            advert.setId(rs.getLong("advert_id"));
            advert.setText(rs.getString("advert_text"));
            return advert;      
        }
    }
    
    public class AccountMapper implements RowMapper<Account> {
    
        private final AdvertMapper advertMapper;
    
        public AccountMapper(AdvertMapper advertMapper) {
            this.advertMapper = advertMapper;
        }
    
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getLong("account_id"));
            account.setUsername(rs.getString("account_username"));
    
            Advert advert = this.advertMapper.mapRow(rs, rowNum);
            advert.setAccount(account);
            account.getAdverts().add(advert);
    
            return account;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

AccountMapper用途AdvertMapper,以创建从连接的数据广告.

将此与Hibernate相比较,Hibernate将为您解决所有这些映射.