网站首页 > 技术文章 正文
回顾和比较最流行的java数据库访问框架
有许多方法可以将您的Java应用程序连接到数据库。这篇文章里,我将解释哪个框架最适合我们的项目需求。
可比技术
- JDBC (Java database connectivity).
- JOOQ (Java Object Oriented Querying).
- MyBatis.
- Hibernate.
- Spring Data.
JDBC:简单数据库查询
获取数据的最简单方法是使用java api提供的,也被称为java数据库连接(JDBC)。提供的api返回给定sql查询的结果集:
1. `ResultSet rs = stmt.executeQuery("SELECT id, name FROM Employees");`
2. `while(rs.hasNext()){`
3. `log.info("Employee id: "+ rs.getInt("id") + " has name: "+ rs.getString("name"));`
4. `}`
为了减少大量样板代码,建议使用jdbc模板工具,如Spring JDBC模板或Apache DBUtils。例如,在该请求中,Spring模板发送带有参数的请求、反序列化数据、关闭连接。这一切都发生在一句代码中:
1. `Useruser = jdbc.qeuryForObject("SELECT * FROM USERS WHERE ID = ?", 1, User.class);`
面向对象的Java查询
JOOQ框架提供了一种基于生成实体的语言。使用这种语言,可以创建编译时安全的查询。JOOQ可以为许多数据库生成方言。此外,它还清理样板代码,如关闭连接等。
1. `UserRecord user = newUserRecord();`
2. `user.setId(1);`
3. `user.setName("Peter");`
4. `Result<UserRecord> books1 = DSL.using(configuration)`
5. `.selectFrom(USERS)`
6. `.where(condition(user))`
7. `.fetch();`
MyBatis:支持查询的简单表单
对象关系映射或ORM提供了另一种与数据库通信的方式。其思想是在代码中创建Java对象(实体)和它们对应的表之间的映射。有代表性的ORM之一是MyBatis框架。
MyBatis是一个轻量级框架,它使用查询在实体和表之间创建映射(而不是bean结构,就像在JPA提供程序中一样,比如Hibernate)。因此,这个框架使用查询并提供ORM特性。在这里,可以看到一个简短的示例(没有配置文件):
1. `// Bean mapping`
2. `publicinterfaceBlogMapper{`
3. `@Select("SELECT * FROM blog WHERE id = #{id}")`
4. `Blog selectBlog(int id);`
5. `}`
6. `// Fetching data`
7. `BlogMapper mapper = session.getMapper(BlogMapper.class);`
8. `Blog blog = mapper.selectBlog(101);`
Hibernate and Spring Data
这两种技术都支持JPA (Java持久性应用编程接口)。这意味着这两种解决方案都可以部署到应用服务器上。JPA标准要求表/列和Java对象(实体)之间的映射。例如,用户表可以映射到以下实体:
1. `@Data// this is not hibernate annotation, it's lombok getter/setter generator`
2. `@Entity`
3. `@Table(name = "USERS")`
4. `publicclassUser{`
5. `@Id`
6. `@Column(name = "id")`
7. `privateInteger id;`
8. `@Column(name = "name")`
9. `privateString name;`
10. `}`
Hibernate
这是最流行的ORM框架,具有许多内置特性。它在大约20年前首次发行。Hibernate还支持自定义SQL查询的HQL语言。
1. `Session session = sessionFactory.openSession();`
2. `User oldUser = (User) session.get(User.class, 1); //get user`
3. `User newUser = newUser(123,"John");`
4. `session.save(developer); //add user`
5. `//HQL example`
6. `Query query = session.createQuery("FROM Users");`
7. `List users = query.list();`
Spring Data
在JPA实体之上,Spring数据提供了一个丰富的CRUD API,以及表达式查询语言。Spring数据的主要优势在于它只需要2-3行实现。生成的API基于方法命名转换。
1. `//Implementation, just by extending CrudRepository interface`
2. `publicinterfaceUserRepositoryextendsCrudRepository<User, Long> {`
3. `User findByName(String name);`
4. `User findById(long id);`
5. `@Query("SELECT u.ID FROM USERS u WHERE like ?1") //custom expression`
6. `List<Integer> findByUserName(String name);`
7. `}`
8. `//It's how to use this repository:`
9. `User johnUser = userRepository.findByName("John");`
10. `User johnUser = userRepository.findById(id);`
11. `List<Integer> usersIdsWithOVPostfix = userRepository.findByUserName("%OV%");`
最终比较
很难给出一个客观的比较评估,需要每个人根据自己的需求自己选择。下面,我给出一个比较表格,大家可以参考这个表格结合自己的需求,来选择自己的DAO层实现。
猜你喜欢
- 2024-12-18 Java开发中MongoDB数据库相关操作
- 2024-12-18 HashMap有几种遍历方法?推荐使用哪种?
- 2024-12-18 在RedisTemplate中使用scan代替keys指令
- 2024-12-18 MQ的发布订阅模式(fanout) mq几种消息模式
- 2024-12-18 Mybatis参数-ParameterMapping处理参数
- 2024-12-18 既然有MySQL了,为什么还要有MongoDB?
- 2024-12-18 Java遍历一个 List 有哪些方式?每种的实现原理以及哪种最高效?
- 2024-12-18 为什么很多人不愿意用hibernate了?
- 2024-12-18 Qt中 QMap 类、QHash 类、QVector 类详解
- 2024-12-18 半小时搞懂 IO 模型 io模型详解
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 512℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 488℃MySQL service启动脚本浅析(r12笔记第59天)
- 467℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 465℃启用MySQL查询缓存(mysql8.0查询缓存)
- 445℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 424℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 422℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)