java 数据库 框架_盘点 Java 数据库访问框架——究竟哪个更适合你

本文将带您浏览和比较最受欢迎Java数据库访问框架(DAO层)。

假设您正在开发一个Java程序,有许多办法可以让您的应用连上数据库。下面会列举各数据库访问框架的适用场景,相信能够帮您选到适合项目的开发框架。

JDBC:简单数据库查询

最简单的办法莫过于使用JDBC提供的Java API。输入查询SQL语句调用API返回结果:

ResultSet rs = stmt.executeQuery( "SELECT id, name FROM Employees");

while(rs.hasNext){
log.info( "Employee id: "+ rs.getInt( "id") + " has name: "+ rs.getString( "name"));

}

适用场景:不希望学新框架,要求轻量级解决方案,需自定义查询,不用长期维护;

不适合:不想写很多代码,未来可能需要做数据库迁移。

要减少模板代码,可以考虑使用jdbc-template工具,像是Spring JDBC template或者Apache DBUtils。例如在处理request时,Spring template可以用一句代码发送带参数的request,完成反序列化数据,关闭连接:

User user = jdbc.qeuryForObject( "SELECT * FROM USERS WHERE ID = ?", 1, User.class);

JOOQ:面Java对象查询

JOOQ提供了一种DSL来解决查询问题。这种语言基于生成的entity对象提供编译时安全(compile-time-safe)查询。JOOQ支持不同的数据库,能够减少模板代码。

UserRecord user = newUserRecord;

user.setId( 1);

user.setName( "Peter");

Result books1 = DSL.using(configuration)

.selectFrom(USERS)

.where(condition(user))

.fetch;

适用场景:要求JDBC查询保证编译时安全,迁移到不同数据库,自动生成CRUD JDBC API;

不适合:一些高级功能要收费。

MyBatis:带查询功能的简单ORM

ORM(对象关系映射)提供了另一种和数据库打交道的方式,其核心思想是把Java对象(entity)映射到对应的数据库表。MyBatis就是其中一员。

MyBatis是一个轻量级框架,使用JPA provider(非bean结构)完成映射。下面是一个简单的示例查询(不用配置文件):

// Bean映射

publicinterfaceBlogMapper{
3

@Select( "SELECT * FROM blog WHERE id = #{id}")

Blog selectBlog( intid);

}

// 获取数据

BlogMapper mapper = session.getMapper(BlogMapper.class);

Blog blog = mapper.selectBlog( 101);

适用场景:需要在ORM中灵活地查询,轻量级ORM;

不适合:不喜欢XML。

Hibernate与Spring Data

二者都支持JPA(Java持久化API),也就是说都支持部署到应用服务器。JPA标准中要求数据库table/column与Java对象(entity)对应。例如,USER表对应的entity如下:

@Data// 这不是hibernate注解,而是lombok getter/setter

@Entity

@Table(name = "USERS")

publicclassUser{
@Id

@Column(name = "id")

privateInteger id;

@Column(name = "name")

privateString name;

}

Hibernate是最受欢迎的ORM框架,提供很多开箱即用的功能。早在2001年Hibernate就发布了第一个版本。还支持HQL语言进行自定义SQL查询。

Session session = sessionFactory.openSession;

User oldUser = (User) session.get(User.class, 1); //get user

User newUser = newUser( 123, "John");

session.save(developer); //add user

//HQL 示例

Query query = session.createQuery( "FROM Users");

List users = query.list;

适用场景:快速原型,需要内部提供缓存,使用多种不同的数据库,访问复杂schema;

不适合:不喜欢生成其他Java实体类,不愿意学习新框架,需要掌控底层细节。

Spring Data:新ORM抽象层

Spring Data在JPA entity的基础上提供了丰富的CRUD API以及查询表达式语言。其最大的优势在于只需要2-3行代码可以搞定。生成的API基于函数命名规范。

// 只需要实现CrudRepository interface

publicinterfaceUserRepositoryextendsCrudRepository< User, Long>{
User findByName(String name);

User findById( longid);

@Query( "SELECT u.ID FROM USERS u WHERE like ?1") //自定义表达式

List findByUserName(String name);

}

// 查询示例

User johnUser = userRepository.findByName( "John");

User johnUser = userRepository.findById(id);

List usersIdsWithOVPostfix = userRepository.findByUserName( "%OV%");

总结

下面这张表进行了总结。注意:仅代表作者个人观点,没有做严谨的分析与测试。

JDBC

JOOQ

MyBatis

Hibernate

Spring Data

透明度

查询灵活性

开发速度(常规查询)

开发速度(自定义查询)

数据库迁移开销

配置开销


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值