Hibernate的核心配置文件和API

一,核心配置文件

1,Hibernate的映射文件*.hbm.xml

基本结构:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 映射文件的dtd信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    
<hibernate-mapping>
	<!--name 代表的是实体类名 table代表的是表名  -->
	<class name="XXX" table="xxx">
		<!-- name=id 代表i的是XXX类中的属性 column=id代表的是xxx表中的字段 -->
		<id name="id" column="id">
			<generator class="native"/> <!-- 主键生成策略 -->
		</id>
		<!-- 其他属性使用property标签来映射 -->
		<property name="password" column="password" type="string"/>
	</class>
	
</hibernate-mapping>
 hibernate-mapping:该元素定义了XML配置文件的基本属性,他所定义的属性在映射文件的所有节点都有效

class:该元素用来声明一个持久化类,他是XML配置文件的主要内容

id:该元素用来设定持久化类的OID(对象标识符)和表的主键的映射

property:该元素用来将持久化类中的普通属性映射到数据库表对应的字段上

2,hibernate的配置文件hibernate.cfg.xml
 基本结构:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 配置文件的dtd信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 指定方言 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<!-- 连接数据库的地址 -->
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/hibernate
		</property>
		<!--  用户名-->
		<property name="hibernate.connection.username">
			root
		</property>
		<!-- 密码 -->
		<property name="hibernate.connection.password">
			itcast
		</property>
		<!-- 其他配置 -->
		<!-- 显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化sql语句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 关联hbm配置文件 -->
		<mapping resource="com/itcast/domain/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
 Hibernate配置文件常用属性及用途:

名  称 用       途            
hibernate.dialect操作数据库方言
hibernate.connection.driver_class连接数据库驱动程序
hibernate.connection.url连接数据路URL
hibernate.connection.username数据库用户名
hibernate.connection.password数据库密码
hibernate.show_sql在控制台上输出SQL语句
hibernate.format_sql格式化控制台输出的SQL语句
hibernate.hbm2ddl.auto

当SessionFactory创建时是否根据映射文件自动验证表结构或自动创建,

自动更新数据库表结构。该参数的取值为validate,update,create和create-drop

hibernate.connection.autocommit事物是否自动提交


二,Hibernate的核心API

 在Hibernate中有6个常用的核心接口,分别是Configuration,SessionFactory,Session,Transaction,Query,Criteria


1,Configuration
 在使用Hibernate时,首先要加载Configuration实例,Configuration实例主要用于启动,
加载,管理hibernate的配置文件。在启动Hibernate的过程中,Configuration实例首先确定
Hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。
Configuration对象只存在于系统初始化阶段,它将SessionFactory创建完成后,就完成了使命
 Hibernate通常使用 Configuration config = new Configuration().configure(); 的方式
创建实例,此种方式默认会去src下读取hibernate.cfg.xml配置文件。如果不想使用默认的配置
文件,而是使用指定目录下的自定义的配置文件,则需要向configure()方法中传入一个文件路径
参数,代码如下:
Configuration config = new Configuration().configure("xml文件位置");

2,SessionFactory
 SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区的
作用,Hibernate可以将自动生成的SQL语句,映射数据以及某些可重复利用的数据放在这个缓冲区中。同时
它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
 获取方法为:
SessionFactory sessionFactory = config.buildSessionFactory();
 SessionFactory具有以下特点:
  • 它是线程安全的,它的同一个实例能够供多个线程共享
  • 它是重量级的,不能随意地创建和销毁它的实例
由于这些特点,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个
数据源创建一个SessionFactory实例。因此在实际项目中,通常会抽取一个HibernateUtils的工具类,用来提供
Session对象:
public class HibernateUtils {
	//声明一个私有静态final类型的Configuration对象
	private static final Configuration config;
	//声明一个私有静态final类型的SessionFactory对象
	private static final SessionFactory factory;
	//通过静态代码块构建SessionFactory
	static{
		config = new Configuration().configure();
		factory = config.buildSessionFactory();
	}
	//提供一个共有静态方法供外部获取,并返回一个Session对象
	public static Session getSession(){
		return factory.openSession();
	}
}

 通过这个工具类,在项目可以直接通过HIbernateUtils.getSession()方式获取Session对象




3,Session
 Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要作用是为
持久化对象提供创建,读取和删除等功能,所有持久化对象必须在Session管理下才可以进行持久化操作
 创建SessionFactory实例后,就可以通过它获取Session对象。获取Session有两种方法,如下:
 Session session = sessionFactory.openSession();
  Session session = sessionFactory.getCurrentSession();
 第一种方法在创建实例时SessionFactory直接创建一个新的Session实例,并且在使用完后需要调用
 close方法进行手动关闭
 第二种方法创建的实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭


Session是线程不完全的,多个并发线程同时操作一个Session时,就可能造成数据存取混乱(方法内部
定义和使用Session时不会出现线程问题)。因此,因避免多个线程同时使用一个Session
在Session中提供了大量的常用方法:
  • save(),update()和saveOrUpdate()方法:用于增加和修改对象
  • delete()方法:用于删除对象
  • get() 和load()方法:根据主键查询
  • createQuery() 和createSQLQuery()方法:用于数据库操作对象
  • createCriteria()方法:条件查询

4,Transaction
 Transaction接口主要用于管理事物,它是Hibernate的数据库事物接口,且对底层的事物接口进行了封装。Transaction
接口的事物对象是通过Session对象开启的,其开启方式:
Transaction t = session.beginTransaction();

 在Transaction接口,提供了事务管理的常用方法:
  •  commit()方法:提交相关联的Session实例
  •  rollback()方法:撤销事物操作
  •  wasCommitted()方法:检查事物是否提交

Session执行完数据库操作后,要使用Transaction接口的commit方法进行事物提交,才能真正将数据同步
到数据库中。发生异常时,需要使用rollback进行事物回滚,以避免数据发生错误。
5,Query
 Query代表面向对象的一个Hibernate查询操作。在Hibernate中,通常使用session.createQuery()方法
接受一个HQL语句。然后调用Query的list()或uniqueResult()方法执行查询。
 在Hibernate中使用Query对象的步骤:
(1)获得hibernate session 对象
(2)编写HQL语句
(3)调用session.createQuery创建查询对象
(4)如果HQL语句包含参数,则调用Query的setXxx设置参数
(5)调用Query对象的list()或uniqueResult()方法执行查询
下面同过一个案例来说明
 在上个入门案例的项目下的com.itcast.test包下新建一个类QueryTest.java 入门案例链接

 
package com.itcast.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.itcast.domain.User;

public class QueryTest {
	@Test
	public void findAll_hqlTest(){
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction t = session.beginTransaction();
		String hql = "from User";
		Query query = session.createQuery(hql);
		List<User>list= query.list();
		for(User user:list){
			System.out.println(user);
		}
		t.commit();
		session.close();
		sessionFactory.close();
	}
	
}
使用Junit测试该方法
数据库中的数据:

控制台输出的数据:


Query中除了使用list方法查询全部数据外,还有一些常用方法:
  • setter方法:Query接口中提供了一系列的setter方法用于设置查询语句中的参数,针对
    不同的数据类型,需要用到不同的setter方法
  • iterator方法:该方法用于查询语句,该方法返回一个Iterator对象,在读取时只能按照顺序方法读取,它
   仅把使用到的数据转换成java实体对象
  • uniqueResult方法:该方法用于返回唯一结果,在确保只有一条记录的查询时可以使用该方法
  • executeUpdate方法:该方法是Hibernate3的新特性,它支持HQL语句的更新和删除操作
  • setFirstResult方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录开始查询,默认0
  • setMaxResult方法:该方法用于设置结果集的最大记录数,通常与setFirstResult方法结合使用,限制结果集,      实现分页功能

6,Criteria
 Criteria是一个完全面向对象,可扩展的条件查询API通过它完全不需要考虑数据库底层如何实现,以及SQL
语句如何编写,他是Hibernate框架的核心查询对象。
 使用Criteria对象查询数据的主要步骤:
(1)获得Hibernate的Session对象
(2)通过Session获得Criteria对象
(3)使用Restrictions的静态方法创建Criterion对象
(4)向Criteria对象中添加Criterion查询条件。Criteria的add()方法用于加入查询条件
(5)执行Criteria的list或uniqueResult获得结果
下面通过一个案例来说明:
在入门案例的src目录下的com.itcast.test包下创建类CriteriaTest.java
package com.itcast.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.itcast.domain.User;

public class CriteriaTest {
	@Test
	public void qbcTest(){
		Configuration config = new Configuration().configure();
		SessionFactory sessionFactory= config.buildSessionFactory();
		Session session= sessionFactory.openSession();
		Transaction t = session.beginTransaction();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("name", "tom"));
		List<User>list =criteria.list();
		for(User user:list){
			System.out.println(user);
		}
		t.commit();
		session.close();
		sessionFactory.close();
	}
}


用Junit测试运行:
控制台输出:


输出了name=tom 的信息



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值