黑马程序员技术交流社区

标题: 【郑州校区】三大框架之Hibernate注解开发-7(上) [打印本页]

作者: 我是色色    时间: 2017-12-15 10:57
标题: 【郑州校区】三大框架之Hibernate注解开发-7(上)
本帖最后由 我是色色 于 2017-12-20 10:42 编辑

hibernate中我们使用注解,可以帮助我们简化hbm文件配置。
PO类注解配置
@Entity 声明一个实体
@Table来描述类与表对应
@Id来声明一个主键
@GenerateValue 用它来声明一个主键生成策略
默认情况下相当于native
可以选择的主键生成策略 AUTO IDENTITY SEQUENCE
@Column来定义列
注意:对于PO类中所有属性,如果你不写注解,默认情况下也会在表中生成对应的列。
列的名称就是属性的名称
@Temporal来声明日期类型
可以选择
TemporalType.DATA   只有年月日  
TemporalType.TIME   只有小时分钟秒
TemporalType.TIMESTAMP 有年月日小时分钟秒

我们最终需要在hibernate.cfg.xml文件中将我们类中的注解配置引用生效

问题:1.如果我们主键生成策略想使用UUID类型?

问题2:如果设定类的属性不在表中映射?

对于我们以上讲解的关于属性配置的注解,我们也可以在其对应的getXxx方法去使用

一对多(多对一)
@OneToMany
@ManyToOne
CustomerOrder为例

Customer
Order

示例:保存客户时,保存订单
对于这个示例我们需要在Customer中配置cascade操作,save-update
第一种方式,可以使用JPA提供的注解
第二种方式:可以使用hibernate提供的注解

以下是示例代码
执行后的结果

订单中没有关联客户的id,为什么?
原因:我们在Customer中配置了mappedBy=”c”它代表的是外键的维护由Order方来维护,而Customer不维护,这时你在保存客户时,级联保存订单,是可以的,但是不能维护外键,所以,我们必须在代码中添加订单与客户关系。

扩展:关于hibernate注解@Cascade中的DELETE_ORPHAN过时
使用下面方案来替换过时方案

Hibernate关联映射-多对多
我们使用注解完成多对多配置.
描述学生与老师.
使用@ManyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedBy表示放置外键维护权。

创建PO
Teacher类中
Student类中

级联保存操作测试
        因为我们将外键的维护权利由Student来维护,我们演示保存学生时,将都也级联保存。


我们在Student类中配置了级联

级联删除操作测试

Hibernate关联映射-一对一
以人与身份证号为例

一对一操作有两种映射方式:
1. 在任意一方添加外键
2. 主键映射

外键映射
创建实体
User
上述配置,t_user表放弃对外键的维护权利

IDCard
joinColumn指定外键列名称,当前配置外键是在t_idcard表中

测试代码
主键映射(了解)
HusbandWife为例

Wife的主键生成策略是identity
@PrimaryKeyJoinColumn 说明husbandwife是使用主键映射

Husband的主键我们设置成参考wife的主键方式

测试操作

Hibernate检索方式概述
对数据库操作中,最常用的是select.使用hibernate如何select操作。

分为五种:
1导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句

导航对象图检索方式
        Customer c=session.get(Customer.class,2);
        c.getOrders().size()
        通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到
        其关联的持久化对象信息。
OID检索方式
        Session.get(Customer.class,3);
        Session.load(Order.class,1);
        Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。

HQL
HQL是我们在hibernate中是常用的一种检索方式。
HQLHibernate Query Language)提供更加丰富灵活、更为强大的查询能力
因此HibernateHQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语 句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的update/deleteHibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
基本步骤:
1. 得到Session
2. 编写HQL语句
3. 通过session.createQuery(hql)创建一个Query对象
4. Query对象设置条件参数
5. 执行list查询所有,它反胃的是List集合  uniqueResut()返回一个查询结果。

数据准备
基本检索
From 类名;
排序检索
条件检索
分页检索

分组统计检索
分组  group by
统计  count   max  min  avg  sum
投影检索
我们主要讲解是关于部分属性查询,可以使用投影将部分属性封装到对象中。
注意:我们必须在PO类中提供对应属性的构造方法,也要有无参数构造。

命名检索
我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行.
问题:hql定义在什么位置?
        1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个        实体的配置文件中声明。
        2.如果是使用注解来描述PO的配置
                我们直接在PO类中使用

如何使用?

QBC
QBC(query by criteria),它是一种更加面向对象的检索方式。
QBC步骤:
        1.通过Session得到一个Criteria对象   session.createCriteria()
        2.设定条件  Criterion实例 它的获取可以通过Restrictions类提供静态。
                Criteriaadd方法用于添加查询条件
3. 调用list进行查询  criterfia.list.

基本检索
排序检索
注意在criteri.addOrder()方法的参数使用的Orderhibernate中的对象
条件检索
分页检索
统计分组检索
Count  sum  avg  max  min
离线条件检索
本地SQL
本地sql也支持命名查询。
可以将sql语句定义在hbm文件中,也可以使用注解。
本地命名sql注解定义
如果执行这个命名的sql会产生异常
出现问题的原因:hibernate不知道执行select * from t_customer后如果将结果封装。

多表操作SQL多表操作1.交叉连接  CROSS JOIN  会产生迪卡尔积
SELECT * FROM t_customer CROSS JOIN t_order;

2.内连接  INNER JOIN  ON
SELECT * FROM t_customer AS c INNER JOIN t_order AS o ON c.id=o.c_customer_id;

使用内连接它只能将有关联的数据得到。

隐式内连接  使用 "逗号"将表分开,使用WHERE来消除迪卡尔积
SELECT * FROM t_customer AS c ,t_order o WHERE c.id=o.c_customer_id;


3.外连接  左外LEFT OUTER JOIN    右外RIGHT OUTER JOIN
OUTER可以省略
SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id;
HQL多表操作
        Hql多表操作分类:
1. 交叉连接
2. 内连接
a) 显示内连接
b) 隐式内连接
c) 迫切内连接
3. 外连接
左外连接
迫切左外连接
右外连接
注意:在hibernate中有迫切连接的概念,而sql中没有。
内连接显示内连接
显示内连接使用的是inner join with
隐式内连接
隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联
迫切内连接
迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象。


外连接

{:8_507:}
三大框架之Hibernate持久化类与主键生成策略-6
三大框架之Hibernate常用API-5
Java三大框架学习之Hibernate的配置详解-4(下)
JavaEE三大框架课堂笔记之Hibernate快速入门-4(上)
三大框架之Struts2-3
三大框架之Struts2-2
三大框架之Struts2-1
线程精进指南之线程池进阶
15个顶级Java多线程面试题及答案
Java String 面试题以及答案
Java IO流学习总结
14个你可能不知道的JavaScript调试技巧
Spring多个AOP执行先后顺序
认识JavaScript中的this

作者: 我是楠楠    时间: 2017-12-19 16:54

作者: 我是色色    时间: 2017-12-19 17:10
{:8_507:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2