Hibernate核心接口

一、Configuration类:
     1、  作用:
             (1)管理hibernate配置信息
             (2)读取hibernate.cfg.xml文件
             (3)加载hibernate的驱动,例如:url,用户名
             (4)管理对象关系映射文件<mapping resource="">
      一个应用程序只创建一个Configuration对象。
    2、常用的Configuration的操作方法:
     (1)创建Configuration类的实例:
          Configuration config = new Configuration().configure();
Hibernate会自动在当前CLASSPATH所指定的路径下查找Xml配置文件hibernate.cfg.xml,并将其内容加载到内存中,为后续工作做好准备。
 
   (2)不使用默认的hibernate.cfg.xml,使用自定义的配置文件:
       File file = new File("e:\\work\\hibernate.xml");
       Configuration config = new Configuration().configure(file);
    (3) 为Configuration指定持久化类: 可以直接实例化Configuration来获取一个实例 并为他指定XML映射定义文件 如果映射定义文件在类路径中 请使用addResource()
       Configuration cfg = new Configuration().addResource("com/demo/hibernate/beans/User.hbm.xml");
    (4) 为Configuration指定持久化类: 指定被映射的类 让Hibernate帮你寻找映射定义文件
 
             Configuration cfg = new Configuration().addClass(com.demo.hibernate.beans.User.class);
   
        (5)Configuration的三种加载方式:在Hibernate的启动与开发流程中 要使用一个Configuration 需要为他设置三个方面的内容
               A.数据库连接属性
               B.hbm.xml文件
               C.POJO类
      其中 第二个和第三个只需要设置一个 就会自动需找另一个 因为这两者只需一个
      第一种方式是使用hibernate.cfg.xml 该文件设置了数据库连接的属性和hbm.xml映射文件配置 hibernate会自动加载该配置属性 并自动找到POJO 因此要取得Configuration对象 只需要简单的创建改对象即可
Configuration cfg = new Configuration();
cfg.configuration("hibernate.cfg.xml");
第二种方式是通过hibernate.properties 省略
第三种方式是完全在构造时进行硬编码设置 设置过程如下所示
Configuration cfg =new Configuration()
.addClass(com.demo.hibernate.beans.User.class)
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource","java:comp/env/jdbc/test")
.setProperty("hibernate.order_update","true");
 
二、SessionFactory接口:
  1、作用:
        a)用来产生和管理Session
     b)通常情况下每个应用只需要一个SessionFactory
     c)除非要访问多个数据库的情况
     d) 关注两个方法即:  openSession 和 getCurrentSession
     i. openSession每次都是新的,需要close
     ii.getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的
         1.用途,界定事务边界
         2.事务提交自动close
         3.跟current_session_context_class (JTA、thread) 有关系 
            a)thread 使用 connection
注:上下文是什么?当前session运行的上下文,在hibernate.cfg.xml里指定的:
    最常用的就是thread,看当前的线程里有没有session对象,有了就拿,没有就建新的。
<property name="current_session_context_class">thread</property>
 
2、SessionFactory,产生session的工厂。一般情况下,每一个session里都有一个数据库的连接,所以产生session的工厂里边一定有好多个数据库连接,所以SessionFactory维护的最重要的东西就是数据库连接池。当它产生一个session的时候,他会从数据库连接池拿出一个连接交给session。
 
三、Session接口:
(一)Session概述
     1、Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和加载Java对象的方法。(注意:查询功能是由Query接口实现,但Query的对象是由Session获取的)
     2、Session具有一个缓存(Hibernate的一级缓存),位于缓存中的对象称为持久化对象,它与数据库中的相关记录对应。Session能够在某些时间点,按照缓存中对象的编号来执行相关的SQL语句,来同步更新数据库,这一过程被称为刷新缓存(flush)
     3、站在持久化的角度,Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态、删除状态,Session的特定方法能使对象从一个状态转换到另一个状态。
(二)持久化对象的状态:
     1、临时对象(Transient):
         1)在使用代理主键的情况下,OID通常为null
         2)不处于Session的缓存中
         3)在数据库中没有对应的记录
    2、持久化对象(托管)(Persist):
   
          1)OID不为null
          2)位于Session缓存中
          3)若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
          4)Session在flush缓存时,会根据持久化对象的属性编号,来同步更新数据库
          5)在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
     3、删除对象(Removed):
  
          1)在数据库中没有和其OID对应的记录
          2)不再处于Session缓存中
          3)一般情况下应用程序不该再使用被删除的对象
      4、游离对象(脱管)(Detached):
          1)OID不为null
          2)不再处于Session缓存中
          3)一般情况下游离对象由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录
(三)Session的核心方法:
   1、Session 的 save() 方法:使一个临时对象转变为持久化对象,完成以下操作:
    
       把 News 对象加入到 Session 缓存中, 使它进入持久化状态
       选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在 使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
       计划执行一条 insert 语句:在 flush 缓存的时候
       Hibernate 通过持久化对象的 OID 来维持它和数据库相关记录的对应关系. 当 News 对象处于持久化状态时, 不允许程序随意修改它的 ID
  
     persist() 和 save() 区别:当对一个 OID 不为 Null 的对象执行 save() 方法时, 会把该对象以一个新的 oid 保存到数据库中;  但执行 persist() 方法时会抛出一个异常.
   2、Session 的 get() 和 load() 方法:都可以根据跟定的 OID 从数据库中加载一个持久化对象,区别:
        当数据库中不存在与 OID 对应的记录时, load() 方法抛出 ObjectNotFoundException 异常, 而 get() 方法返回 null
        两者采用不同的延迟检索策略:load 方法支持延迟加载策略。而 get 不支持。
   3、Session 的 update() 方法:使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.
       若希望 Session 仅当修改了 News 对象的属性时, 才执行 update() 语句, 可以把映射文件中 <class> 元素的 select-before-update 设 为 true. 该属性的默认值为 false
      当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常
      当 update() 方法关联一个游离对象时, 如果在数据库中不存在相应的记录, 也会抛出异常. 
   4、 Session 的 saveOrUpdate() 方法:
         判定对象为临时对象的标准
         Java 对象的 OID 为 null
         映射文件中为 <id> 设置了 unsaved-value  属性, 并且 Java 对象的 OID 取值与这个 unsaved-value 属性值匹配
  5、 Session 的 merge() 方法:
6、Session 的 delete() 方法:既可以删除一个游离对象, 也可以删除一个持久化对象。处理过程是:
      计划执行一条 delete 语句
      把对象从 Session 缓存中删除, 该对象进入删除状态.
强调:session获取Connection对象的方法是调用doWork()方法
         session.doWork(new Work() {
             @Override
             public void execute(Connection conn) throws SQLException {
                 System.out.println(conn);
             }
         });
四、Transaction接口:  ,就是一组对数据库的操作集合,它们要么全部成功,要么全部失败.这个可以保证数据的一致性,事务具有原子性。
      1、Hibernate本身没有实现自己的事务管理功能,而是对底层JDBC事务或 JTA用户事务 ( 在两个系统或两个数据库同时使用事务)的轻量级封装
   2、hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式,所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
   3、使用hibernate进行操作时,(增删改)必须显示的调用Transaction
 
示例:
Transaction ts=s.beginTransaction();
...
ts.commit();
s.close();
发生异常需要ts.rollback()回滚。
五、Query接口: 是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句。
  1、用法: 通过SessionFactory获得了session对象后,除了可以通过get(类名.class, id)方法得到相应的对象,还可以通过获得Query对象来取得需要的对象 
   Query对象在Session对象关闭之前有效,否则会抛出SessionException异常。因为Session对象就像JDBC中的Connection 对象,即数据库的一次连接。关闭Connection对象,Statement对象就不能再使用,所以关闭Session后就不能再使用Query对象了。
   2、常用方法:
     (1)setxxx():用于设置HQL语句中问号或者变量的值;设置HQL语句中问号或者变量的值有两种使用方式:
        A.setString(int position,String value);设置HQL中的“?”的值,其中position代表“?”在HQL中的位置,value是要为“?”设置的值
例:
    Query query=session.createQuery("from UserInfoPO u where u.age>? and u.useName like ?");
      query.setInteger(0, 22);    //使用"?",第一个下标是从0开始的,给第一个问号赋值22
      query.setString(1, "%志%"); //设置第二个问号的值为“%志%”
 
         B.setString(String paraName,String value);设置HQL中“:”后所跟变量的值;其中paraName代表HQL中“:”后边的变量名,value是该变量的值:
例:
     Query query=session.createQuery("from UserInfoPO u where u.age>:minAge and u.useName like:useName");
        query.setInteger("minAge", 22);       //设置minAge的值
        query.setString("userName", "%志%");   //设置useName的值
 
     (2)list();返回查询结果,并把查询结果转换成list对象;也可以用query.uniqueResult();//得到一个单个的对象
     Query query=session.createQuery("from UserInfoPO u where u.age>:minAge and u.useName like:useName");
                query.setInteger("minAge", 22);       //设置minAge的值
                query.setString("userName", "%志%");   //设置useName的值
                List<UserInfoPO> list=query.list();
                
               for(int i=0;i<list.size();i++){
                   ui=(UserInfoPO)list.get(i);
                   System.out.println(ui.getUserName());
               }
 
  (3)executeUpdate();执行更新和删除语句
            Query query=session.createQuery("delete from UserInfoPO");
      query.executeUpdate(); //删除数据
 
   (4)分页查询:
      query.setFirstResult(位置如0);//表示从哪个位置开始查询,返回query对象
   query.setMaxResult(记录条数);//表示当页共几条记录,返回一个集合
   session.createQuery("select count(*) from 类名").uniqueResult();//得到记录总数
 
 

转载于:https://www.cnblogs.com/lone5wolf/p/11065133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS实现垂直居中的方法

CSS实现垂直居中的方法 1、relative absolute定位&#xff1a; (1)css html代码 1 <!doctype html>2 <html lang"en">3 4 <head>5 <meta charset"UTF-8" />6 <title>Document</title>7 …

高并发系统之大忌-慢查询

最近又遇到了一次慢查把db&#xff08;mariadb10)几乎打挂的案例&#xff0c;作为一个核心支付系统的技术负责人&#xff0c;真是每日如履薄冰。因为之前支付系统经常出问题&#xff0c;现在各个BG对支付系统都盯得很紧。这次要不是我及时让DB给暴力清理数据&#xff0c;没准又…

Hadoop namenode启动瓶颈分析

转载&#xff1a;http://blog.csdn.net/AE86_FC/archive/2010/08/26/5842020.aspx NameNode启动过程详细剖析 NameNode中几个关键的数据结构 FSImage Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中&#xff0c;每次保存fsimage之后到下次保存之间的所有…

Java 9 –终极功能列表

这篇文章将针对即将到来的Java 9版本进行更新&#xff0c;新增功能 &#xff08; 最新更新&#xff1a;2014年 9月9日 &#xff09; OpenJDK开发正在加快速度&#xff1a;2014年3月Java 8发布之后&#xff0c;我们预计将进入2年的发布周期。 据报道&#xff0c;Java 9将于2016…

js中的作用域和作用域链

作用域就是变量与函数的可访问范围。在js中只有 全局作用域 和 函数作用域 &#xff0c;并没有块级作用域。 全局作用域 在所有函数外定义的变量、声明的函数就是全局作用域&#xff0c;在全部环境下都可以访问。 var a 111;function fn(){console.log(a); }fn(); // 打印了…

vue打包后不使用服务器直接访问方法

根据官网打包执行npm run build 后dist文件夹打开的index.html 是空白 需要开启http服务器才能访问&#xff0c;以下是解决办法 1、找到config文件夹下的index文件 修改成 2、找到build文件夹下的until文件 修改成 然后执行npm run build重新打包下就ok了 更多专业前端知…

OpenStack虚机网卡的创建过程

原文&#xff1a;https://www.sdnlab.com/20286.htmlOpenStack最基本和常用的操作就是启动虚机。虚机启动的过程中涉及很多内容&#xff0c;其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡。虚机的创建和管理是Nova的任务&#xff0c;虚机网络的创建和管理是Neutron的任务…

js中的原型与原型链

js的学习有三座大山&#xff0c; 原型/原型链 、 作用域/闭包 、 异步/单线程&#xff0c;这三个知识点虽然基础但是入门时理解起来比较困难&#xff0c;本文先整理总结原型和原型链这一知识点。 1. 原型链怎么来的&#xff1f;对象的原型和function的prototype属性有什么关系…

HTML5 audio 如何实现播放多个MP3音频

<audio>标签是HTML5中的新标签&#xff0c;定义声音用于嵌入音频内容&#xff0c;比如音乐或其他音频流。用的比较多音频格式是.mp3。 <audio>标签常用属性如下表 属性值描述autoplayautoplay添加该属性后&#xff0c;音频会自动播放controlscontrols设置后&…

windwos下ntp服务器配置 arm平台ntp客户端获取同步时间

项目需要使用同步时间&#xff0c;在arm-linux开发板上&#xff0c;移植了ntp客户端&#xff0c;查看了一些资料&#xff0c;最终发现使用windows自带的ntp服务器比较方便&#xff0c;而且很靠谱&#xff0c;使用配置了一番&#xff0c;已经能够正常使用 详细步骤&#xff1a; …

BOM(Browser Object Model)

BOM&#xff08;浏览器对象模型&#xff09;&#xff0c;提供了一系列操作浏览器&#xff0c;获取浏览器信息的接口。这些接口在平时的工作中会经常用到&#xff0c;例如当前页面的刷新&#xff0c;获取url的参数等等。 注&#xff1a;图片来自 http://www.dreamdu.com/javascr…

入门 IT 行业,该具备哪些技能?

对于刚开始进入IT的新人来说&#xff0c;“必备技能”往往意味着一个长长的、标有重要度的学习列表&#xff0c;但是过长的列表通常会导致新人不知如何开始学习&#xff0c;压力倍增。本文尝试列举出最重要的几个技能&#xff0c;也期望通过此列表能给新人一个比较明确的学习重…

实验七作业

Part 1:验证性实验 将line29&#xff1a;for(i0;i<N;i)改为while(!feof(fp)) // 从文本文件file1.dat中读取数据&#xff0c;找出最高分和最低分学生信息&#xff0c;并输出在屏幕上 #include <stdio.h> #include <stdlib.h>#define N 10// 定义一个结构体类型…

块级格式化上下文(Block Formatting Context)

CSS块级格式化上下文是块级盒子的一种能力&#xff0c;这种能力并不是直接通过css属性声明而获得的&#xff0c;而是添加css的一部分相关属性之后自动获得的能力&#xff0c;也就是说没有一个明确的属性就是生成块级格式化上下文的。 块级格式化上下文的能力就是让具有该能力的…

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站&#xff0c;因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题&#xff0c;主要学习自yahoo前端性能团队总结的35条黄金定律总结&#xff0c;觉得很全很赞&#xff0c;做个学习总结和…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

Java-Class-I:java.util.List

ylbtech-Java-Class-I&#xff1a;java.util.List1.返回顶部 1.1、import java.util.ArrayList;import java.util.List; 1.2、List<Integer> newList new ArrayList<Integer>();newList.add(3); 2、 2.返回顶部1.1、import java.util.*;public class Test{public …

推荐:个人时间跟踪工具 ManicTime

在《个人管理 &#xff0d; 目标管理之前&#xff0c;你会时间管理吗》中我介绍的时间管理三阶段之一“对时间的实际去处进行记录”时说过现在有很多时间管理工具&#xff0c;也有人希望我介绍一下我使用的工具&#xff0c;那么我就利用中午休息时间&#xff0c;马上给大家介绍…

SQL Server 2005怎样进行性能排错

很少会有偶然的性能下降。设计不良的数据库或工作负载配置不正确的系统会经常导致性能问题。管理员需要能预先阻止或最小化问题的影响&#xff0c;当管理员遇到问题时&#xff0c;应该诊断问题并采取正确操作来修复问题。本文提供了按部就班的指导&#xff0c;通过使用可用的工…