美文网首页
有关Hibernate知识的学习(九)

有关Hibernate知识的学习(九)

作者: MsterKerrigan | 来源:发表于2018-03-06 10:57 被阅读0次
    hibernate其他的api(查询)
            Query对象
                使用query对象,不需要写SQL语句,但是需要写HQL语句
                1、hql hibernate query language,hibernate提供的查询语言,这个hql语句和一般的SQL语句很相似
                2、hql和SQL语句的区别:
                    使用SQL操作的是表和表的字段
                    使用hql操作的是实体类和属性
                查询所有的hql语句
                    from 实体类的名称
                query对象的使用
                    1、创建一个Query对象
                    2、调用query对象里面的方法得到结果
            Criteria对象
                使用这个对象的查询操作,但是使用这个对象的时候不需要写语句,直接调用方法实现
                实现的过程:
                    1、创建criteria对象
                    2、调用criteria对象里面的list()
            SQLQuery对象
                使用Hibernate的时候,调用底层SQL来实现,也支持写普通的SQL语句,但是用的不多
                实现的过程:
                    1、创建对象
                        SQLQuery
                    2、调用对象的方法实现过程
                        list()方法默认返回的是一个Object数组结构
                        解决方案:
                            1、调用SQLQuery里面的addEntity()将查询的内容与实体类绑定
                            2、调用Arrays.toString方法输出
    Hibernate配置一对一和多对多
        hibernate的一对多操作
            1、一对多映射配置
                以客户和联系人为例:
                1、创建两个实体类,客户和联系人的实体类
                2、让两个实体类之间相互表示
                    在客户实体类里面表示多个联系人
                    一个客户里面有多个联系人
                    在联系人里面表示所属客户
                    一个联系人只能属于一个客户
                hibernate要求使用集合表示多的数据,使用的是set集合
                3、配置映射的关系,有几个实体类写几个映射文件
                    把映射最基本的配置完成
                    在映射文件中,配置一对多的关系
                        在客户映射文件中,表示所有联系人
                        在联系人映射文件中,表示所属客户
                    Set标签的使用,name属性的属性值写在客户实体类里面表示联系人的set集合名称
                    一对多的建表,有外键,hibernate机制,双向维护外键,在一和多的一方都要配置外键
                    <key></key>中column属性值:外键的名称
                    <one-to-many />客户所有的联系人,class里面写联系人实体类的全路径
                    表示联系人所属的客户
                    <many-to-one>name属性:因为在联系人实体类中使用customer对象表示,写customer的名称
                        class属性:customer的全路径
                        column属性:外键名称
                4、创建核心的配置文件
                    关联两个映射文件
            2、一对多级联保存
                添加了一个客户,为这个客户添加了多个联系人
                实现过程:
                    1、添加一个客户,为这个客户添加一个联系人
                    复杂写法:
                        把联系人的对象放到客户的set集合里面
                        把客户对象放到联系人里面,包装类
                        保存到数据库
                    简化写法:
                        一般根据客户添加联系人
                            在客户的映射文件中进行配置
                            在客户映射文件里面有个set标签,在这个标签上进行配置
                            cascade属性:
                                save-update//级联保存
                            创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了
            3、一对多级联删除
                删除某一个客户,那么这个客户里面的所有联系人跟着一并删除
                需求:
                    删除某个客户,把客户里面所有的联系人都删除
                具体实现:
                    1、在客户的set标签中,使用cascade属性,属性名叫delete,在原有的基础上多加一个删除,可以用逗号分隔
                    2、在代码中直接删除客户
                        根据id查询,查询后调用delete方法删除
            4、inverse属性
                性能问题,更改了两次
                因为Hibernate是双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人的时候也修改一次外键
                解决方案:
                    让其中的一方不维护外键
                    一对多的里面,可以让其中一的那方放弃外键的维护
                    例子:
                        一个国家有总统,国家有很多人,总统不可能认识国家所有人,国家所有的人都认识总统
                    具体实现:
                        在放弃关系维护的映射文件中,进行配置,在set标签上使用inverse属性
                        inverse属性的默认值是false,false表示不放弃关系维护
                        如果要放弃关系维护的时候将值改成true
                        用inverse属性可以提高部分性能
      Hibernate的多对多操作:
     ![Hibernate多对多操作的建表关系](https://img.haomeiwen.com/i4857791/00756db3948d13c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        Hibernate的多对多操作
            1、多对多映射配置
                以用户和角色为例演示
                    1、创建实体类,用户和角色
                    2、让两个实体类之间相互表示
                        用户里面表示所有的角色,使用set集合
                        一个角色中有多个用户,使用set集合
                    3、配置映射的关系
                        基本配置
                        配置多对多的关系
                            在用户里面表示所有的角色,使用set标签
                            在角色里面表示所有的用户,使用set标签
                    4、在核心配置文件中引入映射的文件
            2、多对多级联保存(重点)
                根据用户保存角色
                1、第一步在用户配置文件中set标签里进行配置,在cascade值save-update
                2、创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了
            3、多对多级联删除
                1、在set标签上进行配置,cascade的值为delete
                2、删除用户
            4、维护第三张表
                用户和角色是一个多对多的关系,维护关系通过第三张表进行维护
                让某个用户有某个角色
                    1、根据id查询用户和角色
                    2、把角色放到用户里面
                        把角色放到用户set集合
                让某个用户没有某个角色
                    1、根据id查询用户和角色
                    2、从用户里面把角色移除
                        从set集合里面把角色移除
        表与表之间的关系回顾
            一对多
                通过外键建立关系
                要在多的那一方作为外键,指向一的那一方的主键
                按照关系配置Hibernate会自动给创建出表来
            多对多
                创建第三章表,至少有两个字段作为外键,指向两个表的主键
            一对一
    Hibernate的查询操作
        Hibernate查询的方式:
            1、对象导航查询
                根据id查询某个客户,再查询这个客户下的所有联系人
            2、OID查询
                根据id查询某一条记录,返回对象
            3、HQL查询
                Query对象,写hql语句实现查询
                普通的SQL操作的数据库表和字段,hql操作的是实体类和属性
            4、QBC查询
                Criteria对象
            5、本地SQL查询
                SQLQuery对象,使用普通的SQL进行查询
    Hibernate的检索策略分为两类:
        1、立即查询
            根据id查询,调用get方法,一般用get方法马上发送语句查询数据库
        2、延迟查询
            根据id查询,还有load方法,调用load方法不会马上发送语句查询数据库,只有得到对象里面的值时候才会发送语句查询数据库
            延迟查询分为两类:
                类级别延迟:
                    根据id查询返回实体类对象,调用load不会马上发送语句
                关联级别延迟:
                    查询出某个客户,再查询某个客户的联系人,查询客户的所有联系人过程的延迟
                    在set标签上使用属性
                        fetch:默认值为select
                        lazy:默认值是true表示延迟
                                false表示不延迟
                                extra表示及其延迟 要什么值给什么值,不要就不给
                关联查询遍历集合的时候首先要遍历list集合,接着遍历Set集合,造成的问题:
                    每次遍历Set集合的时候都要查询一次数据库,造成了效率低
                    优化方式:
                        在映射文件中set标签中,batch-size="",随便写一个整数值就行,数值越大效率越高
                        批量抓取:
                            应用场景:
                                查询所有客户,并且查询所有客户里的联系人
                                减少SQL语句的发送
    

    相关文章

      网友评论

          本文标题:有关Hibernate知识的学习(九)

          本文链接:https://www.haomeiwen.com/subject/fjwcfftx.html