行业报告 AI展会 数据标注 标注供求
数据标注数据集
主页 > 数据挖掘 正文

最受欢迎Java数据库访问框架大比拼,你独爱哪一

本文将带您浏览和比较更受欢迎数据库访问框架(DAO层)。
 
假设您正在开发一个Java程序,有许多办法可以让您的应用连上数据库。下面会列举各数据库访问框架的适用场景,相信能够帮您选到适合项目的开发框架。
 
JDBC:简单数据库查询
最简单的办法莫过于使用JDBC提供的Java API。输入查询语句调用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 = new UserRecord();
user.setId(1);
user.setName("Peter");
 
Result<UserRecord> 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映射
public interface BlogMapper {
3
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
 
// 获取数据
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")
public class User {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
}
 
Hibernate是更受欢迎的ORM框架,提供很多开箱即用的功能。早在2001年Hibernate就发布了第一个版本。还支持HQL语言进行自定义SQL查询。   
Session session = sessionFactory.openSession();
User oldUser  = (User) session.get(User.class, 1); //get user
User newUser = new User(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
public interface UserRepository extends CrudRepository<User, Long> {
User findByName(String name);
User findById(long id);
@Query("SELECT u.ID FROM USERS u WHERE like ?1") //自定义表达式
List<Integer> findByUserName(String name);
}
 
// 查询示例
User johnUser = userRepository.findByName("John");
User johnUser = userRepository.findById(id);
List<Integer> usersIdsWithOVPostfix = userRepository.findByUserName("%OV%");
 
总结
下面这张表进行了总结。注意:仅代表作者个人观点,没有做严谨的分析与测试。

 

 
来源:https://dzone.com/articles/what-java-dao-layer-is-best-for-your-project
 
声明:文章收集于网络,版权归原作者所有,为传播信息而发,如有侵权,请联系小编删除,谢谢!
 
 

微信公众号

声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
SEM推广服务

Copyright©2005-2028 Sykv.com 可思数据 版权所有    京ICP备14056871号

关于我们   免责声明   广告合作   版权声明   联系我们   原创投稿   网站地图  

可思数据 数据标注

扫码入群
扫码关注

微信公众号

返回顶部