Hibernate笔记--1

​1.Hibernate框架简介

  • Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具
    • 理解持久化
      • 瞬时状态:
在程序运行的时候,有些程序数据保存在内存中,当程序退出后,这些数据就不复存在了,所以,我们称这些数据的状态为瞬时的
  • 持久化状态:
在使用一些软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘中,那么我们称这些数据的状态时持久的
  • 持久化:
持久化就是将程序中的数据在瞬时状态和持久状态之间转换的机制
    • ORM
      • 对象-关系映射(ORM)
能在对象和关系型数据库两者间进行数据转换的机制,处理数据时使用面向对象编程方法,存储数据的时候使用关系型数据库方法.
Hibernate是一个优秀的Java持久化层解决方案,是当今主流对象-关系映射(ORM,ObjectRelationalMapping)工具
Hibernate框架对JDBC进行了封装,简化了数据访问层


2.Hibernate配置

  • Hibernate框架下载
    • hibernate-distribution-3.3.2.GA-dist.zip
    • commons-lang-2.3.jar
    • slf4j-api-1.5.8.jar
    • log4j-1.2.16.jar
    • ojdbc14.jar
  • Hibernate配置文件配置
    • hibernate.cfg.xml文件
  • 添加可持久化类及映射配置文件
    • long.hbm.xml

    • 在hibernate.cfg.xml中添加映射文件的声明

  • 创建hibernate连接工具类
    • hibernate主要接口和类
      • Configuration
      • SessionFactory:DriverManager(Java)
      • Session:Connection(Java)
      • Transaction
      • Query:Statement和PreparedStatement(Java)
  • 通过Hibernate实现增删改查功能(持久化操作),步骤如下:
读取解析配置文件
Configuration config=new Configuration().configure();
读取并解析映射信息,创建SessionFactory
SessionFactory factory=config.buildSessionFactory();
打开session
this.session=factory.openSession();
开始一个事务(增删改操作必须,查询操作可选)
tran=this.session.beginTransaction();
持久化操作
this.session.save(login);
提交事务
tran.commit();
关闭session this.session.close();
  •    通过Hibernate实现修改功能
  public void update(Login login){
        tran=this.session.beginTransaction();
        this.session.update(login);
        tran.commit();
        System.out.println("用户信息修改成功!");
        this.session.close();
    }
  •   通过Hibernate实现删除功能
  public void delete(Login login){
        tran=this.session.beginTransaction();
        this.session.delete(login);
        tran.commit();
        System.out.println("用户信息删除成功!");
        this.session.close();
    }
  •   通过Hibernate实现主键查询功能
       public Login queryById(String name){
        Login login=null;
        String hql="From Login AS l WHERE l.username=? ";
        Query query=this.session.createQuery(hql);
        Iterator<E> iter=query.list().iterator();
        if(iter.hasNext()){
            login=(Login)iter.next();
        }
        System.out.println("主键精确查询:");
        this.session.close();
        return login;
    }
  • 通过Hibernate实现查询所有记录功能
  public List queryAll(String name){
        List list=null;
        String hql="FROM Login as l";
        Query query=this.session.createQuery(hql);
        list=query.list();
        System.out.println("查询所有记录:");;
        this.session.close();
        return list;

    }
  • 通过Hibernate实现模糊查询功能
  public List queryLike(String name){
        List list=null;
        String hql="FROM Login as l WHERE l.username like ?";
        Query query=this.session.createQuery(hql);
        query.setString(0,"%"+name+"%");
        list=query.list();
        System.out.println("模糊查询:");;
        this.session.close();
        return list;

    }
   
  • 体系结构
    • SessionFactory:
属于单一数据库的编译过的映射文件的一个线程安全的不可变的缓存快照.Session的工厂.
    • 会话,Session:
单线程,声明期短促的对象,代表应用程序和持久化层之间的一次对话.封装了一个JDBC连接
    • 持久化对象(Persistent Object)及其集合(Collection):
生命短促的单线程对象,包括了持久化状态和商业功能.普通的JavaBean/POJOs.
    • 临时对象(Transient Object)及其集合(Collection):
目前没有从属于一个Session的持久化类的实例
    • 事务,Transaction:
(可选)单线程,生命期短促的对象,应用程序用它来表示一批工作的原子操作.是底层的JDBC,JTA或者CORBA事务的抽象.
    • ConnectionProvider:
(可选)JDBC连接的工厂和池.从底层的Datasource或者DriverManager抽象而来
    • TransactionFactory:
(可选)事务实例的工厂

  

3.Hibernate O/R映射

  • Hibernate基本数据类型
  • 实体映射
    • 在Hibernate中的对象关系映射就是把实体类与数据库中的表相对应,实现实体类中的属性与数据库中的字段一一对应
Java数据类型
Hibernate数据类型
byte、java.long.Byte
byte
short、java.lang.Short
short
int、java.lang.Integer
integer
long、java.lang.Float
float
double、java.lang.Double double
java.math.BigDecimal big_decimal
char、java.lang.Character character
boolean、java.lang.Boolean boolean
String、java.lang.String
string
boolean、java.lang.Boolean yes_no
boolean、java.lang.Boolean true_false
java.util.Date、java.sql.Date date
java.util.Date、java.sql.Time time
java.util.Date、java.sql.Timestamp timestamp
java.util.Calendar calendar
byte[] binary
java.lang.String text
java.io.Serializable serializable
java.sql.Clob clob
java.sql.Blob blob
java.util.Class class
java.util.Locale locale
java.util.TimeZone timezong
java.util.Currency currency
    • 映射是按照持久化类的定义来创建的,而非表的的定义 
    • 映射文件配置--Login.hbm.xml


   

    
   3.使用Hibernate 

  • 基础语义
    • Configuration
      1. 数据库URL
      2. 数据库用户
      3. 数据库用户密码
      4. 数据库JDBC驱动类
      5. 数据库dialect,用于特定数据库提供支持,其中包含了针对特定数据库特性的实现



    • SessionFactory
      • SessionFactory负责创建Session实例,根据当前配置信息创建,配置文件的改变不影响已创建的SessionFactory,除非再创建新的SessionFactory

    •  Session
      • 相当于JDBC中的Connection,通过SessionFactory创建

    • 通过调用Session所提供的save,find,flush等方法完成持久层操作
 
  •  事务管理
    • Hibernate是JDBC的轻量级封装,本身不具备事务管理能力
    • Hibernate将事务管理委托给底层的JDBC或者JTA
    • 基于JDBC的事务管理
 
    • 基于JTA的事务管理
      •  JTA提供了跨Session的事务管理能力
      •  JTA事务管理则由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度
      •  JTA的事务周期可横跨多个JDBC Connection生命周期
      •  JTA事务是由JTA Container维护,而参与事务的Connection无需对事务进行干涉

    • 锁机制
      •  悲观锁(Pessimistic Locking)
        • LockMode.NONE:无锁机制
        • LockMode.RWRITE:Hibernate在Insert和Update记录的时候会自动获取
        • LockMode.READ:Hibernate在读取记录的时候会自动获取
        • LockMode.UPGRADE:利用数据库的for update子句加锁
        • LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现功能
        • Criteria.setLockMode
        • Query.setLockMode
        • Session.lock
      • 加锁实现方式:
        • Criteria.setLockMode()
        • Query.setLockMode()
        • Session.lock()

    •  乐观锁(Optimistic Locking)
      • 采取了比悲观锁更宽松的加锁机制
      • 大多是基于数据库版本(Version)记录机制实现,而悲观锁则是倚靠数据库的锁机制实现,以保证最大程度的独占性
      • 避免了长事务中的数据库加锁开销
      • 往往基于系统中的数据存储逻辑,有一定的局限性
      • Hibernate的数据访问殷勤重内置了乐观锁实现

ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他事务操作 6:exclusive 专用(X):独立访问使用 数字越大锁级别越高, 影响的操作越多。 一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。 select ... from ... for update; 是2的锁。 当对话使用for update子串打开一个游标时, 所有返回集中的数据行都将处于行级(Row-X)独占式锁定, 其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。 insert / update / delete ... ; 是3的锁。 没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。 创建索引的时候也会产生3,4级别的锁。 locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。 有主外键约束时 update / delete ... ; 可能会产生4,5的锁。 DDL语句时是6的锁。 以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句: select object_id,session_id,locked_mode from v$locked_object; select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; 如果有长期出现的一列,可能是没有释放的锁。 我们可以用下面SQL语句杀掉长期没有释放非正常的锁: alter system kill session 'sid,serial#'; 如果出现了锁的问题, 某个DML操作可能等待很久没有反应。 当你采用的是直接连接数据库的方式, 也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接, 因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。 记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值