前言:

JavaEE软件开发体系架构中三层架构自上而下将系统分为表示层、逻辑层、持久层。Servlet+Jsp+JavaBean+JDBC开发市面上所有应用,企业中一般不会使用以上的架构去开发,而是使用架构SSH(Struts2+Spring+Hibernate)或者是使用SSM(SpringMVC+Spring+Mybatis)。其中Hibernate就是SSH中的H。

hibernet架构图 简述hibernate框架结构_hibernet架构图

一:Hibernate概述:

什么是Hibernate:

Hibernate框架是Java持久层框架之一,是一个开放源代码的ORM(Object Relational Mapping)框架,它对JDBC进行了轻量级的对象封装,是的Java开发人员可以使用面向对象的编程思想来操作数据库。

优势:

1)Hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。

2)Hibernate是一个基于JDBC的持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO层编码工作。

3)Hibernate的性能很好,映射灵活想很出色。它支持很多关系型数据库,从一对一到多不多的各种关系。

4)可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

二:Hibernate入门:

1、下载Hibernate5:

https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.2.13.Final/

hibernet架构图 简述hibernate框架结构_持久化_02

Hibernate的版本可以自行选择,解压完整目录结构如下:

hibernet架构图 简述hibernate框架结构_hibernet架构图_03

目录简单介绍:

1)documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档。

2)lib文件夹:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目所必须的jar包。

3)project文件夹:存放Hibernate各种昂相关的源代码。

在lib/required子目录下,包含的jar包:

hibernet架构图 简述hibernate框架结构_hibernet架构图_04

2、创建数据库和表:

这一步暂时不用做,只需要建立一个空数据库hibernate01即可。


/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50624
Source Host           : localhost:3306
Source Database       : hibernate01

Target Server Type    : MYSQL
Target Server Version : 50624
File Encoding         : 65001

Date: 2018-02-26 15:07:22
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for cst_customer
-- ----------------------------
DROP TABLE IF EXISTS `cst_customer`;
CREATE TABLE `cst_customer` (
  `cust_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `cust_name` varchar(255) DEFAULT NULL,
  `cust_source` varchar(255) DEFAULT NULL,
  `cust_industry` varchar(255) DEFAULT NULL,
  `cust_level` varchar(255) DEFAULT NULL,
  `cust_linkman` varchar(255) DEFAULT NULL,
  `cust_phone` varchar(255) DEFAULT NULL,
  `cust_mobile` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

3、引入Hibernate的开发包

hibernet架构图 简述hibernate框架结构_Customer_05

4、创建实体(持久化类)

持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通Java对象,即POJO的编程模式来进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。

在项目src目录下,创建cn.ytm.domian包,并在包中创建实体类Customer(和数据库表cst_customer对应),Customer类包含cst_customer数据表字段对应的属性,以及对应的get、set方法。(get/set方法部分省略)

package cn.ytm.domain;

public class Customer {
	
	private Long cust_id;
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_linkman;
	private String cust_phone;
	private String cust_mobile;
	public Long getCust_id() {
		return cust_id;
	}
	public void setCust_id(Long cust_id) {
		this.cust_id = cust_id;
	}
	......
	
}

5、创建映射文件:

实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属性对应数据库表中的那个字段,这些都要在配置文件中配置。

在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。(不理解映射文件的可以重点看注释)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 建立类和表的一个映射关系 -->
<!-- 
	class标签:
		name属性:用来建立类和表的映射
		table属性:表明(如果类名和表名一致,那么table属性客户省略)
		catalog属性:数据库名称,可省略
 -->
	<class name="cn.ytm.domain.Customer" table="cst_customer">
	<!-- 建立类中的属性与表中的主键的映射 -->
	<!-- 
		id标签:
			name属性:类中的属性名
			column属性:表中字段名(如果类中的属性名和表中的字段名一致,那么省略column)
			length属性:字段的长度
			type属性:类型。写Java数据类型,hibernate数据类型(默认),sql类型
	 -->
		<id name="cust_id" column="cust_id">
		<!-- 主键生成策略 -->
			<generator class="native"/>
		</id>
		<!-- 建立类中的普通属性与表中的字段的映射 -->
		<!-- 
			property标签:用来建立类中的普通属性与表中的字段对应
				name属性:类中的属性名
				column属性:表中字段名(如果类中的属性名和表中的字段名一致,可以省略column)
				length属性:字段的长度
				type属性:类型。写Java数据类型,hibernate数据类型(默认),sql类型
		 -->
		<property name="cust_name" column="cust_name"/>
		<property name="cust_source" column="cust_source"/>
		<property name="cust_industry" column="cust_industry"/>
		<property name="cust_level" column="cust_level"/>
		<property name="cust_linkman" column="cust_linkman"/>
		<property name="cust_phone" column="cust_phone"/>
		<property name="cust_mobile" column="cust_mobile"/>
	</class>

</hibernate-mapping>

6、创建Hibernate的核心配置文件:

Hibernate的映射文件反应了持久化类和数据库表的映射信息,而hibernate的配置文件则只要来配置数据库连接以及hibernate运行时所需的各个属性的值。在项目src下创建一个名称为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>
<!-- 必要的配置信息:连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- hibernate的属性 -->
<!-- hibernate的方言:作用是根据配置的方言生成相应的sql语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- hibernate格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate的hbm2ddl属性 -->
<!-- 
	hbm2ddl.auto的取值
		none:不用hibernate自动生成表
		create:每次都会创建一个新的表(测试)。
		create-drop:每次都会创建一个新的表,执行程序结束后删除这个表(测试)。
		update:如果数据库中有表 ,使用原来的表,如果没有表,创建一个新表,可以更新表结构。
		validate:只会使用原有的表,对映射关系金西行教验。
 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/ytm/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>



7、编写测试代码:

在项目中新建包cn.ytm.test,并在包中建立测试类HibernateDemo。

package cn.ytm.test;

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

import cn.ytm.domain.Customer;

public class HibernateDemo {

	@Test
	public void demo1() {
		// 1 创建,调用空参构造,加载配置文件
		Configuration cfg = new Configuration().configure();
		// 2 创建一个sessionFactory
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		// 3 创建session对象,类似于connection
		Session session = sessionFactory.openSession();
		// 4 开启事务
		Transaction tx = session.beginTransaction();
		
		// 5 执行相关操作
		Customer customer = new Customer();
		customer.setCust_name("小缘");
		customer.setCust_source("推广");

		session.save(customer);
		// 6 提交事务
		tx.commit();
		// 7 释放资源
		session.close();
	}
}

运行结果:

console中:

因为在配置文件中配置了hibernate显示格式化的sql语句,所有运行测试类后console显示的结果如下:

hibernet架构图 简述hibernate框架结构_hibernet架构图_06


mysql数据库:

运行测试方法前:

hibernet架构图 简述hibernate框架结构_Customer_07

运行测试方法后:

hibernate的hbm2ddl属性中配置了update属性值,数据库中没有表,所以运行测试类后hibernate自动为数据库创建了一个新表。并且插入了测试方法中设置的数据。

hibernet架构图 简述hibernate框架结构_hibernet架构图_08

hibernet架构图 简述hibernate框架结构_hibernet架构图_09