勿谓今日不学而有来日,勿谓今年不学而有来年。
日月逝矣,岁不我延。

Hibernate的HelloWorld项目

什么是Hibernate

一个 Java 领域的持久化ORM框架

Hibernate是连接java应用程序与关系数据库的中间件。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

 

对象的持久化

狭义的理解,“持久化”仅仅指把对象永久保存到数据库中。

广义的理解,“持久化”包括和数据库相关的各种操作:

  • 保存:把对象永久保存到数据库中。
  • 更新:更新数据库中对象(记录)的状态。
  • 删除:从数据库中删除一个对象。
  • 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
  • 加载:根据特定的OID(注),把一个对象从数据库加载到内存中。(为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识-Object identifier-OID)

ORM(Object/Relation Mapping): 对象/关系映射

  • –ORM 主要解决对象-关系的映射
  • ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
  • ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.

ORM原理图:

 

HolleHibernate

本文所涉及的源码见https://github.com/llanc/SSH_Learn/tree/master/Hibernate_01_HolleWord

准备

  • 所需jar包(可从项目源码中获取)
  • 开发步骤

 

步骤实践

创建持久化 Java 类

  • 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
    提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
  • 为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans 风格的属性实行持久化。
  • 使用非 final 类:在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.
  • 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法。

注意:Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。所以Hibernate被称为低侵入式设计框架。

创建对象-关系映射文件

  • Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
  • 映射文件的扩展名为 .hbm.xml
  • Student.xml解析

创建 Hibernate 配置文件

Hibernate 从其配置文件中读取和数据库连接的有关信息, 这个文件应该位于应用的 classpath 下.

hibernate.cfg.xml文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!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 name="">
  <!-- DB连接四要素 -->
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">root</property>
  <!-- 方言 -->
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  <!-- C3P0数据源 -->
  <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
  <!-- 当前session上下文 -->
  <property name="hibernate.current_session_context_class">thread</property>
  <!-- 自动建表-->
  <property name="hibernate.hbm2ddl.auto">update</property>
  <!-- 显示SQL-->
  <property name="hibernate.show_sql">true</property>
  <!-- 格式化SQL-->
  <property name="hibernate.format_sql">true</property>
  <!-- 注册映射文件-->
  <mapping resource="cn/llanc/bean/Student.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

 

使用 Hibernate 进行数据持久化操作

  1. 获取 Configuration 对象
  2. 获取 SessionFactory 对象
  3. 获取 Session,打开事务
  4. 用面向对象的方式操作数据库
  5. 关闭事务,关闭 Session

编写HbnUtils工具类以完成都1,2步骤的封装,减少操作:

package cn.llanc.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HbnUtils {
	private static SessionFactory sessionFactory;
	/*
	 * 获取Session
	 */
	public static Session getSession(){
		return getSessionFactory().getCurrentSession();	
	}
	/*
	 * 	获取SessionFactory
	 */
	public static SessionFactory getSessionFactory(){
		if (sessionFactory == null || sessionFactory.isClosed()){
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}
		return sessionFactory;
	}
}

编写Junit测试类进行测试:

package cn.llanc.test;

import static org.junit.Assert.*;

import org.hibernate.Session;
import org.junit.Test;

import cn.llanc.bean.Student;
import cn.llanc.utils.HbnUtils;

public class HolleWordTest {

	@Test
	public void test() {
		//创建Session
		Session session= HbnUtils.getSession();
		try {
			//开始事务
			session.beginTransaction();
			//ִ执行操作
			Student student=new Student("小明",23,"男");
			session.save(student);
			//提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			//异常回滚
			session.getTransaction().rollback();
		}	
	}
}

所涉及到的类和接口

Configuration 类

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

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

创建 Configuration 的两种方式:

  • 属性文件(hibernate.properties): Configuration cfg = new Configuration();
  • Xml文件(hibernate.cfg.xml): Configuration cfg = new Configuration().configure();   (最常用)
  • Configuration 的 configure 方法还支持带参数的访问:

File file = new File(“simpleit.xml”);

Configuration cfg = new Configuration().configure(file);

SessionFactory 接口

  • 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
  • SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息
  • SessionFactory是生成Session的工厂
  • 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

Session 接口

  • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。
  • Session对象的生命周期很短。
  • Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。
  • 相当于 JDBC 中的 Connection。
  • 持久化类与 Session 关联起来后就具有了持久化的能力。
  • Session 类的方法:
    1. 取得持久化对象的方法: get() load()
    2. 持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
    3. 开启事务: beginTransaction().
    4. 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等

Transaction(事务)接口

  • 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
  • 常用方法:
    1. commit():提交相关联的session实例
    2. rollback():撤销事务操作
    3. wasCommitted():检查事务是否提交

 

 

赞(1)
未经允许不得转载:喋喋不休 » Hibernate的HelloWorld项目

评论 抢沙发

评论前必须登录!

 

精品网站

有券无忧电脑壁纸精选