Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询

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多表查询

1mysql多表查询回顾

2hql多表查询

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

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方法实现

原文地址:https://www.cnblogs.com/justdoitba/p/7856712.html