>解锁数据层的利弊、缺点和秘密调味料 使用spring 当boot构建java应用程序时, jdbc 两者之间的选择就像瑞士军刀和手术刀之间的选择一样。这两种工具都与数据库互动,但它们以不同的方式解决问题。让我们解释一下它们的优点、缺点和理想的例子,包括实际的例子。
1.有什么区别?
> jdbc(java数据库连接) 直接执行sql的低级api。 写作和结果集处理需要手动查询。- >最小抽象,最大控制。
- >jpa弹簧数据
-
crud操作通过存储库自动化。
- 2.代码摊牌:crud操作
public class userjdbcdao { @autowired private jdbctemplate jdbctemplate; public user findbyid(long id) { string sql = "select id, name, email from users where id = ?"; return jdbctemplate.queryforobject(sql, new object[]{id}, (rs, rownum) -> new user( rs.getlong("id"), rs.getstring("name"), rs.getstring("email") )); } }
pros: 完全控制sql。
>最小费用。
- cons:
- >
- 样板代码用于映射结果。
- 使用弹簧数据jpa
@entity @table(name = "users") public class user { @id @generatedvalue(strategy = generationtype.identity) private long id; private string name; private string email; // getters, setters, constructors } public interface userrepository extends jparepository<user, long> { // auto-implemented method: findbyemail(string email) } // usage user user = userrepository.findbyid(1l).orelsethrow();
cons:
- >
- 隐藏的性能成本(例如,n 1查询)。
- >示例2:带有连接的复杂查询
- jdbc在这里发光 >
public list<order> findorderswithproducts(long userid) { string sql = """ select o.id, p.name, p.price from orders o join order_items oi on o.id = oi.order_id join products p on oi.product_id = p.id where o.user_id = ? """; return jdbctemplate.query(sql, new object[]{userid}, (rs, rownum) -> new order( rs.getlong("id"), rs.getstring("name"), rs.getdouble("price") )); }
为什么jdbc? 优化sql用于报告/分析。 避免jpa的懒惰陷阱。
jpa解决方案(jpql或本机查询)>
@query(value = """ select new com.example.orderprojection(o.id, p.name, p.price) from order o join o.products p where o.user.id = :userid """, nativequery = false) list<orderprojection> findordersbyuser(@param("userid") long userid);
- 折衷:
- jpql是数据库-nostic,但灵活性较低。
- >牺牲可移植性的本地查询。
标准
jdbc
jpa弹簧数据
speed
更快(raw sql,no orm费用)
慢一点(对象映射)
样本
更多(手动映射)
(仓库抽象)少(仓库抽象)
复杂查询
完全控制
jpql/jpql/hibernate 限制
交易
手册(@transactional)
自动(存储方法)
架构更改
sql更新 hibernate ddl自动上升(风险!)
- 您需要在sql上
- 细粒的控制(如分析、报告)。 >使用不适合orm模型的使用
- 旧数据库。
- >性能至关重要的操作(高通量批处理)。
>
>实时股票趋势的财务应用程序通过复杂的sql聚合计算。- 重型应用程序
- (如管理面板、电子商务)。 您的架构和面向对象的模型 对齐。
- >您需要内置功能,如缓存、审计或分页。
- >用例:
> >社交媒体平台通过嵌套关系管理用户信息、帖子和评论。
public class UserService { @Autowired private UserRepository userRepository; // JPA @Autowired private UserJdbcDao userJdbcDao; // JDBC public UserStats getUserStats(Long userId) { User user = userRepository.findById(userId).orElseThrow(); List<Order> orders = userJdbcDao.findRecentOrders(userId); return new UserStats(user, orders); } }
5。判决
对于标准用例,春季数据jpa 是您的- 生产力促进
- 。 当您需要原始功率和精度时,jdbc 是你的逃避孵化 。
- 经验法则:>
>在sql最重要的情况下,将jdbc用于其他20%。
- 通过了解这些工具的优点,您可以构建一个既有效又有效的工具 > and 可维护数据层的数据层。无论您是构建快速原型还是高性能系统,spring boot使您能够灵活地选择(或混合)合适的工作工具。
以上是春季数据JPA和JDBC:请关注图灵教育的其他相关文章,选择正确的数据库工具的详细信息!
