Hibernate初出茅庐(一)

来源:互联网 发布:耳塞式耳机推荐 知乎 编辑:程序博客网 时间:2024/06/03 00:03
什么是Hibernate?

  1. 冬眠??ORM框架
  2. 是对JDBC进行轻量级的封装
  3. 在 逻辑层 和 持久层 增加一个持久层,处于项目的持久层。

Hibernate的好处?

  1. 对象化:解决“对象模型”与“关系模型”的阻抗问题(让程序员更关心业务流程,数据库更关心数据库)把关系数据库变成了Java对象,更加方便程序员的操作。
  2. 分层清晰,解耦性更小。
  3. 性能保证:Hibernate可以按不同的数据库处理不同的操作,切换数据库很方便,处理不同的操作使用的是最优化的sql语句,
  4. 对JDBC进行封装,增加程序的鲁棒性,不需要程序员对查询的数据进行封装。
Hibernate的原理:Java的反射机制

如何使用Hibernate?

  • 导入jar包 必须包 和 可选包 
  • 实体类(推荐命名规则:首字母大写,类名和数据库表名一样)
  • 配置对象关系映射文件(命名规则:Admin.hbm.xml)
    1. dtd
    2. hibernate-mapping(7个可选属性)
    3. class(21个可选属性,常用的class和table)
      id(name:给主键取名,id:数据库主键的id)
      主键生成策略:generator(12种生成策略)
      property 属性

  • hibernate.cfg.xml配置文件
session-factory
  1. datasource数据源
  2. 数据库方言:<property name=“dialect”><property/>
  3. <mapping>:指定管理的对象映射文件,有几个写几个
  • 操作Hibernate
1.加载解析Hibernate配置文件new Configuration)用户读取hibernate.cfg.xml配置文件并完成初始化。

2.构建sessionFactory (会话工厂,是一个重量级的对象,消耗内存,在实际开发中 保证只有一个)相当于JDBC中的DriverManager加载驱动

3.打开session (相当于jdbc中的connection)得到连接 

4.打开事务 开始一个事务, 

5.执行操作(增删改)查不用事务 持久化操作,this.session.sava(login);

6.提交事务:如果出现异常,执行事务回滚if(ts!=null){ts.rollback}

7.关闭session

如果出现异常,导入slf4j...logger,需要添加slf4j-nop-1.5.2.jar


如何和spring一起使用可以 extends HibernateDaoSupport









session接口的主要作用:
  1. 一个Session实例代表一个与数据库的一次操作,
  2. Session事例通过SessionFactory获取,用完需要关闭。
  3. Session是线程不安全的,不同步的,所以需要保证在同一个线程中使用,可以用getCurrentSession().
  4. Session可以看作是持久化管理器,他是与持久化操作相关的接口。



get与load的区别
  1. 如果查询不到数据,get会返回null,不会报错,load查询不到数据会报错,objectNotFound
  2. 使用get去查询数据,会立即向数据库发出查询请求,load即使查询到数据,返回的是一个代理对象,如果后面没有使用到数据,不会向数据库发出select查询请求,如果程序真正使用到查询结果,才会发出查询请求,这个现象我们成为懒加载。
  3. 通过配置文件,我们可以取消懒加载
  4. 如何选择使用哪一个:如果确定数据库中有你要查询的数据,用get,效率会高点。如果不确定有就用load。

load的查询顺序

ORM:对象关系映射

 

Hibernate实体对象的三种状态(数据的三种状态(对象的三种状态)):

一、瞬态:当程序退出后,数据不存在了,(内存中)

二、持久态:存储在介质中

三、游离态:对象不由session管理的时候

 

一张表一个映射文件,Per.hbm.xml 对应一个bean

 

 

使用

1.加载解析Hibernate配置文件

Configuratation cfg = new Configuration().configure();

2.//构建SessionFactory

SessionFactory sf=cfg.buildSessionFactory();

3.获得session 

Session session = sf.openSession();

 

Session使用getload方法的区别

Get获得对象,如果没有,返回nullload方法,如果不存在,报异常

 

使用Hibernate执行增删改的操作,需要使用事务(连接,事物等等打开关闭的东西,越晚打开越好,越早关闭越好。)

Hibernate增删改差

package com.tc.pojo;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration; public class HebernateTest { /** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub/** * 这一段是查询 */ //1.加载并解析Hibernate配置文件,Configuration cfg = new Configuration().configure();//2.构建SessionFactorySessionFactory sf = cfg.buildSessionFactory();//3.过的session 打开sessionSession session = sf.openSession(); ////根据id查询 返回实体bean//两种方法//Students stu=(Students)session.load(Students.class, 1);////Students stu=(Students)session.load(Students.class, 1);//System.out.println(stu.getUsername());//System.out.println(stu.getPassword());//session.close();/** * 增加操作 *///Students stu = new Students();//stu.setUsername("vv");//stu.setPassword("bb");////打开事务//Transaction tx=session.beginTransaction();//session.save(stu);////提交事务//tx.commit();////如果出现异常,tx.rollBack();//session.close();///**// * 删除操作// *///Students stu1=(Students)session.get(Students.class, 1);//Transaction tx=session.beginTransaction();//session.delete(stu1);//tx.commit();//session.close();///** * 修改操作 */Students stu2=(Students)session.get(Students.class, 3);Transaction tx1=session.beginTransaction();stu2.setUsername("aa");stu2.setPassword("AA"); session.update(stu2);tx1.commit();session.close();}}


 

使用Hibernate七步

1.配置hibernate.cfg.xml    :Hibernate.cfg.xml在sec目录下

2.在bean实体类里配置对应的*.hbm.xml文件

导入的jar包有

 

1.导入Hibernate支持的jar

Hibernate3.jar  和 lib/requried目录下的所有jar

2.添加jdbc驱动jar

3.编写Hibernate.cfg.xml文件

4.编写实体类映射文件


 

距离说明什么是对象持久化

  

第二节

 

关系映射

Student 

Class

 

主见生成策略

Uuid.hex:128算法,字符串

Sequenceoracle

Increment:自动增长(long short int

Identity:应用于数据库中带有自动增长功能的

Native hibernate

 

学生 多对一 班级 

 

单向一对多关联关系,

 

一方:

实体类:创建一个多的集合

 

映射文件 配置<set name=”实体类中set的名字” table=”关联的表”>

 

<key column=”关联表的字段”/>

<ont-to-many class=””

 

查询:把对应的多的集合查询出来

添加:使用集合操作

 

单向多对一关联关系

映射文件的两个属性:
cascade(级联)   和 inverse(控制反转)

 

属性值为none时 :所有操作都不关联,

All:所有操作都关联

Save-update:添加和更新的时候进行关联

Delete:删除的时候进行关联

 

 

控制反转:为ture时有对方负责管理关联关系

  为false时:该方为主动方,由主动方管理关联关系;

Lazy 懒惰 延迟加载:ture false proxy 

Ture 时 是延迟加载 反之不延迟加载

 

从这里开始韩老师教程笔记

  

一个数据库只有一个sessionFactory, 通常一个项目只用一个数据库,也就是一个项目只有一个sessionFactory,因为他是重量级的类(接口),消耗内存。

 

什么是单态    ????

Hibernate自动创建表 

在使用Hibernate切换数据库的时候除了修改配置文件以外还需要修改主键整成策略,一个有七种。

面试题:请列举出Hibernate常用的借口。

什么是pojo类,他有什么要求?

1.pojo类是和一张表对应的

2.有的程序员喜欢放在com.xxx.domain

3.pojo需要一个主键属性,(通常是id主键)用于标识一个pojo对象

4.除了主键以为还有其他的属性,如name age 权限为private

5.各供setget方法 和一个 无参的构造方法

6.pojo类就是一个javabean

 

SessionFactory过去session的两个方法的比较:

1.openSession 获取一个全新的session,使用完成后必须手动关闭。

2.getCurrentSession 获取和当前线程绑定的session,那么在同一个线程中,获取的session就是同一个session,这有利于事务的控制。事务提交后会自动关闭

在增删改查的时候,除了查询都需要做成事务。但是在使用getCurrentSession的时候查询也需要做成事务。而openSession不需要。

 

如何确定有没有关闭SessionFactory。可以通过netstat -an 命令查看。


希望以上资料能对大家有帮助 喜欢开发 关注开发 更多专注我的新浪微博 http://weibo.com/419768151