Hibernate概念
- 对JDBC API的封装
- 完成对象持久化的持久层框架
- 自动ORM框架-将对象与表的关系使用配置文件映射
对象-关系映射:一个持久化类和一个表对应
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 记录 |
属性 | 列 |
如何创建一个Hibernate项目
- 导入相关jar包
- 实体类&配置文件
主配置文件:
<?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在连接数据库时,需要用到数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名-->
<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">123456</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>
<!-- 使用ThreadLocal管理Session -->
<property name="hibernate.current_session_context_class">thread</property>
<!--指定映射文件,可映射多个映射文件-->
<!-- <mapping class="com.test.entity.Product" /> -->
<mapping resource="com/test/entity/Product.hbm.xml"/>
</session-factory>
</hibernate-configuration>
持久化类的配置文件:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.test.entity">
<!-- name对应类名,table对应数据库中的表名 -->
<class name="Product" table="products" lazy="true">
<!-- 设置主键的映射关系 -->
<id name="id" column="id" >
<generator class="identity">
</generator>
</id>
<!-- 设置除主键外的其他对象-关系的映射
name对应类中的属性
colum对应表中的列(字段)
-->
<property name="name" column="name" >
<!-- <column name="" sql-type=""></column> -->
</property>
<property name="price" column="price"></property>
<property name="description" column="description" ></property>
</class>
</hibernate-mapping>
3.主要API
Configuration cfg = new Configuration().configure();//加载配置文件
SessionFactory factory = cfg.buildSessionFactory();//创建会话工厂
Session session = factory.openSession();//打开一个会话
Transaction tran = session.beginTransaction();//开启事务
tran.commit();//提交事务
session.close();//关闭会话
factory.close();//关闭会话工厂
Configuration 配置对象:
- new Configuration() hibernate将自动加载 hibernate.properties文件( hibernate.properties文件必须存放在类路径(src)下)
- addResource(String resource) 导入一个指定位置的映射文件
- addClass(Class clazz) 导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件
- configure() 将加载src下的hibernate.cfg.xml
SessionFactory工厂:
- SessionFactory 相当于java web连接池,用于管理所有session
获得方式:config.buildSessionFactory(); - 打开一个新的会话 session
factory.openSession(); - 获得当前线程中绑定的会话session
factory.getCurrentSession();
Session 会话:
- Session 相当于 JDBC的 Connection – 会话
- 通过session操作PO对象 --增删改查
save 保存
update 更新
delete 删除
Transaction 事务:
- 开启事务 beginTransaction() : 开启一个新的事物
- 获得事务 getTransaction() : 获得一个绑定在此线程上的事物
- 提交事务:commit()
- 回滚事务:rollback()
对象标识符映射
- 映射文件中OID的配置:
在对象-关系映射配置文件中元素的子元素用来设置 OID - 标识符生成器:
1、increment 采用 Hibernate 数值递增的方式
2、identity 采用数据库提供的自增长方式
3、assigned 主键由应用逻辑产生
实体之间的关系
- 一对一联系(1:1)
如学生与身份证的一对一关联(主键关联映射)
主键表:
通过one-to-one元素配置:
1、cascade属性(级联属性)为 all
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.oto">
<class name="Student" table="student">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<one-to-one name="idCard" class="IdCard" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
外键表:
通过one-to-one元素配置:
1、constrained 属性为 true,表明 idcard 表 ID 为外键,参照主表(student);
2、外键表实体类配置文件中 OID 使用 foreign 生成策略;
idcard.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.oto">
<class name="IdCard" table="idcard">
<id name="id" column="id">
<generator class="foreign">
<param name="property">student</param>
</generator>
</id>
<property name="idNo" column="idNo"></property>
<one-to-one name="student" class="Student" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
- 一对多联系(1:n)
如学生与角色是一对多关联:
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.otm">
<class name="Student" table="student">
<id name="id" column="id">
<generator class="identity"></generator>
</id>
<property name="name" column="name"></property>
<set name="roles" cascade="delete">
<key column="sid"></key>
<one-to-many class="Role"/>
</set>
</class>
</hibernate-mapping>
set元素属性:
1、name属性:指定要映射的属性名;
2、cascade级联操作属性:save-update、delete、all、none
set元素的子元素:
1、key元素:column 属性设定所关联类对应表的外键;
2、one-to-many元素:class 属性设定所关联的类
Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.otm">
<class name="Role" table="role">
<id name="id" column="id">
<generator class="identity"></generator>
</id>
<property name="name" column="name"></property>
<many-to-one name="student" class="Student" column="sid"></many-to-one>
</class>
</hibernate-mapping>
many-to-one元素的属性:
1、name 属性:指定需映射的属性名;
2、column 属性:指定ORDER中的外键列名;
3、class 属性:指定所关联的类型
- 多对多联系(m:n)
如学生与课程是多对多关联:
Course.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.mtm">
<class name="Course" table="course">
<id name="id" column="id">
<generator class="increment"></generator>
</id>
<property name="name" column="name"></property>
<property name="cno" column="cno"></property>
<set name="students" table="student_course" inverse="true">
<key column="courseid"></key>
<many-to-many class="Student" column="studentid"></many-to-many>
</set>
</class>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.job.mtm">
<class name="Student" table="student">
<id name="id" column="id">
<generator class="increment"></generator>
</id>
<property name="name" column="name"></property>
<property name="sno" column="sno"></property>
<set name="courses" table="student_course" inverse="false">
<key column="studentid"></key>
<many-to-many class="Course" column="courseid"></many-to-many>
</set>
</class>
</hibernate-mapping>
set元素属性:
1、name属性:指定类的属性名;
2、table属性:指定多对多关联关系中间表;
3、cascade级联操作属性:save-update、delete、all、none
set子元素:
1、key元素:设定实体类对应表的外键;
2、many-to-many元素中class属性:设定关联类型
inverse属性:
inverse=true 表示被控方,=false 表示主控方;