>解锁数据层的利弊,缺点和秘密调味料
在使用spring boot构建java应用程序时,在
1。有什么区别?
>最小的开销。
jpa的解决方法(jpql或本机查询)
> jdbc(java数据库连接)
直接执行sql的低级api。
需要手动查询写作和结果集处理。
高级抽象构建在jpa(java persistence api)和hibernate上。
>将java对象映射到数据库表(orm)。
通过存储库自动化crud操作。
>示例1:通过id
获取用户
使用jdbc(带jdbctemplate)
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")
));
}
}
完全控制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();
用于基本操作的零sql。
>内置的分页,缓存和交易。
对sql优化的控制更少。
>示例2:带有连接的复杂查询
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的懒惰陷阱。
@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);
>
>
>通过嵌套关系管理用户资料,帖子和评论的社交媒体平台。
>在sql最重要的情况下,将jdbc用于其余20%。
标准
jdbc
弹簧数据jpa
speed
更快(raw sql,no orm开销)
稍慢(对象映射)
样本
更多(手动映射)
少(存储库抽象)
复杂查询
完全控制
受jpql/hibernate 限制
交易
手册(@transactional)
自动(存储库方法)
架构更改
sql更新
hibernate ddl自动上升(风险!)
criteria
jdbc
spring data jpa
speed
faster (raw sql, no orm overhead)
slightly slower (object mapping)
boilerplate
more (manual mapping)
less (repository abstraction)
complex queries
full control
limited by jpql/hibernate
transactions
manual (@transactional)
automatic (repository methods)
schema changes
sql updates required
hibernate ddl auto-update (risky!)
4。什么时候使用?
如果:,请选择jdbc
您需要在sql上
>用例:
选择弹簧数据jpa,如果:
快速开发繁重的应用程序
>混合方法:两者都混合!
>
组合基本操作的jpa和用于复杂查询的jdbc:
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
是您的生产力促进
>从jpa开始的80%的应用程序。
以上就是春季数据JPA与JDBC:选择正确的数据库工具的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号