您的位置:首页 > 其它

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

2016-10-05 16:32 555 查看

Hibernate的学习路线图



Hibernate API简介

Configuration

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

Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。

持久化类与数据表的映射关系(*.hbm.xml文件)。

创建Configuration的两种方式:

属性文件(hibernate.properties)

Configuration cfg = new Configuration();


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();


SessionFactory是线程安全的。

SessionFactory是生成Session的工厂:

Session session = sessionFactory.openSession();


构造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的运行过程如下:

应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息。

并用这些信息生成一个SessionFactory对象。

然后从SessionFactory对象生成一个Session对象。

并用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)
)


注意:使用以上两种方式只能建表,不能建库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐