- 浏览: 440956 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (162)
- easymock (3)
- 模板引擎 (3)
- JForum (4)
- web (9)
- spring (10)
- java (20)
- struts (9)
- uml (3)
- java pattern (19)
- JQuery (14)
- 多线程 (13)
- database (21)
- PS (3)
- ejb (6)
- 版本管理 svn , maven , ant (2)
- protocol (1)
- 测试 (1)
- ws (7)
- Apache (4)
- 脚本语言 (1)
- guice (1)
- 分布式 (4)
- 架构 (0)
- 经验 (1)
- 版本管理 svn (1)
- maven (1)
- ant (1)
- 书籍 (1)
- Linux (1)
最新评论
-
Master-Gao:
稍微明白了点,,有点萌萌哒
为什么匿名内部类参数必须为final类型 -
waw0931:
终于明白了,谢谢!
为什么匿名内部类参数必须为final类型 -
十三圆桌骑士:
提供了两个链接还是有用的。
安装Mondrian -
放方芳:
[flash=200,200][/flash]
Freemarker标签使用 -
放方芳:
[b][/b]
Freemarker标签使用
实体类的编写规则
l 实体类必须具备无参构造方法
l 实体类必须具备数据库标识
l 通常选用无业务意义的逻辑主键作为数据库标识,通常是int/long/String类型
l 通常由Hibernate来自动生成数据库标识值
n 比较常见的策略包括:
u Int/long或short类型:identity,sequence,hilo,native
u String类型:uuid
u 手工分配:assigned
u 一对一关联映射中使用:foreign
Session对实体对象的管理
l 瞬时对象是没有数据库标识,没有被任何session所管理,数据库没有对应的记录的对象
l 持久化对象是被某个session管理,而且必定拥有数据库标识,在数据库中有对应的记录
l 离线对象是拥有数据库标识,没有被session所管理的对象,而且在数据库中也有对应的记录
l Save方法用于将一个实体对象从瞬时状态转换为持久化状态
l Update方法用于将一个实体对象从离线状态转换为持久化状态
l saveOrUpdate方法由Hibernate自动判断
n 如果对象处于离线状态(拥有数据库标识),将自动执行update操作
n 如果对象处于瞬时状态(无数据库标识值),将自动执行save操作
l Flush方法用于将内存中由session管理的持久化对象的状态强制同步到数据库(发出insert/update/delete语句)
l Evict方法用于将一个持久化对象转换为离线对象
l Clear方法用于将session中所管理的所有持久化对象转换为离线对象
l Merge方法用于把一个离线对象的属性值拷贝到跟它相对应的持久化对象中
l Hibernate会尽可能的延迟SQL语句的发出(insert/update/delete/select)
l 同一个session中,不允许存在两个以上具有相同数据库标识的同种类型的实体对象
l 处于持久化状态的对象,不允许引用到一个瞬时对象
l 懒加载策略只在session打开期间有效(即只对处于持久化状态的实体对象有效),如果尝试获得一个离线对象中尚未被加载的属性,将会抛出懒加载异常!
关联映射
l 关于equals和hashcode方法
n 如果需要对集合中的实体对象进行管理,需要重写equals和hashcode方法
n 重写这两个方法的时候,如果数据库标识是自动生成的(非assigned策略),最好不要根据数据库标识来重写!
n 最好是根据实体类中具备如下特征的属性来生成equals和hashcode方法
u 非空
u 唯一
l 在一对多双向关联中,通常设置“一”的一端inverse=”true”(这意味着我们通常在“多”的一端维护关联)
n Inverse属性只用于双向关联
n 而且只能设置在“一”的一端(在“多”的一端根本没有inverse属性),换句话来说,在多的一端,永远都是可以维护关联的
l 在一对多双向关联中,其外键字段名请保持一致
l 在Hibernate中,实体类的集合类型请使用接口定义(如:Set、List、Map),而不要使用具体的实现类型(如:HashSet、ArrayList、HashMap)
l 多对多关联通常会拆分成两个多对一关联
l 单表继承映射的限制
n 子类型的属性不能定义为not-null=”true”
l 具体类表继承(union-subclass)映射策略的限制
n 不能使用identity生成策略!
HQL查询
l HQL是面向对象的查询语句,在HQL语句中,使用类名、属性名来进行查询(而不是表名、字段名)
l 注意HQL语句的大小写敏感性
n 类名和属性名是大小写敏感的,其它字符(比如关键字:select/from/where/order by group by等)是大小写不敏感的
l 用?来表示索引参数,给参数赋值时,从第0个索引开始赋值
l 用“:参数名称”的方式,在HQL语句中,定义命名参数,赋值时,直接按照名称赋值
l 空值查询,建议使用is null来判断空值
l 可以使用集合(或数组)作为参数传给HQL语句,注意使用setParameterList方法
n 集合(或数组)不能为null或empty
l 传递的参数类型必须与属性的数据类型匹配
l 在HQL语句中,不能使用select* from ... 这样的语法!
l 投影查询(查询部分属性)
n 如果查询多个属性,则返回的List中的元素是Object[]数组类型
n 如果查询单个属性,则返回的List中的元素是这个属性对应的类型
l SQL语法中的统计函数可以在HQL语句中直接使用
l 假如查询的结果集至多只有一条记录,则可以调用Query中的uniqueResult方法直接把对象取出
l 可以将查询结果集转换为各种不同类型的对象
n 转换为一个实体类(注意,需定义相应的构造方法)
u 比如:select new Person(p.id,p.name,p.address) from Person p
n 转换为其它类型的VO对象(注意,使用全路径类名,并定义相应的构造方法)
u 比如:select new cn.com.leadfar.vo.PersonVO(p.id,p.name) from Person p
n 转换为Map类型(每个Map对象就代表了一条记录,属性的别名作为Map对象中的key,属性的值就是相对应的值)
u 比如:select new map(p.id as pid,p.name as pname) from Person p
n 转换为List类型
u 比如:select new list(p.id,p.name) from Person p
l 多态查询
n 在HQL语句中,直接通过基类型的名称,可以把所有属于此基类型的对象查出
n 也可以通过接口或抽象类来进行查询
l 分页查询
n Query.setFirstResult 从第几条记录开始查询
n Query.setMaxResults 最大返回几条记录
l Query.iterate()方法
n 如果查询的是实体对象,Hibernate会先发一条语句查询ID列表,当迭代访问其中的实体对象时,Hibernate再次根据ID逐个发出SQL语句查询实体对象(N+1查询问题)
n 如果查询的不是实体对象(比如:select p.id,p.name from Person p这样的查询语句,其返回的结果对象不是实体对象),则不存在N+1查询的问题
l Query.scroll()方法,返回ScrollableResults,利用数据库游标的支持进行查询
l 条件查询:如果利用Example对象,构建查询条件更加方便
l 连接查询
n 内连接查询
u 显式内连接查询:在查询语句中使用join关键字
u 隐式内连接查询:在查询语句中不使用join关键字,而是使用对象导航的方式进行查询
n 外连接查询
u 左外连接查询:除了把满足连接条件的数据查询出来之外,还会把左表的所有数据都查询出来
u 右外连接查询:除了把满足连接条件的数据查询出来之外,还会把右表的所有数据都查询出来
缓存策略
l 一级缓存
n 一级缓存是Hibernate内置的缓存策略,不可以取消,但可以对它进行管理
n 一级缓存是session级别的缓存,随着session的关闭而消失
n 一级缓存所缓存的数据是实体对象
u 通过get/load方法加载的实体对象必定会被放到一级缓存中
u 通过HQL语句等查询出来的实体对象也会被放到一级缓存中
n 一级缓存中的实体对象实际上就是处于持久化状态的实体对象!
l 一级缓存的管理
n Save/update/get/load等操作导致对象被加入到一级缓存中
n Flush操作导致把内存中(即一级缓存中)对象的状态同步到数据库
n Refresh操作导致把数据库中相应的记录同步到内存中(即一级缓存中)!
n Evict/clear操作可以把一级缓存中的对象移出一级缓存,从而变为离线对象
l 二级缓存
n 二级缓存需要启用,并指定缓存策略提供商
n 二级缓存由SessionFactory管理,不会随着session的关闭而消失
l 查询缓存
n 查询缓存也需要启用,并指定缓存策略提供商(和二级缓存使用相同的策略提供商)
n 在查询之前,需要调用Query.setCachable(true)来使用二级缓存!
抓取策略
l 基本概念
n 什么叫抓取策略?即加载某个实体对象,如何得到其关联对象的策略!
n 什么叫批量抓取?即查询到一批实体对象,想要得到这批对象的关联对象!
l 单端关联(many-to-one)上设置fetch
n fetch="select",查询抓取,这是缺省值,意思是加载了某个实体对象,想要得到其关联对象的时候,Hibernate会发出第二条查询语句
n fetch="join",连接抓取,意思是在加载(load或get)某个实体对象的同时,通过left outer join的SQL语句这种方式同时加载其关联对象,在本项目的实例中,表示在加载Person对象的同时,其关联的Group对象(如果有的话)就已经被加载了,所以,在many-to-one上定义的lazy将失效!!!即关联对象不再延迟加载。
l 单端关联(many-to-one)的批量抓取
n 查询到了一批实体对象,想要得到这批对象的单端关联对象的时候,如果这些关联对象尚未被加载,Hibernate会发出第二条查询语句来查询其关联对象,这样,发出的查询语句可能会比较多。我们可以设置batch-size,提高这些关联对象的批量抓取性能,可以在对方的class映射配置上配置batch-size,Hibenate将自动根据这个值,批量抓取关联对象!
l 集合关联上设置fetch
n fetch="select",查询抓取,这是缺省值,意思是加载了某个实体对象,想要得到其关联对象(存放在一个集合中)的时候,Hibernate会发出第二条查询语句
n fetch=”join”,连接抓取,意思是在加载(load或get)某个实体对象的同时,通过left outer join的SQL语句这种方式同时加载其关联对象(存放在一个集合中),lazy机制在这种情况下将失效!
l 集合关联的批量抓取
n 查询到了一批实体对象,想要得到这批对象的关联对象(存放在一个集合中)的时候,如果这些关联对象尚未被加载,Hibernate会发出其它查询语句来查询其关联对象,那么Hibernate会发出什么样的查询语句来查询这些关联对象呢?
u 如果在集合上设置fetch=”select”
l Hibernate将会通过第二条查询语句逐个查询其关联对象
u 如果在集合上设置fetch=”select”和batch-size
l Hibernate将会通过若干条批量查询语句查询其关联对象
u 如果在集合上设置fetch=”subselect”
l Hibernate将会通过唯一一条查询语句(这条查询语句包含一条子查询语句)查询这批实体对象的关联对象,这条子查询语句,是根据查询实体对象的查询语句来生成的!
l 【注意:设置了fetch=”join”之后,关联上的懒加载策略将失效】
其它
l Version用于乐观锁定策略
l 适当调整hibernate.jdbc.batch_size和hibernate.jdbc.fetch_size参数,可以极大提高大批量数据处理的性能
发表评论
-
安装Mondrian
2014-04-11 10:48 4620Mondrian and OLAP Mondrian i ... -
NoSql 笔记
2014-02-18 17:39 742看了一些关于NoSql的文 ... -
mysql explain用法
2014-02-14 11:53 915补充一点: id 就是 sql 语句中 select 出现 ... -
数据库范式概念解析(第一范式,第二范式,第三范式)
2013-02-26 10:17 1100大部分数据库从业人员 ... -
ORACLE数据库基础知识
2013-02-23 11:39 856http://wenku.baidu.com/view/958 ... -
Oracle 的性能优化概述
2013-02-23 11:34 1043Oracle 的性能优化概 ... -
mysql 索引
2013-02-23 11:33 947索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一 ... -
Hibernate 关联关系映射(Association Relationship Mapping)
2012-12-17 18:55 950一对一主键关联 数据表为:夫妻表 POJO 为 ... -
关系型数据库性能优化总结(转)
2012-06-13 14:17 827关系型数据库性能优化 ... -
spring+hibernate架构中Dao访问数据库的几种方法
2011-11-28 18:10 1397spring+hibernate架构中Dao访问数据库的几种方 ... -
mybatis 缓存(二)
2011-10-20 13:05 5336缓存不适合情况:select ... -
mybatis 缓存(一)
2011-10-20 11:27 1252缓存概述 http://www.iteye.com/topi ... -
mybatis 基本
2011-10-20 11:14 1452今天刚听说iBATIS改名为MyBatis,实际上就是iBAT ... -
hibernate 延迟加载(一)
2011-10-12 10:03 939首先是第一个误区:延迟加载只能作用于关联实体 看到这个是不 ... -
mybatis 多对多 处理
2011-09-26 18:41 42031下面的例子让新手看 ... -
MyBatis+Spring基于接口编程的原理分析
2011-09-17 15:57 3415整合Spring3及MyBatis3 对于整合Sprin ... -
解释 关闭statement 和rs
2010-09-19 13:14 2322很多朋友在Java开发中, ... -
HIBERNATE
2010-07-30 11:51 859使用java进行项目开发也有不少年头了,应用从网站到金融产品到 ... -
Oracle嵌套表和数组的使用(省去了连接查询)
2010-07-27 17:18 2273Oracle嵌套表的使用 1. 创建对象类型 create ... -
延迟加载
2010-07-11 14:04 1314could not initialize proxy - no ...
相关推荐
python自学教程-04-自定义JavaScript.ev4.rar
严蔚敏数据结构全套C语言实现
Java_Android的可扩展媒体播放器
源代码-DBAdmin 在线Access数据库管理程序 v2.3.zip
Apache Dubbo的java实现RPC和微服务框架
ubuntu20.04下编译mysql驱动项目源码,编译项目驱动后拷贝到对应位置 scp libqsqlmysql.so /home/pc/Qt5.14.2/Tools/QtCreator/lib/Qt/plugins/sqldrivers scp libqsqlmysql.so /home/pc/Qt5.14.2/5.14.2/gcc_64/plugins/sqldrivers sudo scp libqsqlmysql.so /usr/lib/x86_64-linux-gnu
数据分析是一个复杂而系统的过程
我么采用几个黄磊经重新生成萨沙时常
startup_stm32f10系列的startup_stm32f10x_cl.s startup_stm32f10x_hd.s startup_stm32f10x_hd_vl.s startup_stm32f10x_ld.s startup_stm32f10x_ld_vl.s startup_stm32f10x_md.s startup_stm32f10x_md_vl.s startup_stm32f10x_xl.s
本项目是课程设计课程实验的demo,内含源码和说明书,可以自己修改
本项目是课程设计课程实验的demo,内含源码和说明书,可以自己修改
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
麦肯锡图表绘制培训.pptx
内容概要:资料包括6门线上视频课程,有TypeScript 类型体操通关秘籍与TypeScript全面进阶指南、Vue3+React18+TS4入门到实战系统学习、前端实战训练营、前端架构师、以及两门知名教育机构线下就业班视频。 适用人群:想从事前端开发的大学学生、转行it的从业者、提高自己前端开发技能的从业者以及进阶架构师的程序员。 使用场景及目标:线上视频教程,目标是学习前端知识以及掌握最新前端技术。 其他:由于视频文件内存过大,文件为网盘链接,下载后复制到网盘获取即可,如有疑问可联系客服,谢谢。
javaee/javaweb常用jar包,亲测可用,导入到java工程中即可使用
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。