【SSH系列】-- hibernate基本原理&&入门demo

      什么是hibernate?
      hibernate在英文中是冬眠的意思,当冬季来临,世界万物开始准备冬眠,但是程序猿这种动物好像不冬眠,因为需求变了,要改bug,冬眠,对于对象来说就是持久化。什么叫做持久化呢?持久化,就是把数据(如内存中的对象)保存到可永久保存的存储设备中,比如磁盘,持久化的主要应用就是将内存中的对象存储在数据库中,或者存储在磁盘文件中、xml文件中等等。持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC就是一种持久化机制,文件IO也是一种持久化机制。
      在我们的生活当中,也有很多持久化的方法,比如:
       a、将鲜肉冷藏,吃的时候再解冻;
       b、将水果做成罐头;
       c、将人的器官迅速冷冻,运输,然后解冻给需要的人进行移植手术。所以说嘛,学习都是来自于生活。
      为了对hibernate进行更加深入的理解,我们可以从以下三个方面来帮助理解hibernate:
       a、从UBD的角度
       我们知道典型的三层架构有:U层、B层、D层;分别是表示层、业务层、持久层;hibernate就相当于我们之前接触过的D层,也就是持久层框架,持久层框架有很多比如mybatis、EJB等。
       b、hibernate是一个开源的ORM框架
ORM,对象关系映射,是一种程序技术,用于实现面向对象编程语言里面不同类型系统的数据之间的转换,从效果上来说,ORM就是创建了一个可在编程语言里使用的虚拟对象数据库,简单来说,她起到的作用就是在关系型数据库和对象之间做一个映射,从对象映射到关系,再从关系映射到对象,这样,我们操作数据库的时候,不需要再和SQL打交道,只要像操作对象一样操作她就可以了
      c、hibernate是对jdbc的进一步封装
还记得敲机房个人重构的时候,没有使用hibernate,存在很多的冗余部分,各种JDBC语句,so为了顺应时代的发展,我们把JDBC包装了一下下,这样,我们可以不用操作数据,直接操作她就ok了。

      hibernate的优缺点
       优点:
       a、更加对象化
       使用的时候只需要操作对象,是开发更加对象化,抛弃了据库中心的思想,完全的面向对象思想。
       b、持久化
       带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)
       c、没有侵入性,即所谓的轻量级框架。
       d、移植性很好。
       e、缓存机制,提供一级缓存和二级缓存。
       f、简洁的HQL编程。
       g、提交生产力。
       缺点:
       a、使用数据库特性的语句,将很难调优
       b、对大批量数据更新存在问题
       c、系统中存在大量的攻击查询功能
       d、不适合批量操作,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate。                 e、效率比jdbc略差
       

     hibernate和mybatis

       相同点:Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

       不同点:

       mybatis:小巧、方便、高效、简单、直接、半自动
       hibernate:强大、方便、高效、复杂、绕弯子、全自动

       mybatis:
       a、 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
       b、 可以进行更为细致的SQL优化,可以减少查询字段。
       c、 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
       d、 二级缓存机制不佳。
       hibernate:
       a、功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
       b、有更好的二级缓存机制,可以使用第三方缓存。
       c、缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
       举个形象的比喻:
       mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
       hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。

     hibernate开发以及环境搭建
        前面的部分小编主要简单的介绍了hibernate的相关理论知识,接下来,理论联系实践,小编做一个简单的demo,希望可以帮助小伙伴们更好的掌握hibernate,不足之处,还请小伙伴多多指教。
        a、Hibernate的环境搭建so easy,各种引入jar包,相关jar文件小编已经上传,点击即可下载,不用积分,不用太感谢啦,小编的名字叫雷锋,Hibernate核心包Hibernate依赖包
         b、加入数据库驱动,下面的demo的数据库采用mysql,so需要引入mysql的驱动,点击下载

         c、提供核心配置文件hibernate.cfg.xml文件(在src文件夹下即可),其中的配置如下(针对mysql),小伙伴们可以自己查查其他的数据库该如何进行配置。ok下面开始demo:

         第一步、编写hibernate.cfg.xml文件,完成基本的配置,代码如下:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory >
		<!-- MySql数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库名称 -->
		<property name="hibernate.connection.url"> jdbc:mysql:///hibernate_first</property>
		<!-- 数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 数据库的密码 -->
		<property name="hibernate.connection.password">123456</property>
		<!-- 方言:为每一种数据库提供适配器,方便转换 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 显示语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式排版 -->
		<!-- <property name="hibernate.format_sql">true</property> -->
		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>

	</session-factory>
</hibernate-configuration>

       第二步、建立实体类User.java代码如下所示:

package com.bjpowernode.hibernate;

import java.util.Date;

public class User {
		private String id;
		private String name;
		private String password;
		private Date createTime;
		private Date expireTime;

		public String getId() {
			return id;
		}
		public void setId(String id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public Date getCreateTime() {
			return createTime;
		}
		public void setCreateTime(Date createTime) {
			this.createTime = createTime;
		}
		public Date getExpireTime() {
			return expireTime;
		}
		public void setExpireTime(Date expireTime) {
			this.expireTime = expireTime;
		}
}

        第三步、编写User.hbm.xml文件,完成实体类的映射,具体代码如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User">
		<id name="id">
			<generator class="uuid"></generator>
		</id>
		<property name="name"/>
		<property name="password"/>
		<!-- 下面这种写法获取不到时间,小编也不知道为什么,还请小伙伴多多指教 -->
		<!-- <properties name="createTime"/>
		<properties name="expireTime"/> -->
		<property name="expireTime" column="expireTime" not-null="false" type="date"/>
		<property name="createTime" column="createTime" not-null="false" type="date"/>
	</class>

</hibernate-mapping>

        第四步、将User.hbm.xml文件加入到hibernate.cfg.xml文件中,代码如下所示:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory >
		<!-- MySql数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库名称 -->
		<property name="hibernate.connection.url"> jdbc:mysql:///hibernate_first</property>
		<!-- 数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 数据库的密码 -->
		<property name="hibernate.connection.password">123456</property>
		<!-- 方言:为每一种数据库提供适配器,方便转换 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 显示语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式排版 -->
		<!-- <property name="hibernate.format_sql">true</property> -->
		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>

	</session-factory>
</hibernate-configuration>

       第五步、编写工具类ExoprtDB.java,将hbm生成ddl,也就是hbm2ddl,代码如下所示:

package com.bjpowernode.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 将hbm生成ddl
 * @author Administrator
 *
 */
public class ExportDB {

	public static void main(String[] args) {

		//默认读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}
}

        第六步、建立客户端类Client,添加用户数据到myslq,代码如下所示:

package com.bjpowernode.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Client {

	public static void main(String[] args){

		//读取hibernate.cfg.xml文件
		Configuration cfg = new Configuration().configure();
		//建立SessionFactory
		SessionFactory factory = cfg.buildSessionFactory();
		//取得session
		Session session = null;
		try{
			session = factory.openSession();
			//开启事物
			session.beginTransaction();
			User user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());

			//保存user对象
			session.save(user);
			//提交事物
			session.getTransaction().commit();
		}catch (Exception e){
			e.printStackTrace();
			//回滚事物
			session.getTransaction().rollback();

		}finally{
			if (session != null){
				if(session.isOpen()){
					//关闭session
					session.close();
				}
			}

		}

	}

}

       最后,让我们一起来看看效果,如下截图所示:

       
       小编寄语:该博文小编主要简单的介绍了hibernate的相关知识,介绍了什么是hibernate、hibernate的优缺点、hibernate和mybatis的对象,最后简单的介绍了一个入门的demo,通过上面的demo我们可以看出,在代码中没有涉及到任何有关JDBC的代码,作为开发人员只需要写好相应的实体类,然后通过配置就可以实现了表的建立以及向表中实现数据的插入。在代码中有许多Hibernate的核心对象,例如Configuration、SessionFactory、Session等等,随着学习的深入,这些内容小编都会一一相关介绍,SSH之旅,未完待续......

时间: 2024-08-07 14:49:12

【SSH系列】-- hibernate基本原理&amp;&amp;入门demo的相关文章

【SSH系列】初识spring+入门demo

       学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍SSH中的spring,Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架.今天这篇博文,小编将从what.why

【SSH系列】-- Hibernate持久化对象的三种状态

       在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回.在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态.       一.瞬态(Transient),也叫临时态.处于这种状态的对象具备的特征如下:       a.

【SSH系列】---Hibernate的基本映射

       开篇前言       在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及hibernate的核心,采用对象化的思维操作关系型数据库.     [SSH系列]-- Hibernate持久化对象的三种状态 ,通过这篇博文的讲解,小伙伴们了解到java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回.在h

【SSH系列】静态代理&amp;amp;&amp;amp;动态代理

从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: a.抽象角色:通过接口或抽象类声明真实角色实现的业务方法. b.代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. c.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先

应用-SSH中Hibernate具体在项目中怎么用的

问题描述 SSH中Hibernate具体在项目中怎么用的 Hibernate 最新在学习Hibernate,但感觉学着有点力不从心,有人知道在项目中具体是怎么 应用的吗,或者说这个知识可以解决什么样的具体问题,求教.谢谢. 解决方案 第一:数据库连接不需要我们自己来管理,如打开和关闭. 第二:Hibernate对原来的SQL语句进行了封装,以前写很多SQL语句,现在你在保存的时候直接可以用 SAVE(对象)来实现了.(节省代码) 第三:原来是对表操作,现在是对对象操作,想法上是不是更好呢?都是对

ssh整合-关于ssh中hibernate生成方法从Action中调用报错main调用不报错

问题描述 关于ssh中hibernate生成方法从Action中调用报错main调用不报错 看图学生求解决没遇到过!我建测试类用main方法进来一点问题都没有正常输出i=1 解决方案 报的什么错,贴出来,,, 解决方案二: 你确定text的userinfo和action的userinfo的内容一样吗? 你在findUserinfonamepwd方法中将name和pwd打印出来看看. 我怀疑你action的参数userinfo是null或者userinfo实例化了,但是name或者pwd是null

struts2入门Demo示例_JSP编程

本文讲述了struts2入门Demo示例.分享给大家供大家参考.具体如下: 1.新建Web Project, 名称:struts2Demo; 2.建立一个用户库struts2, 包含最少的struts2的最少的6个jar文件; 其实呢, 对于MyEclipse8以上来说, 是不必须的, 因为它直接支持struts2了.不需要另外导包. 3.用Build Path将struts2的库加进来; 4.在web.xml中加入以下配置: <?xml version="1.0" encodi

艾伟_转载:.NET Discovery 系列之二--string从入门到精通(勘误版下)

本系列文章导航 .NET Discovery 系列之一--string从入门到精通(上) .NET Discovery 系列之二--string从入门到精通(勘误版下) .NET Discovery 系列之三--深入理解.NET垃圾收集机制(上) .NET Discovery 系列之四--深入理解.NET垃圾收集机制(下) .Net Discovery 系列之五--Me JIT(上) .NET Discovery 系列之六--Me JIT(下) .NET Discovery 系列之七--深入理解

.NET Discovery 系列之二--string从入门到精通(勘误版下)

本系列文章导航 .NET Discovery 系列之一--string从入门到精通(上) .NET Discovery 系列之二--string从入门到精通(勘误版下) .NET Discovery 系列之三--深入理解.NET垃圾收集机制(上) .NET Discovery 系列之四--深入理解.NET垃圾收集机制(下) .Net Discovery 系列之五--Me JIT(上) .NET Discovery 系列之六--Me JIT(下) .NET Discovery 系列之七--深入理解