Hibernate_day04

上节内容

今天内容

Hibernate查询方式

对象导航查询

OID查询

HQL查询

查询所有

条件查询

排序查询

分页查询

投影查询

聚集函数使用

QBC查询

查询所有

条件查询

排序查询

分页查询

统计查询

离线查询

HQL多表查询

Mysql里面多表查询

HQL实现多表查询

HQL内连接

HQL左外连接

Hibernate检索策略

检索策略的概念

关联级别延迟操作

批量抓取

Hibernate_day04

上节内容

1 表与表之间关系回顾

(1)一对多(客户和联系人)

(2)多对多(用户和角色)

2 hibernate一对多操作

(1)一对多映射配置

(2)一对多级联保存

(3)一对多级联删除

(4)inverse属性

3 hibernate多对多操作

(1)多对多映射配置

(2)多对多级联保存(重点)

(3)多对多级联删除(了解)

(4)维护第三张表

今天内容

1 hibernate的查询方式

2 对象导航查询

3 hql查询

(1)查询所有

(2)条件查询

(3)排序查询

(4)分页查询

(5)投影查询

(6)聚集函数使用

4 qbc查询

(1)查询所有

(2)条件查询

(3)排序查询

(4)分页查询

(5)统计查询

(6)离线查询

5 hql多表查询

(1)mysql多表查询回顾

(2)hql多表查询

- 内连接、迫切内连接、左外连接、迫切左外连接、右外连接

6 hibernate的检索策略

(1)概念

- hibernate分成 :立即和延迟查询

- 延迟查询分成:类级别和关联级别延迟

(2)具体操作

Hibernate查询方式

1 对象导航查询

(1)根据id查询某个客户,再查询这个客户里面所有的联系人

2 OID查询

(1)根据id查询某一条记录,返回对象

3 HQL查询

(1)Query对象,写hql语句实现查询

4 QBC查询

(1)Criteria对象

5 本地sql查询

(1)SQLQuery对象,使用普通sql实现查询

对象导航查询

1 查询某个客户里面所有联系人过程,使用对象导航实现

准备:

Customer.java

public class Customer {
private Integer cid;// 客户id
private String custName;// 客户名称
private String custLevel;// 客户级别
private String custSource;// 客户来源
private String custPhone;// 联系电话
private String custMobile;// 手机
// 在客户实体类里面表示多个联系人,一个客户有多个联系人
// hibernate要求使用集合表示多的数据,使用set集合
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
public Set<LinkMan> getSetLinkMan() {
return setLinkMan;
}
public void setSetLinkMan(Set<LinkMan> setLinkMan) {
this.setLinkMan = setLinkMan;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
public String getCustMobile() {
return custMobile;
}
public void setCustMobile(String custMobile) {
this.custMobile = custMobile;
}
}

LinkMan.java

public class LinkMan {
private Integer lkm_id; // 联系人编号(主键)
private String lkm_name;// 联系人姓名
private String lkm_gender;// 联系人性别
private String lkm_phone;// 联系人办公电话
// 在联系人实体类里面表示所属客户,一个联系人只能属于一个客户
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Integer getLkm_id() {
return lkm_id;
}
public void setLkm_id(Integer lkm_id) {
this.lkm_id = lkm_id;
}
public String getLkm_name() {
return lkm_name;
}
public void setLkm_name(String lkm_name) {
this.lkm_name = lkm_name;
}
public String getLkm_gender() {
return lkm_gender;
}
public void setLkm_gender(String lkm_gender) {
this.lkm_gender = lkm_gender;
}
public String getLkm_phone() {
return lkm_phone;
}
public void setLkm_phone(String lkm_phone) {
this.lkm_phone = lkm_phone;
}
}

Customer.hbm.xml

<hibernate-mapping>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.itcast.entity.Customer" table="t_customer">
<id name="cid" column="cid">
<generator class="native"></generator>
</id>
<property name="custName" column="custName"></property>
<property name="custLevel" column="custLevel"></property>
<property name="custSource" column="custSource"></property>
<property name="custPhone" column="custPhone"></property>
<property name="custMobile" column="custMobile"></property>
<!-- 在客户映射文件中,表示所有联系人
使用set标签表示所有联系人
set标签里面有name属性:
属性值写在客户实体类里面表示联系人的set集合名称
inverse属性默认值:false不放弃关系维护
true表示放弃关系维护
-->
<set name="setLinkMan" inverse="true" cascade="save-update,delete">
<!-- 一对多建表,有外键
hibernate机制:双向维护外键,在一和多那一方都配置外键
column属性值:外键名称
-->
<key column="clid"></key>
<!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
<one-to-many class="cn.itcast.entity.LinkMan"/>
</set>
</class>
</hibernate-mapping>

LinkMan.hbm.xml

<hibernate-mapping>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.itcast.entity.LinkMan" table="t_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_name" column="lkm_name"></property>
<property name="lkm_gender" column="lkm_gender"></property>
<property name="lkm_phone" column="lkm_phone"></property>
<!-- 表示联系人所属客户
name属性:因为在联系人实体类使用customer对象表示,写customer名称
class属性:customer全路径
column属性:外键名称
-->
<many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
</class>
</hibernate-mapping>

运行工具类生成表

public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供返回与本地线程绑定的session方法
public static Session getSessionObject() {
return sessionFactory.getCurrentSession();
}
// 提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void main(String[] args) {
}
}

2 代码

具体:

// 演示对象导航查询
@Test
public void testSelect1() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
// 根据cid=1客户,再查询这个客户里面所有联系人
Customer customer = session.get(Customer.class, 1);
// 再查询这个客户里面所有联系人
// 直接得到客户里面联系人的set集合
Set<LinkMan> linkman = customer.getSetLinkMan();
System.out.println(linkman.size());
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
sessionFactory.close();
}
}

OID查询

1 根据id查询记录

(1)调用session里面的get方法实现

Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询的更多相关文章

  1. (十)Hibernate 查询方式

     所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...

  2. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  3. hibernate 查询方式汇总

    主要摘自  http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/artic ...

  4. Hibernate的Api以及三种查询方式

    Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) ...

  5. Hibernate第四天——查询方式

    Hibernate入门最后一天第四天,我们进行查询方式的更进一步的细化: 先看一下大致的Hibernate的提供的查询的方式: 1.对象导航查询 2.OID查询 3.HQL查询 4.QBC查询 5.本 ...

  6. hibernate 查询方式

    1.对象导航查询 2.OID查询 3.hql查询 4.QBC查询 5.本地sql查询 一.对象导航查询 示例: 查询id=6的user对象的所有角色: 二.OID查询 实例查询id=6的user对象 ...

  7. Hibernate查询方式汇总

    Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的 ...

  8. 4、Hibernate的查询方式

    一.Hibernate的查询方式:OID查询 1.OID检索:Hibernate根据对象的OID(主键)进行检索 1-1.使用get方法 Customer customer = session.get ...

  9. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

随机推荐

  1. SyntaxError: Non-ASCII character '\xe5' in file index.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    python入门,hhh 在慕课网上学习python入门,编写汉诺塔的递归调用时,代码正确.但是加上注释后编译不通过 报如下错误: SyntaxError: Non-ASCII character , ...

  2. C#获取文件的md5

    上代码: //获取MD5 public static string GetMd5Hash(String input) { if (input == null) { return null; } MD5 ...

  3. IHttpHandler的那些事

    写在前面 从上家公司离职,在家休息,闲着无聊,觉得还是有必要将IHttpHanlder的内容,做一个总结.发现在写demo的过程中,总觉得有点生疏了,项目中很少使用自定义的类来实现该接口.当然,一般处 ...

  4. C语言实现http get请求程序

    1.客户端程序: 向指定URL发送http请求, http://files.cnblogs.com/files/yyx1-1/httpclient01.7z 源码程序 2.服务器程序: 接收URL请求 ...

  5. GOF对Builder模式的定义(转载)

    (1)意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. (2)适用性 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式:2. 当构造过程必须允许构 ...

  6. Informix 配置选项

    下表列出了用于改善数据库性能的附加选项.如果选择在 onconfig 配置文件中进行更改,则需要重新启动 Informix 通用服务器.可以在 Informix 服务器处于联机或脱机状态时编辑 onc ...

  7. linux学习知识

    一.用户,用户组 http://os.51cto.com/art/201003/187533.htm http://www.cnblogs.com/zhoug2020/archive/2012/02/ ...

  8. U3D安卓下OnApplicationQuit不执行的解决方法

    安卓下当你按Home键,程序会进入暂停状态.所以只能改成调用OnApplicationPause. Unity论坛上说实现IDispose接口也可以,似乎IOS可以,但安卓测试了,无效.

  9. 【原创】关于$test$plusargs和$value$plusargs的小结【SystemVerilog/Verilog】

    [原创]关于$test$plusargs和$value$plusargs的小结 Abtract $test$plusargs和$value$plusargs作为进行Verilog和SystemVeri ...

  10. 每日英语:China Targets Big Pharma

    China unveiled a litany of bribery and misconduct allegations against GlaxoSmithKline GSK.LN -0.26% ...