第一讲
- 对象-关系映射(Object Relational Mapping,简称ORM),把域模型表示的对象映射到关系数据模型对应的数据库结构中去。ORM 技术是在实体类对象和数据库表之间提供了一条桥梁;通过ORM只需简单的操作实体对象的属性和方法,不需要再去和复杂的 SQL语句打交道
3. Hibernate是什么?
在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架;
Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架;
Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。
4. Hibernate需要从配置文件中读取数据库配置信息,配置文件一般位于项目根路径。
Hibernate配置文件两种方式:
hibernate.properties (键=值方式)
默认名字为:hibernate.propeties
hibernate.cfg.xml
一般推荐使用第二种
5. hibernate.cfg.xml的具体配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,
XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件-->
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--Hibernate配置文件的根元素,其他文件要包含在其中-->
<hibernate-configuration>
<!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作-->
<session-factory>
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序,8.0版本的MySQL要在mysql和jdbc之间加上cj-->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<!--与之前使用的版本不同,8.0要加上时区的配置,且中间都要使用&隔开,如果是直接在servlet里面写连接路径,则不需要写&只需要一个&隔开就好 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/anno?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<!-- 连接数据库时数据的传输字符集编码方式 -->
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<!--连接数据库时的用户名-->
<property name="hibernate.connection.username">root</property>
<!--连接数据库时的密码-->
<property name="hibernate.connection.password">1234</property>
<!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,
程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化输出的Sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定映射文件,可映射多个映射文件,一个类规范写有一个映射文件-->
<mapping resource="com/ddd/entity/Course.hbm.xml"/>
<mapping resource="com/ddd/entity/Student.hbm.xml"/>
<mapping resource="com/ddd/entity/Score.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 持久化类:指其实例需要被Hibernate持久化到数据库中的类即实体类
private 类型属性;
public 类型的 setter 和 getter 方法;
public 或 protected 类型的无参数的构造方法。 - 描述持久化类与数据库表之间的对应关系。
- 持久化类的配置文件
class元素用于指定类和表之间的映射。
name属性设定类名(包含路径);
table属性设定表名,默认以类名作表名。
class元素包含一个id子元素及多个property子元素。
id 子元素设定持久化类的OID和表的主键的映射关系。
column – 指定表字段的名称;
generator – 元素指定OID的生成器。
property 子元素设定类的其他属性和表的字段的映射关系。
name – 对应类的属性名称;
type – 指定属性的类型;
column – 指定表字段的名称;
not-null – 指定属性是否允许为空。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- packge对应持久化类的包名 -->
<hibernate-mapping package="com.ddd.entity">
<class name="Course" table="course">
<!-- id 和 property 元素不能颠倒位置 -->
<id name="id" column="id">
<!-- 主键生成策略 使用native,需要底层数据库自己设置主键的值哦,比如AUTO_INCREMENT -->
<generator class="identity">
</generator>
</id>
<property name="name" column="name"></property>
<property name="credit" column="credit"></property>
<!-- 一个课程关联多个学生 -->
<!--
使用set来描述在一的一方中关联的多,也即Set<Orders>
它的name属性就是Set集合的名称:orders
key:它主要描述关联的多的一方产生的外键名称,注意要与多方定义的外键名称相同
inverse属性:
默认为false,表示本方维护关联关系。
如果为true,表示本方不维护关联关系。
只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有任何影响。
cascade属性:
默认为none,代表不级联。
级联是指操作主对象时,对关联的对象也做相同的操作。
可设为:delete,save-update,all,none,...
one-to-many:主要描述集合中的类型
cascade="all"
-->
<set name="stu" table="score" inverse="true">
<!--指的是本实体类在第三方表中外键的名称 -->
<key column="cid"></key>
<many-to-many class="Student" column="stuid" />
</set>
</class>
</hibernate-mapping>
第二讲
-
主键必须满足的条件:
不允许null;
每条记录必须有唯一的主键值,主键值不能重复;
每条记录的主键值不能改变。
主键分类:
业务(自然)主键:具有实际意义;
代理主键:没有实际意义。(我们使用的id就属于代理主键) -
OID 是关系数据库表中的主键(通常是代理主键)在 Java 对象模型中的等价物;
Hibernate 采用 OID 来维持Java持久化类和数据库表中对应关系; -
Hibernate 允许在持久化类中把OID定义为以下三种类型:
Short、Integer、Long;为了保证 OID 的唯一性,通常由 Hibernate 或底层数据库给 OID 赋值。 -
在对象-关系映射配置文件中class元素的子元素用来设置 OID。
generator子元素用来指定OID的生成器。
-
increment 标识符:该机制是 Hibernate 以递增的方式为OID赋值。不依赖于底层数据库系统,适合所有数据库;适合单独的 Hibernate 应用使用,不适合在集群情况下使用。
identity 标识符: 该机制依赖于底层数据库,需要数据库支持自动增长字段。//把数据库原有的id删除了,它只会在已删除的id上自动增长,如果数据有id大于已删除的字段则在最大的id上增长,如果删除的是最大的id,则以已删除的最大id增长,比如删掉了id为5、6的数据,数据库中目前最大是4,则下一条id是7而不是5
assigned 标识符: 该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。需要自己在程序中设值;例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。
然后在程序中set.studentNo();设置id的值;
第三讲
- Hibernate提供两种映射一对一关联关系的方式:
主键关联映射;
唯一外键关联映射。
外键必须设定 unique 约束。 - 主键关联映射 – 外键表(PERSON )
通过one-to-one 元素配置。
constrained 属性为 true,表明 PERSON 表 ID 为外键,参照主表(USER)。
外键表实体类配置文件中 OID 使用 foreign 生成策略。 - 唯一外键关联映射 - 主键表(PERSON)。
通过one-to-one 元素配置。
property-ref 属性,表明建立了从User到Person的一对一关联关系。