1.HelloWorld
cfg.xml配置文件,copy 改mysql,name password 、MySQLDirlect等。创建数据库和表,创建与表名同名的类,和对应的id name(配置文件,将实体类映射到数据库中的表 hbm.xml) 创建测试类,config session,getTransaction,commit。
MySQL图形化管理工具 Navicat for MySQL hbm2ddl update create
先建表再建类 powerdesigner
log4j日志环境 slf4j-log4f.api log4j.properties
Junit环境 添加junit jar包 新建source folder装测试用的代码(跟maven学的) 加@test
sessionFactory每次建立耗费时间,使用单例模式,建立辅助类,静态单例
Junit也可以用@beforeClass注解 @afterClass 来close
@column 字段名和属性名不一样、 @Table @Transient 透明人 @Temporal 时间精度 @Enumeration
xml方式生成ID:
①手动生成
②ID标签加 @Generator class="" native最常用,交给数据库自动识别(increament、identity、sequence)
还可以使用annotation @ID下面加@GeneratedValue @TableGenerator 表生成器,数据库可以跨平台,数据也能跨平台(区别去Aotu,不同平台生成数据不一样)
联合主键 ,建类 Serializable,序列号 做集群时候,宕机转移数据、虚拟内存。 annotation:@EmbeddedID
Hibernate核心开发接口(重点)
Configration,主要目的是产生SessionFactory,SessionFactory目标是为了产生Session openSession不管何时都会创建一个新Session(需要手动close),getCurrentSession如果有,会拿来用。(自动关闭)如果Commit,Session关闭,对象消失(界定事务边界)
例如在数据库日志的保存过程中,Log的保存(insert into)要和UserDAO的insert into在同一个Transaction里,就需要getCurrentSession.
事务:依赖于数据库的Connection事务(只针对于一个数据库),还有是JTA事务(分布式) 由applicationServer提供,Tomcat不具备功能,需结合spring
JTA:Java Transaction Api JPA:Java Persistence Api
SAVE的三种状态:a)transient:内存中有一个对象,没ID,缓存中也没有
b)persistent:内存中有,缓存有,数据库有(ID)
c)detached:内存中有,缓存中没有,数据库有(ID)
关系映射(重点)
一对一:@oneToOne PowerDesigner连接JDBC,要在环境变量里设置一个CLASSPATH,变量值为mysql jar文件 @JoinColumn 指定外键名 @mappedBy(双向关联必设 对方那里是主导)
联合主键:@IdClass (可以不写 ,联合的上面加@ID) 组件映射:一个类其中的一个属性指向了另外一个对象 @Embedded
多对一单向关联:多的一方加外键,小心 person name(冗余) 类似dream里加属于某人 才是正确的 @ManyToOne
一对多单向关联:@OneToMany 默认当成多对多的一种特殊情况对待,要加一个@JoinColumn,不然会创建 一张中间表 ;Set
一对多 多对一双向单向:多对一、一对多的结合。@OneToMany加mappedBy
多对多单向:老师和学生,加一张中间表 @ManyToMany 改生成中间表的名字@JoinTable
@JoinTable(name="t_s" ,
joinColumns={@JoinColumn(name="teacher_id")} , //指定中间表的属性名
inverseJoinColumns={@JoinColunmn(name="student_id") } ) //对方那张表外键的ID
多对多双向(相当少用):
在关联关系中写CRUD: 双向关系在程序中要设定双向关联
多对多双向: cascade={}产生级联 ALL PERSIST REMOVE 多的一方容易操作
继承映射???
fetchType默认eager 可以改成lazy
多对一设eager 一对多设lazy;eager是全部取出来,lazy是到用的时候采取(设置用户权限的时候用) 树状结构 缓存,也用lazy
JPA编程接口
如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,
该记录就会变成垃圾数据
树状映射:在同一类中使用One2Many和Many2One
student_course_score设计:①实体类(表)②导航(编程方便) ③确立编程方式
NativeSQL>HQL>EJBQL>QBC(query by criteria)>QBE(query by example)
EJBQL是HQL的一个子集:Query q = session.createQuery("from Category"); //类名
List
返回值是query,可以使用链式编程
分页:oracle:三层select嵌套、mysql:limit hibernate:q.setMaxResult(4); q.setFirstResult(2);
QL应该和导航关系结合,共同为查询提供服务
VO/DTO Value Object /Date Transfer Object用来传值得对象。例如在登录过程中,有个username 有个password p1、p2,可以用一个VO把这几个东西装起来,然后交给后台处理,验证P1 P2是否相等,再把它转成user对象,再存入DB
exists比in的执行效率高,用exists
QBC: 面向对象的写法而不是QL语言 Criteria
Restrictions.gt("id",2) greater than id>2
性能优化:
1、注意session.clear()的运用 Java的内存泄漏:语法级别没有,但是连接、连接池的关闭,文件的关闭
3、list和iterate list全部都拿,iterate只拿id
4、一级缓存、二级缓存和查询缓存(面试题):
一级缓存:session级别
二级缓存:sessionFactory级别,可以跨越session存在;经常被访问、改动不大 不会经常改动、数量有限(例如:用户的权限)@cache load默认使用二级缓存、iterate默认使用二级缓存。 查询缓存:只有在查询重复的时候才用,依赖于二级缓存
缓存算法:LRU、LFU、FIFO (纯应付面试)
Least Recently Used Least Frequently Used First In First Out
事务的并发处理(面试意义大于实际工作意义)
一、事务的四个特性:ACID(谁要问这就是酸到家了)
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
脏读 dirty read(读了别的事务没有提交的数据,脏数据)、不可重复读(同一个事务里对同一个数据前后读两次结果不一样,被另一个事务影响)、幻读 (在读的过程中,另外一个事务往里查了一条新数据,影响了结果)
隔离机制,解决并发,设置隔离级别,每种数据库不一样。 readcommitted 2级会出现non repitable问题,所以使用乐观/悲观锁
乐观锁,悲观锁。悲观锁使用数据库的锁,乐观锁使用版本