最受欢迎Java数据库访问框架(DAO层)
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
本文将带您浏览和比较最受欢迎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 = 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://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-06-03
本文作者: 覃佑桦
本文来自:“互联网架构师 微信公众号”,了解相关信息可以关注“互联网架构师”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GitHub告警:恶意软件正通过流行开源 IDE 攻击 Java 项目
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! itHub 安全博客发布了一则通知,警告用户目前正有一种新的恶意软件在攻击 Java 项目。据了解,这是一个针对 Apache NetBeans IDE 项目的开源供应链攻击,GitHub 安全团队将其称为 Octopus Scanner。一旦感染,恶意软件会寻找用户开发系统上的 NetBeans 项目,然后将恶意负载嵌入到项目文件中,使得每次项目构建都会执行恶意负载。 3 月 9 日,GitHub 收到了安全研究员 JJ 发来的警告通知:“我发现了一组感染了恶意程序 Octopus Scanner 的开源库。”随后,GitHub 开始自查,在站点上共发现了 26 个包含 Octopus Scanner 恶意软件的存储库。 据 GitHub 称:“当用户下载了这 26 个存储库中的任何一个时,该恶意软件就会像自传播病毒一样,感染本地计算机,并扫描用户的工作站,查看是否有本地 NetBeans IDE 安装,如果有,会继续深入影响计算机中的其他 Java 项目。” 安全研究员 JJ 表示,...
- 下一篇
DB 与 Elasticsearch 混合应用之数据离线同步
作者介绍 李猛,Elastic Stack 深度用户,通过 Elastic 工程师认证,2012年接触 Elasticsearch,对 Elastic Stack 技术栈开发、架构、运维等方面有深入体验,实践过多种大中型项目;为企业提供 Elastic Stack 咨询培训以及调优实施;多年实战经验,爱捣腾各种技术产品,擅长大数据,机器学习,系统架构。 序言 首先解释下 即时、实时与离线 概念定义,最近碰到很多的认知误区,需要纠正下。 即时概念 当数据变更之后马上就可以查询变更,内部采用事务隔离机制,查询的数据必须阻塞直到数据更新完毕,如单实例关系数据库数据发生变更后,然后马上可查询到。 实时概念 在数据同步场景中,包括异构数据源和同构数据源之间,泛指在可接受的很快时间范围内同步完成,一般的认知是秒级左右,也可以毫秒或者微秒,依据业务需求与实现
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7设置SWAP分区,小内存服务器的救世主
- Red5直播服务器,属于Java语言的直播服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境