hibernate 执行sql在哪个类_Hibernate 为什么?是什么?干什么?

45d89f7b1e14b8733a4b1f5ea1c969f4.png

为什么?

首先值得提一点的是,同时使用面向对象的软件和关系数据库既麻烦又费时。由于对象和关系数据库中的数据表示方式之间存在范式不匹配,因此开发成本明显更高。

是什么?

Hibernate是针对Java环境的对象/关系映射(ORM)解决方案。术语“对象/关系映射”是指在对象模型表示与关系数据模型表示之间映射数据的技术。

干什么?

Hibernate负责从Java类到数据库表以及从Java数据类型到SQL数据类型的映射。此外,它还提供数据查询和检索功能。它可以显着减少开发时间,否则将花费在SQL和JDBC中的手动数据处理上。Hibernate的设计目标是通过消除使用SQL和JDBC进行手工数据手工处理的需求,使开发人员摆脱95%的常见数据持久性相关编程任务。

但是,与许多其他持久性解决方案不同,Hibernate不会向您隐藏SQL的强大功能,并保证我们对关系技术和知识的投资一如既往地有效。

对于仅使用存储过程在数据库中实现业务逻辑的以数据为中心的应用程序,Hibernate可能不是最佳解决方案,它对于基于Java的中间层中的面向对象域模型和业务逻辑最有用。但是,Hibernate当然可以帮助您删除或封装特定于供应商的SQL代码,并简化将结果集从表格表示形式转换为对象图的常见任务。


The Hibernate configuration file

hibernate.cfg.xml文件定义了Hibernate配置信息

将持久性类的映射文件添加到配置中。元素的resource属性<mapping/>使Hibernate尝试使用查找将该映射定位为类路径资源java.lang.ClassLoader

混淆点!!!!

映射文件中声明和使用的类型既不是Java数据类型也不是SQL数据库类型。相反,它们是Hibernate映射类型,它们是在Java和SQL数据类型之间转换的转换器。如果未在映射中指定type属性,则Hibernate尝试自动确定正确的转换和映射类型,方法是使用Java反射来确定已声明属性的Java类型,并使用该Java类型的默认映射类型。

在某些情况下,自动检测可能不会选择您期望或需要的默认值,如该date属性所示。Hibernate无法知道类型为的属性是否java.util.Date应映射到SQLDATETIMETIMESTAMP数据类型。通过将属性映射到标识转换器类的时间戳转换器,可以保留完整的日期和时间信息org.hibernate.type.TimestampType

处理映射文件时,Hibernate使用反射来确定映射类型。此过程增加了时间和资源方面的开销。如果启动性能很重要,请考虑明确定义要使用的类型。

4c9e8c301138541812e4cd71a67c018c.png

如上图所示,作为ORM解决方案,Hibernate有效地“位于” Java应用程序数据访问层和关系数据库之间。Java应用程序利用Hibernate API来加载,存储,查询等等其域数据。

作为JPA提供者,Hibernate实现了Java Persistence API规范,并且可以在下图中显示JPA接口与Hibernate特定实现之间的关联:

35da0d71671065a055f8c5fc351e6c9e.png

SessionFactory(org.hibernate.SessionFactory

应用程序域模型到数据库的映射的线程安全(且不可变)表示形式。充当org.hibernate.Session实例工厂。该EntityManagerFactory是JPA等价的SessionFactory,基本上,这两个汇聚到同一SessionFactory执行。

SessionFactory创建A 的成本非常高,因此,对于任何给定的数据库,该应用程序应仅具有一个关联的SessionFactorySessionFactoryHibernate在所有方面使用的维护服务,Session(s)例如二级缓存,连接池,事务系统集成等。

会话(org.hibernate.Session

单线程,短期对象从概念上建模“工作单元” PoEAA。在JPA命名法中,Session表示为EntityManager

在后台,Hibernate Session包装了JDBC,java.sql.Connection并充当org.hibernate.Transaction实例的工厂。它维护应用程序域模型的一般“可重复读取”持久性上下文(一级缓存)。

交易(org.hibernate.Transaction

应用程序用来划分单个物理事务边界的单线程,短期对象。 EntityTransaction是等效的JPA,并且都充当抽象API,以将应用程序与使用中的基础事务系统(JDBC或JTA)隔离开。

Domain Model 在这里我还是要说一问题,特别严重的问题,初学者不求甚解的问题。

关于数据建模,经常听到的是"持久类"。这就是我想记录下来的 东西。

关于映射了类型(mapping type)

为什么Hibernate理解应用程序数据的Java和JDBC表示形式(数据类型)?

为什么Hibernate类型的可以从数据库读取数据或向数据库写入数据?

因为Hibernate类型既不是Java类型也不是SQL数据类型。它提供有关将Java类型映射到SQL类型以及如何在关系数据库中持久化和获取给定Java类型的信息。

当您在Hibernate的讨论中遇到术语类型时,根据上下文,它可能是指Java类型,JDBC类型或Hibernate类型。

看个例子:

org.hibernate.query.Query query = session.createQuery(
	"select p " +
	"from Person p " +
	"where p.name like :name" )
.setParameter( "name", "J%", StringType.INSTANCE );

Hibernate通常会根据查询中的上下文了解参数的预期类型。在前面的示例中,由于我们在LIKE与String类型的属性进行比较的过程中使用了参数,因此Hibernate会自动推断类型;因此可以简化以上内容。

org.hibernate.query.Query query = session.createQuery(
	"select p " +
	"from Person p " +
	"where p.name like :name" )
.setParameter( "name", "J%" );

也有用于绑定常见类型(例如字符串,布尔值,整数等)的简写形式。

org.hibernate.query.Query query = session.createQuery(
	"select p " +
	"from Person p " +
	"where p.name like :name " +
	"  and p.createdOn > :timestamp" )
.setParameter( "name", "J%" )
.setParameter( "timestamp", timestamp, TemporalType.TIMESTAMP);

写在最后:

写的比较乱没有逻辑,都是些零散的知识点,自己也在慢慢学习中,表达不清的还请指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值