(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件

Hibernate的学习路线图

Hibernate API简介

Configuration

Configuration类负责管理Hibernate的配置信息,包括如下内容:

  1. Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。
  2. 持久化类与数据表的映射关系(*.hbm.xml文件)。

创建Configuration的两种方式:

  1. 属性文件(hibernate.properties)

    Configuration cfg = new Configuration();
  2. Xml文件(hibernate.cfg.xml)
    • 加载默认名称的配置文件(hibernate.cfg.xml)

      Configuration cfg = new Configuration().configure();
    • 或加载指定名称的配置文件
      Configuration cfg = new Configuration().configure(“myhibernate.cfg.xml”);

Configuration类还有如下这些常用方法:

  • addResource(String resource):导入一个指定位置的映射文件。
  • addClass(Class clazz):导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件。
  • buildSessionFactory():创建Session工厂。

SessionFactory

Configuration对象根据当前的配置信息生成SessionFactory对象。SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时SessionFactory还负责维护Hibernate的二级缓存)。相关代码如下:

Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
  1. SessionFactory是线程安全的。
  2. SessionFactory是生成Session的工厂:
    Session session = sessionFactory.openSession();
  3. 构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory对象。

SessionFactory类还有如下两个方法:

  • getCurrentSession(),后面会重点讲解。
  • close(),知道就好。

Session

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。(相当于JDBC中的Connection) 

  • 持久化类与Session关联起来后就具有了持久化的能力。
  • Session是线程不安全的。
  • Session类的一些方法: 
    • 取得持久化对象的方法: get()、load()
    • 持久化对象都得保存,更新和删除:save(Object)、update(Object)、delete(Object)
    • 查询的方法:createQuery(String)createCriteria(Class)
    • 管理事务的方法:beginTransaction()、getTransaction()(获取当前Session中关联的事务对象)
    • 管理Session的方法:isOpen()、flush()、clear()、evict()、close()等。

Transaction

  • 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

    Transaction tx = session.beginTransaction();
  • 常用方法: 
    • commit():提交相关联的session实例。
    • rollback():撤销事务操作。
    • wasCommitted():检查事务是否提交。

Query和Criteria接口

都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。 
Query接口有如下常用方法:

  • list():查询一个结果集合。
  • uniqueResult():查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。

Criteria接口中的方法,我们后面会详解介绍到。 
例如,我们要查询数据库中user表中所有的记录,就有2种方式:

    • 方式一:使用HQL语句

      List<User> list = session.createQuery("FROM User").list(); // 使用HQL查询
  • 方式二:使用Criteria查询

    Criteria criteria = session.createCriteria(User.class);
    List<User> list = criteria.list();

若是要查询id为5的用户的信息,同样也有2种方式:

  • 方式一:使用HQL语句

    List<User> list = session.createQuery("FROM User WHERE id=5").list(); // 使用HQL查询
  • 方式二:使用Criteria查询
    Criteria criteria = session.createCriteria(User.class);
    // 增加过滤条件
    criteria.add(Restrictions.eq("id", 5)); // id=5的条件
    List<User> list = criteria.list();

若是要查询所有用户的信息并且以id列升序排列,同理:

  • 方式一:使用HQL语句

    List<User> list = session.createQuery("FROM User ORDER BY id").list(); // 使用HQL查询
  • 方式二:使用Criteria查询
    Criteria criteria = session.createCriteria(User.class);
    // 增加排序条件
    criteria.addOrder(Order.asc("id"));
    List<User> list = criteria.list();

Hibernate的运行过程

Hibernate的运行过程如下:

  1. 应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。
  2. 并用这些信息生成一个SessionFactory对象。
  3. 然后从SessionFactory对象生成一个Session对象。
  4. 并用Session对象生成Transaction对象。 
    • 可通过Session对象的get()、load()、save()、update()、delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作。
    • 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

用图来表示即为: 

Hibernate主配置文件

在Hibernate主配置文件——hibernate.cfg.xml中配置的key前面的hibernate.前缀可以有,也可以没有。如:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

等同于:

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

Hibernate主配置文件(hibernate.cfg.xml)的内容按作用可分为三类:

  • 数据库信息,包括数据库的URL、用户名、密码、JDBC驱动类以及数据库Dialect。

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.url">jdbc:mysql:///hibernate_20160926</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
  • 导入映射文件,如:
    <mapping resource="cn/itcast/a_helloworld/User.hbm.xml" />
  • 其他配置,有:
    • 显示生成的SQL语句:

      <property name="hibernate.show_sql">true</property>
    • 格式化生成的SQL语句:
      <property name="hibernate.format_sql">true</property>
    • 自动生成表结构:
      <property name="hbm2ddl.auto">create/update/create-drop/validate</property>

现在我们着重来讲解Hibernate主配置文件的其他配置中的自动生成表结构语句,key为hbm2ddl.auto的value可以有以下取值:

  • create:先删除,再创建。
  • update:如果表不存在,就创建;不一样就更新,一样就什么都不做(开发的时候用)。注意,update只是在增加信息的时候有效,更改的时候一般都无效
  • create-drop:初始时创建表(先删除,再创建),SessionFactory执行close()方法时删除表(要显示地调用close()方法,否则不会做删除的操作)。
  • validate:验证表结构与hbm中的是否一致,如果不一致,就抛异常。

我们只要在Hibernate主配置文件中配置上自动生成表结构语句, 那么Hibernate框架会根据映射文件得到数据定义语言(DDL)来建表。 
除了上面这种方式外,还有一种方式可以生成表结构,那就是使用SchemaExport工具类。

public class CreateSchema {
    // 根据配置生成表结构
    @Test
    public void test() {
        Configuration cfg = new Configuration().configure();
        SchemaExport schemaExport = new SchemaExport(cfg);

        // 第一个参数script的作用: print the DDL to the console
        // 第二个参数export的作用: export the script to the database
        schemaExport.create(true, true);
    }
}

运行test()方法,会在Eclipse控制台中打印类似如下的建表语句:

drop table if exists t_user

create table t_user (
    id integer not null auto_increment,
    name varchar(20),
    primary key (id)
)

注意:使用以上两种方式只能建表,不能建库

时间: 2024-10-13 15:25:17

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件的相关文章

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

Hibernate框架 初识 ORM概念 搭建Hibernate环境 Hibernate Api

ORM概念 在学习 Hibernate 之前,我们先来了解ORM   对象关系映射 O, Object  对象 R,Realtion 关系  (关系型数据库: MySQL, Oracle…) M,Mapping  映射 ORM, 解决什么问题? 存储:   能否把对象的数据直接保存到数据库? 获取:   能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射!   总结:          Hibernate与ORM的关系?             Hibernate是ORM的实现,简化对

二、框架学习 (一)Hibernate框架学习 (2)Hibernate概念和api使用

目录 1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) 正文 实体类编写规则 1 实体类里面属性是私有的 2 私有属性使用公开的set和get方法操作. 3 要求实体类有属性作为唯一值(一般使用id值) 4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据类型对应的

Hibernate框架学习(二)——api详解

一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. 1 //1.创建,调用空参构造(还没有读配置文件) 2 Configuration conf=new Configuration(); 3 //2.读取指令配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件 4 conf.configure(); 5 6 //3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,不需要手动加载 7 //conf.addResource(

(转)Hibernate框架基础——映射集合属性

http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合属性. Map结构的集合属性,每个属性值都有对应的Key映射. 集合映射的元素大致有如下几种: list:用于映射List集合属性. set:用于映射Set集合属性. map:用于映射Map集合性. array:用于映射数组集合属性. bag:用于映射无序集合. idbag:用于映射无序集合,但为集

(转)Hibernate框架基础——多对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个学生可以选修多门课程,一个课程可以被多名学生选修.在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系. 为了详细介绍多对多关联关系映射,终究还是应以一个例子来说明比较印象深刻.我们以老师和学生的关系为例来说明这种多对多关联关系映射. 双向多对多 我们最

JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用

Hibernate框架概述 什么是Hibernate? 框架:软件的半成品,完成部分代码的功能. Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思想来操作数据库.Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet/JSP的web应用程序中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成