Hibernate基础篇之什么是Hibernate

一、什么是Hibernate

Hibernate是开源的、用于封装数据访问层的组件,我们称之为数据访问层框架(或持久层框架)。之前我们通过JDBC/SQL语句从数据库中访问/操作数据,而Hibernate就是封装了这些操作,与门用于数据访问层的组件技术。 出现Hibernate框架之前在企业项目开发过程中,如下几点造成了程序员们的痛苦:
① SQL语句过亍繁杂, 和数据库的耦合度高
指有些SQL会涉及到多表操作,戒者有些表会非常庞大,这时候写在DAO中的SQL就会非 常复杂,同时导致DAO和数据库的耦合度较高。
②不同数据库之间SQL的不同,导致移植困难
不同数据库虽然SQL语句大致相同,但是还有一些绅节上的差别,比如Oracle中的分页方式 和mysql中的分页是不同的,所以会有代码移植困难的因素。
③二维关系表和对象之间数据结构的不匹配
我们从数据库中取出的数据是结果集(一张表),而我们开发时需要将查询到的结果集封装为对象,然而数据库中二维表的数据结构和内存中Java对象的数据结构是不匹配的(表中的数据需要经过处理才能变为Java对象)。 基于如上几点,痛苦促进了技术的革新和进步,Hibernate应用而生。

二、Hibernate的工作原理—ORM

ORM:对象-关系映射(Object-Relationship Mapping)
在我们的应用程序(App)中,数据用对象来体现,而在数据库中,数据是使用表的形式保存。 Hibernate用亍应用程序中的对象(Object)不表中的数据关系(Relationship)之间的映射(Mapping),即把对象保存到关系表中戒者把关系表中数据取出映射为对象。可以这样理解,当我们使用Hibernate框架技术,就可以直接从数据库中取出Java对象,或者把Java对象直接保存于数据库中,中间写sql语句等繁琐的步骤被Hibernate封装,对我们是透明的。 Hibernate自动化的程度很高的组件,因此比较难以驾驭,在对Hibernate理解够透彻的情况下使用,稍微不留神可能就会影响性能。
业界还有一些自动化程度稍低的数据访问层组件,比如Ibatis,MyBatis相当于不自动的仪器,可控性较Hibernate强一些,目前也比较流行。

三、案例讲解

①新建一个Maven工程HibernateDemo1
Hibernate基础篇之什么是Hibernate的照片 - 1
pom.xml文件配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.queen.hibernate</groupId>
	<artifactId>HibernateDemo1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<dependencies>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.10.Final</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.32</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.4</version>
		</dependency>
		<dependency>
			<groupId>org.javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.21.0-GA</version>
		</dependency>
	</dependencies>
</project>

②Hibernate配置文件,hibernate.cfg.xml 用于数据库连接信息及Hibernate的一些配置信息。
注意:应该放在源文件的src/main/resources目录下,默认为hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- 数据库连接信息 -->
		<property name="connection.url"> jdbc:mysql://localhost:3306/hibernate</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class"> com.mysql.jdbc.Driver</property>
		<!-- dialect是方言,用亍配置生成针对哪个数据库的SQL语句-->
		<property name="dialect">
			<!--Hibernate提供的方言类,用于封装某种特定数据库的方言-->
			org.hibernate.dialect.MySQLDialect
		</property>
		<!--将执行SQL打印到控制台,一般用亍sql调优-->
		<property name="hibernate.show_sql">true</property>
		<!--SQL格式化显示到控制台-->
		<property name="hibernate.format_sql">true</property>
		
		<!-- 在配置文件中关联映射文件 --> 
		<mapping resource="com/queen/hibernate/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>

③Hibernate映射文件(可以有n个)
用来指明类和表之间的对应关系,Hibernate根据该文件生成SQL语句,比如POJO类名为User.java,对应的映射文件就名为User.hbm.xml。
♦User.java类

package com.queen.hibernate;
public class User {
	// 主键
	private int id;
	// 姓名
	private String name;
	// 年龄
	private String age;
	// 性别
	private String sex;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return super.toString();
	}
}

♦User.hbm.xml配置
映射文件用于指明POJO类和表之间的映射关系(xx属性对应xx字段), 一个类对应一个映射文件
注意:映射文件默认不POJO类放在一起;命名规则为类名.hbm.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.queen.hibernate">
	<class name="User" table="t_user">
		<id name="id" type="integer" column="id">
			<!-- generator用来指明主键的生成方式 -->
			<generator class="identity"></generator>
		</id>
		<property name="name" type="string" column="name" />
		<property name="age" type="string" column="age" />
		<property name="sex" type="string" column="sex" />
	</class>
</hibernate-mapping> 

♦建表语句

CREATE TABLE `t_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` varchar(3) DEFAULT NULL,
  `sex` varchar(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

♦测试,新建TestHibernate

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

import com.queen.hibernate.User;

public class TestHibernate {
	@Test
	public void test() {
		// 创建一个User对象
		User user = new User();
		user.setSex("女");
		user.setAge("27");
		user.setName("queen");
		// 调用Hibernate的API,用于装载Hibernate配置文件
		Configuration conf = new Configuration();
		// 在类路径中装载 默认的 配置文件hibernate.cfg.xml *
		// 如果配置文件关联了映射文件,同时也装载了映射信息
		conf.configure();
		// 创建SessionFactory
		SessionFactory factory = conf.buildSessionFactory();
		// 创建Session //Hibernate提供的访问接口
		Session session = factory.openSession();
		// 获得事务
		Transaction tx = session.getTransaction();
		//插入数据
		session.save(user);
		// 开启事务
		tx.begin();
		// 提交事务
		tx.commit();
		// 关闭session
		session.close();

	}
}

♦运行JUnit单元测试,控制台打印如下:

log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: 
    insert 
    into
        t_user
        (name, age, sex) 
    values
        (?, ?, ?)

♦查看数据库
Hibernate基础篇之什么是Hibernate的照片 - 3
插入数据执行成功

四、总结

由上面的一个小例子,我们可以总结一下Hibernate执行的流程
①应用程序调用Configuration类,该类读取hibernate配置文件及映射文件的信息,
②使用这些信息生成SessionFactory对象
③然后生成一个Session对象
④并用Session对象生成Transaction对象
⑤通过Session对象的get load save …等方法对pojo进行加载,保存,更新,删除
⑥transaction对象将这些操作提交到数据库中
⑦最后关闭创建的Session
 
博客地址:http://www.marsitman.com/hibernate/what_is_hibernate.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!






文件名称:Hibernate基础篇之什么是Hibernate

更新日期:2017-07-14

作者信息:榕瑾

提示:下载后请检查MD5值,欢迎捐赠本站以及广告合作!

下载地址:点击下载 【文件大小:11 KB】

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注