-
Hibernate环境搭建:
下载Hibernate:
解压:
Hibernate开发包:
------引入开发依赖包后全选包右键build path-------- -
新建xml文件建立类与表之间的映射标签是
<hibernate-mapping></hibernate-mapping>
-
配置Hibernate核心配置文件,命名规则:XXX.cfg.xml
-
映射的配置
【class标签的配置】
标签用来建立类与表的映射关系
属性:
name :类的全路径
table :表名(类名与表名一致,table可以省略)
catalog :数据库名
【id标签的配置】
标签用来建立类中的属性与表中的主键的对应关系
属性:
name :类中的属性名
column :表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略)
length :长度
type :类型
【property标签的配置】
标签用来建立类中的普通属性与表的字段的对应关系
属性:
name :类中的属性名
column :表中的字段名
length :长度
type :类型
not-null :设置非空
unique :设置唯一 -
核心的配置根标签
<hibernate-configration></hibernate-configration>
必须的配置
连接数据库的基本的参数
驱动类<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
url路径<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
用户名<property name="hibernate.connection.username">root</property>
密码<property name="hibernate.connection.password">abc</property>
方言<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
可选的配置
显示SQL :hibernate.show_sql
格式化SQL :hibernate.format_sql
自动建表 :hibernate.hbm2ddl.auto
none :不使用hibernate的自动建表
create :如果数据库中已经有表,删除原有表,重新创建,如果没有表,新建表。(测试)
create-drop :如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。(测试)
update :如果数据库中有表,使用原有表,如果没有表,创建新表(更新表结构)
validate :如果没有表,不会创建表。只会使用数据库中原有的表。(校验映射和表结构)。
映射文件的引入
引入映射文件的位置
-
HIbernate的核心API
- configuration
加载核心配置文件:
- configuration
Configuration cfg = new Configuration().configure();
- SessionFactory:Session工厂
Session代表的是Hibernate与数据库的链接对象。不是线程安全的。与数据库交互桥梁。
保存方法:
Serializable save(Object obj);
查询方法:
T get(Class c,Serializable id);
T load(Class c,Serializable id);
修改方法
void update(Object obj);
删除方法
void delete(Object obj);s
保存或更新
void saveOrUpdate(Object obj)
-
什么是持久化类?
持久化:将内存中的一个对象持久化到数据库中的过程,hibernate框架就是用来持久化的框架。
持久化类:一个java对象与数据库建立了映射关系,那么这个类在hibernate中叫做持久化类。持久化类=java类+映射文件。 -
**持久化类的编写规则:
1.对持久化类提供一个无参构造。2.属性私有,提供对外get、set方法。3.对持久化类提供唯一标识OID与数据库主键相对应。4.属性尽量使用包装类类型(因为基本数据类型默认值为0,包装类类型的默认值为null)。5.持久化类不要使用final来修饰 ** -
主键分类:1.自然主键:主键的本身就是表中一个字段(实体中的一个具体属性)2.代理主键:主键本身不是表中的一个必须字段,是新加的一个字段。(尽量使用代理主键,若自然主键参与业务逻辑,后期维护可能要修改源码。)
-
Hibernate主键生成策略:
-
持久化类的三种状态::瞬时态、持久态、脱管态
瞬时态:没有唯一标识OID,也没有被session管理时的对象。
持久态:有唯一标识OID,也被session管理时的对象。比如new出来之后调用session的方法去操作对象,save、update等等。
脱管态:已经有唯一标识OID,但是没有被session管理,比如操作完对象之后session关闭,此时的对象就属于脱管态对象。 -
Hibernate一级缓存
缓存:是一种优化的方式,将数据存在内存中,使用的时候直接从内存中获取。
一级缓存:又被称为session级别的缓存,一级缓存的生命周期与session一致。
-
一级缓存的快照机制:堆内存中的数据与快照中的数据进行对比,如果不一致,则会执行同步(update)操作,若相同,则不执行update。快照是数据的副本 快照属于一级缓存 快照是在堆内存中的 快照的作用:保证数据一致性
-
Hibernate其他API
一对多的建表原则:在多的乙方创建外键指向一的一方。 -
多对多的建表原则:创建一个中间表,中间表至少有两个字段分别指向多对多双方的主键。
一对多实体创建:
一对多映射创建:(因为有两张表,所有要有两个实体对象和表的映射)
一对多测试类 :
-
Hibernate共提供了五种查询方式。
1.OID检索
OID检索:Hibernate根据对象的OID(主键)进行检索
Customer customer = session.get(Customer.class,1l);//get()方法
Customer customer = session.load(Customer.class,1l);//load()方法
2.对象导航检索:对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
3.HQL检索(##)
HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
初始化一些数据
HQL的简单查询
HQL的别名查询
HQL的排序查询
HQL的条件查询
HQL的投影查询
投影查询:查询对象的某个或某些属性。
HQL的分页查询
HQL的分组统计查询
HQL的多表查询
多表查询
连接查询
交叉连接:笛卡尔积
select * from A,B;
内连接 :inner join (inner 可以省略)
隐式内连接:
select * from A,B where A.id = B.aid;
显示内连接:
select * from A inner join B on A.id = B.aid;
外连接 :
左外连接:left outer join(outer 可以省略)
select * from A left outer join B on A.id= B.aid;
右外连接:right outer join(outer 可以省略)
select * from A right outer join B on A.id = B.aid;
子查询
HQL的多表查询
连接查询
交叉连接
内连接
显示内连接
隐式内连接
迫切内连接
外连接
左外连接
右外连接
迫切左外连接
4.QBC检索(##)
QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。
1.简单查询
2.排序查询
3.分页查询
4.条件查询
5.统计查询
- 延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。
-
类级别的延迟加载
指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
类级别延迟加载通过上的lazy进行配置,如果让lazy失效
将lazy设置为false
将持久化类使用final修饰
Hibernate. Initialize()2.关联级别的延迟加载
指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。