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

  • 相关阅读:
    14-定时器
    13-JS中的面向对象
    12-关于DOM操作的相关案例
    11-DOM介绍
    10-关于DOM的事件操作
    09-伪数组 arguments
    08-函数
    07-常用内置对象
    06-流程控制
    05-数据类型转换
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7856712.html
Copyright © 2020-2023  润新知