Java学习之Hibernate
1、Hibernate是一种开源的ORM服务实现。ORM工具简化了数据创建,数据处理和数据访问。它是将对象映射到数据库中存储的数据(表)的编程技术。
2、对象/关系范式不匹配,利用数据库存储对象就有问题。
3、MyEclipse2017 CI新建一个Hibernate项目的过程(
参考链接:https://blog.****.net/m0_37105443/article/details/63865600):
+ 新建一个Web Project工程
+ net start xxx启动MySQL;创建数据库驱动连接:单击右上角的图标,选择MyEclipse Database Explorer
+ 切换模式后新建一个数据库连接,点击左侧空白处,右键——New,在弹出的对话框如下图配置:
点击TestDriver是连接成功的。
+Display All Schemas,Finish,双击刚创建的Testxxx,就可以看到数据库的所有内容了:
+ 回到项目视图,右键项目——Configure Facets——Install Hibernate Facet,新建一个包用来存放sessionFactory:
+ next,选择上面建立的那个数据库连接:
+ 完成后可以看见HibernateSessionFactory.java。
4、数据库连接池:
非托管环境的JDBC连接池
非托管环境中带有连接池的Hibernate
5、Hibernate架构包括许多对象持久对象,会话工厂,事务工厂,连接工厂,会话,事务等。hibernate架构中有4层:Java应用层,hibernate框架层,反射api层和数据库层。
参考链接:https://www.yiibai.com/hibernate/hibernate-architecture.html
要创建第一个hibernate应用程序,我们必须知道Hibernate架构的元素。 它们如下:
会话工厂(SessionFactory)
SessionFactory
是ConnectionProvider
的会话和客户端工厂。 它拥有数据的二级缓存(可选)。 org.hibernate.SessionFactory
接口提供了工厂方法来获取Session
的对象。
Session对象提供应用程序和存储在数据库中的数据之间的接口。 它是一个短生命周期的对象并包装JDBC连接。 它是事务,查询和标准的工厂。 它拥有一级缓存(强制性)数据。 org.hibernate.Session
接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。
事务(Transaction)
事务对象指定工作的原子单位,它是一个可选项。 org.hibernate.Transaction
接口提供事务管理的方法。
连接提供者(ConnectionProvider)
它是一个JDBC连接工厂。 它从DriverManager
或DataSource
抽象出来的应用程序。 它是一个可选项。
事务工厂(TransactionFactory)
它是一个事务工厂,是一个可选项。
一个Hibernate应用程序的构建步骤:
- 创建java项目
- 为hibernate添加jar文件
- 创建持久类
- 创建持久类的映射文件
- 创建配置文件
- 创建检索或存储持久对象的类
- 运行应用程序
6、使用Hibernate注解,Hibernate注解基于JPA2.0规范,所有注解都在javax.persistence.*中定义,使用注解的好处是不需要创建*.hbm.xml文件。
域模型:业务数据在内存中表现为实体域对象,以及实体域对象之间的各种关系;
关系数据模型:业务数据表现为数据库中的表,以及表与表之间的参照关系;
对象的持久化就是把内存中对象形式的业务数据转换为数据库中的关系数据形式的业务数据,把它永久保存下来。
7、应用程序通过Hibernate API访问数据库,Hibernate API中的接口分为以下几类:
提供访问数据库操作(CRUD)的接口:Session、Transaction、Query
用于配置Hibernate的接口:Configuration
使应用程序拦截Hibernate内部发生的事件并做相应回应:Interceptor、LoadEventListener、SaveEventListner等
用于扩展Hibernate功能的接口:如UserType、IdentiferGenerator。
通过JDBC API和Hibernate API操作数据库对比
8、Hibernate提供了一系列工具在类、数据库表、映射文件之间自动转化,不用手工创建映射文件:
9、对象-关系映射基础:
持久化类使用JavaBean的风格,为需要被访问的属性提供getXXX和setXXX方法。在Hibernate应用中,持久化类的访问方法有两个调用者:Java应用程序和Hibernate。
在持久化类中,属性可以定义为基本类型或包装类型,在Hibernate中是一样的,推荐使用包装类型。
在对象-关系映射文件中,<property>的access属性定义了Hibernate访问持久化类的属性的访问方式,有property和filed两种取值,前者表名Hibernate可以通过setXXX和getXXX访问属性,是优先推荐的方式,field表示Hibernate可以通过Java反射机制直接访问类的属性。
在持久化类的访问方法中可以加入程序逻辑。
并不是持久化类的所有属性都直接和表的字段匹配,持久化类的有些属性的值必须在运行时通过计算才能得出来,这种属性称为派生属性。
Hibernate在初始化阶段,就会根据映射文件的映射信息,为所有的持久化类预定义SQL语句:insert、update、delete、select。
如果数据库表名或字段名中包含空格或特殊字符,那么可以使用引用标识符。
创建命名策略,org.hibernate.cfg.NamingStragegy。
一个数据库系统可以包含多个Schema,一个Schema可以包含多张表,在映射文件中可以通过schema属性区分不同的schema。
10、映射对象标识符:对象的OID和数据库表的主键对应。Java语言按内存地址区分同一个类的不同对象,数据库按主键值来区分同一个表的不同记录,Hibernate用OID来统一两者之间的矛盾。