Hibernate框架大致用法

持久化层

Hibernate框架

Hibernate是一款工作在持久化层的大型、开源、免费的ORM框架
优点:
      1,将对数据库的操作转换为对Java对象的操作,从而简化开发。通过修改一个“持久化”对象的属性从而修改数据库表中对应的记录数据。通过操作对象达到数据库的目的
      2,提供线程和进程两个级别的缓存提升应用程序性能。缓存:查询出来数据之后在缓存中进行保存,下次查询相同数据直接从缓存中读取,减少数据库操作
      3,有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系
      4,屏蔽不同数据库实现之间的差异。在Hibernate中只需要通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句。 例如:MySQL分页:LIMIT    Oracle分页:ROWNUM
​
常见英语单词:
    OID——Object ID:特指Java对象中与数据库表的主键相对应的一个属性
    ORM:1,概念:Object/Relationship Mapping,对象关系映射
        2,对象:Java程序中用于封装业务数据的对象。通常称为实体类(Entity),以JavaBean(POJO)技术实现。                 例如:Book 、User、Person等等这样的类的对象。
        3,关系:关系型数据库,目前主流的数据库都是关系型的。 
        4,映射:建立从“对象”到“关系型数据库”之间的对应关系。
        简单的说:使用一个pojo类表示一张表的结构,这个动作就是映射。
        类——表    属性——字段  对象——记录
Hibernate中重要api:
        Session 代表Hibernate应用程序和数据库之间的一次会话,作用相当于JDBC中的Connection。其中封装               了操作一系列方法操作数据库并包含缓存功能
        SessionFactory 用于创建Session对象的工厂类。
                特点
                1,SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。
                2,构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。
                3,Hibernate4新增了一个ServiceRegistry 接口,所有基于Hibernate的配置或者服务都必须统                一向这个ServiceRegistry注册后才能生效。
        Transaction
                代表一次数据库事务。Hibernate主张将所有持久化操作都纳入到事务控制中,哪怕仅仅是只读操作。
​
数据库表生成策略
①概述
      Hibernate在创建SessionFactory对象时,会根据*.hbm.xml映射文件中的信息自动生成对应的数据库表,而在生成数据库表的过程中,可以根据不同的配置信息采取不同的生成策略。
②配置方式
      在hibernate.cfg.xml配置文件中加入如下配置
      <property name="hbm2ddl.auto">update</property>
 
③可以选择的生成策略
      [1]create:根据*.hbm.xml文件生成新的数据库表,而且是每一次运行都删除旧表创建新的表,即使两次操作的过程中数据库表没有任何改变
      [2]update:按照如下几种情况生成数据库表
      <1>数据库表不存在:生成新的数据库表
      <2>数据库表存在且表结构不需要改变:保留原来的数据库表
      <3>数据库表存在但表结构有变化:在原来数据库表的基础上更新数据库表,不会删除原有的行和列
      [3]create-drop:每一次运行都生成新的数据库表,并在执行操作后将表删除
      [4]validate:会和数据库中的表进行比较,若*.hbm.xml文件中的列在数据表中不存在,则抛出异常
​
Session核心方法2
get()
      1,根据OID的值,从数据库中立即加载一个对象到内存中。
      2,如果调用get()方法时,Session缓存中已经有了一个OID相同的对象,则get()方法会将缓存中的对象返回,不发送SQL语句。
load()
      1,采用延迟检索策略,在调用load()方法时仅返回一个代理对象,不发送SQL语句。在真正用到非OID属性值时,才发送SQL语句进行查询。
      2,若通过使用load 方法没有找到OID对应的值会报ObjectNotFoundException。
Session核心方法4
update()
      根据游离对象或持久化对象对数据库表进行更新
      使用update()方法更新一个OID不存在的对象会抛出异常:org.hibernate.StaleObjectStateException
saveOrUpdate()
      兼具保存和更新两种功能。传入临时对象执行保存,传入游离对象执行更新。
      判断执行INSERT语句还是UPDATE语句的依据
      1,根据OID的值,如果为null则执行保存,否则执行更新
      2,如果OID的值等于hbm文件中,id元素设置的unsaved-value属性则执行保存操作。
merge()
      如果你在任何时候修改了数据都想把数据保存到数据库中,那么就调用merge()
          
update与merge的一点不同是:update是直接发出“sql update”语句,而merge会先发出“sql select”语句,如果没有查询到结果,那么执行save操作,如果查询到相关结果,则判断对应字段是否有发生改变,如果改变了,则发出“sql update”语句,否则什么也不做。这一方面,merge就和saveOrUpdate相同。
​
update():如果你确定在当前session的会话里不存在一个与要进行update操作有相同标识符(主键)的持久化对象,那么调用update()。这句话理解起来有点绕,后面举个例子就明白了。
​
merge():如果你在任何时候修改了数据都想把数据保存到数据库中,那么就调用merge()
​
          
          
          
常用查询方式
HQL检索方式:使用面向对象的HQL(Hibernate Query Language)查询语言(等级相当于sql)
​
QBC检索方式:使用QBC(Query By Criteria) API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。 
QBC常用方法
    1创建Criteria对象
    Criteria criteria = session.createCriteria(Employee.class);
    2取得查询结果
    Criteria criteria = session.createCriteria(Employee.class);
    List<Employee> list = criteria.list();
    Criteria对象大体上有两种方式获取查询结果:list()方法和uniqueResult()
      
      
    查询条件(where)
    封装查询条件要用到Restrictions类的各个静态方法,通过add()方法可以连用
    Criterion like = Restrictions.like("empName","%a%");
    Criterion gt = Restrictions.gt("salary",9000.00);
    List<Employee> list = criteria.add(like).add(gt) .list();
    AND和OR
      在QBC API中使用Conjunction类表示AND,使用Disjunction表示OR,它们都可以连接Criterion对象生成AND或OR语句。
​
      Criterion like = Restrictions. like(“empName”, “%a%”);
      Criterion gt = Restrictions. gt(“salary”, 9000.00);
      //创建AND条件对象
      Conjunction conjunction = Restrictions.conjunction();
      //使用AND连接like和 gt
      conjunction.add(like).add(gt);
      List<Employee> list = session.createCriteria(Employee.class).add(conjunction).list();
​
      //(   and  )  or  (  and  )
      Conjunction conjunction01 = Restrictions.conjunction();
      Conjunction conjunction02 = Restrictions.conjunction();
      Disjunction disjunction = Restrictions.disjunction();
      
      disjunction.add(conjunction01).add(conjunction02);
​
      报表查询
    在QBC查询中可以使用Projections类的静态方法封装SQL中的统计函数
      AggregateProjection max = Projections.max("salary");
      criteria.setProjection(max);
      如果有多个统计函数需要执行,则创建ProjectionList对象,用于包含多个Projection对象
      AggregateProjection max = Projections.max("salary");
      AggregateProjection min = Projections.min("salary");
      ProjectionList projectionList = Projections.projectionList();
      projectionList.add(max).add(min);
      List<Object[]> list =                             session.createCriteria(Employee.class).setProjection(projectionList).list();
​
    Group by分组
      可以使用groupProperty(String propertyName)方法对查询结果进行分组
      Criteria criteria = session.createCriteria(Employee.class);
      PropertyProjection groupProperty = Projections.groupProperty("department");
      criteria.setProjection(groupProperty).list();
​
    QBC排序
    Order asc = Order.asc("salary");
    Order desc = Order.desc("empName");
     List<Employee> list = session.createCriteria(Employee.class).addOrder(asc).addOrder(desc).list();
​
    QBC分页
    QBC分页和HQL分页的操作大体上是一致的
    int pageNo = 2;
    int pageSize = 5;
​
    List<Employee> list = session.createCriteria(Employee.class)
        .setFirstResult((pageNo - 1)*pageSize)
        .setMaxResults(pageSize)
        .list();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值