有关Hibernate知识的学习(九)

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多对多操作的建表关系](http://upload-images.jianshu.io/upload_images/4857791-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语句的发送
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容