hibernate
是什么:轻量级JAVAee应用的持久层解决方案。
1,javabean:遵守JAVAbean规范编写的java类:(java类是public的类 属性私有的 有getset方法 瞒住序列化)。编写javabean的目的是为web容器提供可重用的组件,用于封装表现层页面数据的显示。
2,ejb:在企业应用中,需要可伸缩的性能和事物,安全机制,这样才能保证企业级应用的需求,ejb就是在javabean规范的基础上提出的更高的要求,它比javabean更复杂,功能更强大,它是javaee的核心技术。
3,pojo(简单的java对象):在企业级应用中发现使用ejb异常繁琐和复杂,于是提出pojo的概念,目的是为了避免和ejb混淆所创建的简称,它比javabean和ejb更纯粹和简单。只有属性和getset方法,只能用于封装数据,作为数据存储的载体。
4,entity(实体类):他是用于必须存储信息和行为建模的类,一般与数据库表相对应,需要注意的是实体类设计三层架构的每一层。
po(持久化对象,能保存在数据库中的对象)=pojo+xml 映射文件
ThreadLocal(唯一资源时候不能用)
他不是一个线程,而是线程的一个本地化对象,当线程中的对象使用threadLocal维护变量时,threadLocal 为了每一个使用该变量的线程分配一个独立的变量副本,所以每一个线程都可以独立的使用自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,这个变量就像是线程的本地变量
ThreadLocal与线程同步机制比较
1,ThreadLocal 是另一个角度来解决多线程并发访问。它为每个线程提供了一个独立的变量副本,从而也就没有必要对该变量进行同步了,它提供了线程安全的对象封装,在编写多线程代码时。可以吧不安全的变量封装进ThreadLocal。
对于多线程资源共享的问题,
线程同步机制采用了以:时间换空间的方式,即访问串行化,对象共享化:。
而ThreadLocal采用 :以空间换时间既 访问并行化对象对象化:
hibernate 持久化对象状态
1,瞬态 :对象由new操作创建的,没有与session 有关联方法 瞬态对象不会被持久化到数据库。
2,持久化状态: 持久化实例在数据库中有对应的记录,并拥有一个持久化标识。持久化对象必须指定session关联,不用手动更新数据库
3,脱管状态 :某个实例曾今处于持久化状态,但随之与关联的session被关闭了,该对象就变成了脱管状态,脱管对象的应用依然有效,对象可以继续修改,如果重新连接session ,该对象将重新转换为持久化状态,而托管状态期间改动也被写入数据库。
瞬态转化为持久化对象 save():(有返回值返回主键) persist():(没有返回值) 当两个参数时代表增加主键。
持久化操作 查询数据方法:load(延时加载:用的时候才会去真的去取)没有查询到有记录就会抛异常 get(没有延时加载)没查到记录就会返回null
脱管状态转为持久化状态 update()(脱管状态时候) updateOrSave()(不知道是否是脱管状态时候) merge()(只是将数据同步,还是脱管状态:游戏存档)lock()()
持久化转为瞬态 删除数据 delete()对象还在
关联映射: 单向关联:只需要单向访问关联1,单向一对一,单向一对多,单向多对一,单向多对多
单向多对一:公交车和人,班级和学生。
双向关联:关联的两端可以互相访问1,双向一对一,双向一对多,双向多对多
性能优化:对于一对多关联,最好使用双向关联,以减少生成sql语句数量提高性能。
级联默认不开启属性对应session中的持久化操作。all代表开启所有级联none表示不开启
hibernate HQl查询:
hql是一种面向对象的查询语言。
sql的操作对象是*数据表*,列和记录。
hql的操作对象是*类*,*实例*和*属性*。
1,from子句:
最简单的hql语句,后面紧跟持久化类的类名。
hql语句本身不区分大小写,但是hql语句中所使用的包名,类名,实例名,属性名,都要区分大小写。
2,select子句:
select子句用于选择持久化类的实例或者持久化类指定的属性。
3,where子句:
用于缩小范围,筛选选中的结果
预处理:hql两种占位符1,英文问号(?)2,使用冒号+名字(:name)
query有两个方法支持查询实现分页;
setFirstResult(int firstResult):设置返回的结果集从第几条记录开始
setMaxResults(int maxResults)设置本条查询结果集的数量
4,聚集函数
常用的count max
5,连表查询
1,隐是关联查询:不用join关键字,使用英文点(.)来隐是
2,显示关联查询:使用join关键字 使用显示连接是,还可以用with关键字来提供额外的连接条件,作用相当于sql中的on用于指定连接条件
fetch关键字:持久化类有集合属性的情况,hibernate 默认采用延时加载策略,默认不加载集合属性。如果session 被关闭,持久化类实例将无法访问关联的集合属性。解决方法(1,通过配置指定lazy=“false”关闭延时加载,2,通过fetch关键字抓取持久化类的集合属性,放在join后面)
hibernate 条件查询:
hibernate SQL查询:
1,用于旧的项目移植到hibernate应用上
2,用于HQL无法支持的某些数据库的特性上
一般只有在hql不能查询的时候才使用
addEntity()将查询到的记录与特性的实体关联
addScalar()将查询的记录关联成标量
hibernate悲观锁,乐观锁
数据库的并发性:指的是多个事物可以同时访问数据库中的数据。而当多个事物在数据库中并发是执行,数据库的一致性可以能受到破坏,从而导致数据出现问题。
悲观锁:既某个事物在更新数据的过程中将数据锁定,其他任何事物都不能读取或者修改,必须修改完成后才能访问数据库(类似线程同步机制)
特点:具有排他性,依赖于数据库的机制。
使用场景:短时间处理事务。
使用:在hibernate中使用load()方法
注意:如果使用了悲观锁延时加载就取消了
乐观锁:乐观锁并不是一种锁机制,而是一种冲突检测机制。
特点:并发性较好,事物修改数据是,其他事物任可以修改数据。
使用:常用版本方式。
hibernate性能优化:
1,批处理:手动用flush()+clear()
2,批量更新、删除
3,延时加载:分类:对象的延时加载。对象里的属性延时加载(配置中或者语句中join fetch)。集合延时加载
4,二级缓存,适用的地方(很少别修改的数据,不是很重要的数据,允许出现偶尔的并发的数据,很多模块都要用到的数据,共享数据)