`

Hibernate 实现原理

阅读更多
整体流程
1:通过configuration来读cfg.xml文件
2:得到SessionFactory 工厂
3:通过SessionFactory 工厂来创建Session实例
4:通过Session打开事务
5:通过session的api操作数据库
6:事务提交
7:关闭连接

为什么要用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。  
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。  
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。  
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。



两种取得session方法:
openSession和getCurrentSession区别 
openSession:永远创建新的session 需手动close,事务提交不会自动close
getCurrentSession:事务没提交之前。在上下文找,有可能返回旧的session,事务提交了,会得到新的session。事务提交,session自动close
上下文,在配置文件指定:
   <property name="current_session_context_class">thread</property>
    jta | thread | managed | custom.Class 
     thread常用—》必须指明current_session_context_class,否则抛异常

a.sessionFactory.openSession();
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
       Session session = sessionFactory.openSession();   //创建新的session对象
       session.beginTransaction();
       session.save(t);
       session.getTransaction().commit();
      session.close() ;                               //关闭session对象

     

b.sessionFactory.getCurrentSession();
 sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
       Session session = sessionFactory.getCurrentSession();   //获取当前"上下文"中的session对象
       session.beginTransaction();
       session.save(t);
       Session session2 = sessionFactory.getCurrentSession();
	   System.out.println(session == session2);  //true
       session.getTransaction().commit();            //事务提交自动关闭该session
       System.out.println(session == session2);  //false                               








一、没有通过applicationContext.xml配置文件加载hibernate.cfg.xml,而是通过
自定义的类HibernateUtil.java创建sessionFactory对象

1.TeamDaoHibernate
package com.org.momo.dao.hibernateTemplate;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.org.momo.bean.PageInfo;
import com.org.momo.bean.Team;
import com.org.momo.dao.TeamDao;
import com.org.momo.util.HibernateUtil;

public class TeamDaoHibernate implements TeamDao {
	private SessionFactory sessionFactory;
	
	public TeamDaoHibernatenotused() {
		sessionFactory = HibernateUtil.getSessionFactory();
	}

	public void insert(Team team) throws Exception {
		Session session = sessionFactory.openSession();
		
		Transaction transaction = session.beginTransaction();
		session.save(team);
		transaction.commit();
		
		session.close() ;
	}

	public void deleteById(Integer id) throws Exception {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		String hql = "delete from Team where id=?";
		Query query = session.createQuery(hql);
		query.setInteger(0, id);
		query.executeUpdate();
		
		transaction.commit();
		session.close();
	}

	public void update(Team team) throws Exception {
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		session.merge(team);
		
		transaction.commit();
		session.close();
	}

	public List<Team> findAll() throws Exception {
		List<Team> teams = null;
		
		Session session = sessionFactory.openSession();
		
		Query query = session.createQuery("from Team");
		teams = query.list();
		
		session.close();
		
		return teams;
	}

	public Team findById(Integer id) throws Exception {
		Team team = null;
		
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from Team where id=?");
		query.setInteger(0, id);
		team = (Team)query.uniqueResult();
		session.close();
		
		return team;
	}

	public List<Team> findAllPage(PageInfo pageInfo) throws Exception {
		List<Team> teams = null;
		
		Session session = sessionFactory.openSession();
		
		Query queryTotal = session.createQuery("select count(id) from Team");
		int rowCount = ((Long)queryTotal.uniqueResult()).intValue() ;  //先转换为Long 在转换为int
		int pageTotal = rowCount/pageInfo.getPageRows();
		if(rowCount%pageInfo.getPageRows() > 0) {
			pageTotal++;
		}
		pageInfo.setPageTotal(pageTotal);
		
		Query query = session.createQuery("from Team");
		query.setFirstResult(pageInfo.getPageRows()*(pageInfo.getCurrentPage()-1));
		query.setMaxResults(pageInfo.getPageRows());
		teams = query.list();
		
		session.close();
		
		return teams;
	}

}



2.HibernateUtil.java
    package com.org.momo.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;


public class HibernateUtil {
	  private static final SessionFactory sessionFactory;
      static{
    	  try{
    		  //初始化hibernate.cfg.xml配置,建立数据库连接
    		  sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    	  }catch(Exception e){
    		  e.printStackTrace() ;
    		  throw new ExceptionInInitializerError(e) ;
    	  }
      }
      
      public static SessionFactory getSessionFactory(){
    	  return sessionFactory ;
      }
}



二、通过配置Spring的applicationContext.xml文件加载,spring对Hibernate的支持(HibernateTemplate)

1.applicationContext.xml
   <?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="teamService" class="com.org.momo.service.impl.TeamServiceImpl">
		<property name="teamDao" ref="teamDao"></property>
	</bean>
	<bean id="adminService" class="com.org.momo.service.impl.AdminServiceImpl">
		<property name="adminDao" ref="adminDao"></property>
	</bean>
    <bean id="logService" class="com.org.momo.service.impl.LogServiceImpl">
        <property name="logDao" ref="logDao"></property>
    </bean>
    <bean id="studentService" class="com.org.momo.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"></property>
    </bean>
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
	</bean>
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
    
    
    <bean id="teamDao" class="com.org.momo.dao.hibernateTemplate.TeamDaoHibernateTemplate">
		<property name="hibernateTemplate" ref="hibernateTemplate"/>
	</bean>
    <bean id="adminDao" class="com.org.momo.dao.hibernateTemplate.AdminDaoHibernateTemplate">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>
    <bean id="logDao" class="com.org.momo.dao.hibernateTemplate.LogDaoHibernateTemplate">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>
    <bean id="studentDao" class="com.org.momo.dao.hibernateTemplate.StudentDaoHibernateTemplate">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>
    

    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    </bean>
</beans>


2.HibernateTemplate

  package com.org.momo.dao.hibernateTemplate;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.org.momo.bean.PageInfo;
import com.org.momo.bean.Team;
import com.org.momo.dao.TeamDao;

public class TeamDaoHibernateTemplate extends HibernateDaoSupport implements TeamDao {

	public void deleteById(Integer id) throws Exception {
        Team team = this.getHibernateTemplate().load(Team.class, id) ;
		this.getHibernateTemplate().delete(team) ;
	}

	public List<Team> findAll() throws Exception {
		return this.getHibernateTemplate().loadAll(Team.class);
	}

	public Team findById(Integer id) throws Exception {
		List<Team> teams = this.getHibernateTemplate().find("from Team where id=?",id) ;
		if(!teams.isEmpty()){
			return teams.get(0) ;
		}else{
		return null;
		}
	}

	public void insert(Team team) throws Exception {
		this.getHibernateTemplate().save(team) ;
	}

	public void update(Team team) throws Exception {
		this.getHibernateTemplate().update(team);
	}

	public List<Team> findAllPage(final PageInfo pageInfo) throws Exception {
		List<Team> teams = null;
		
		int rowTotal = ((Long)this.getHibernateTemplate().find("select count(id) from Team").get(0)).intValue();
		int pageTotal = rowTotal/pageInfo.getPageRows();
		if(rowTotal%pageInfo.getPageRows() > 0) {
			pageTotal++;
		}
		pageInfo.setPageTotal(pageTotal);
		
		teams = this.getHibernateTemplate().executeFind(new HibernateCallback(){
			public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				Query query = session.createQuery("from Team");
				query.setFirstResult(pageInfo.getPageRows()*(pageInfo.getCurrentPage()-1));
				query.setMaxResults(pageInfo.getPageRows());
				return query.list();
			}
			
		});
		
		return teams;
	}

}
  • 大小: 38.7 KB
分享到:
评论

相关推荐

    Hibernate实现原理模拟

    **Hibernate实现原理模拟** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本教程将通过模拟Hibernate的实现原理,帮助开发者深入理解其工作方式,以便更好地运用到实际...

    Hibernate orm 实现原理

    Hibernate orm 实现原理 主要讲解了关于hibernate 的一些知识

    Hibernate框架ORM的实现原理

    ### Hibernate框架ORM的实现原理详解 #### 一、ORM概念及意义 **ORM**,即**对象关系映射**(Object Relational Mapping),是一种程序技术,用于将关系型数据库中的数据映射到对象上,以便于程序员能够以面向对象的...

    Hibernate、Spring和Struts工作原理及使用理由

    【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....

    JSF+hibernate实现批量删除

    本篇文章将详细探讨如何利用JSF与Hibernate相结合来实现批量删除功能,以及在CRUD(创建、读取、更新和删除)操作中的应用。 首先,我们需要理解JSF的工作原理。JSF是一个基于组件的MVC(Model-View-Controller)...

    Struts + Spring + Hibernate工作原理解析

    Struts、Spring和Hibernate是Java开发中非常著名的三个开源框架,它们共同构成了经典的"SSH...通过阅读《Struts + Spring + Hibernate工作原理解析》文档,你可以更系统地掌握这些知识,为你的项目开发带来极大的帮助。

    spring+struts+hibernate工作原理

    Spring+Struts+Hibernate(SSH)是Java EE领域中一种经典的开源框架组合,用于构建企业级的Web应用程序。这个框架组合充分利用了各自的优势,实现了松散耦合的三层架构,提高了代码的可重用性和可维护性。 首先,让...

    Hibernate原理

    ### Hibernate原理深度解析 #### Hibernate为何重要? Hibernate作为一款开源的对象关系映射(ORM)框架,在Java开发领域占据着举足轻重的地位。其重要性体现在以下几个方面: 1. **资源管理**:Hibernate通过...

    详解hibernate4基本实现原理

    **Hibernate4基本实现原理** Hibernate 是一款流行的 Java ORM(对象关系映射)框架,它允许开发者将数据库操作与 Java 对象交互,简化了数据库应用程序的开发。本文将深入解析 Hibernate4 的基本实现流程,帮助...

    Spring+Hibernate+Struts工作原理

    【Hibernate工作原理】 Hibernate是一个ORM(Object-Relational Mapping)框架,它将Java对象与关系数据库的数据进行映射,实现了对象与数据库之间的一套映射规则。其主要工作流程包括: 1. 加载并解析配置文件和...

    Hibernate4实战

    #### 六、Hibernate实现原理剖析 对于想要深入了解Hibernate内部机制的开发者,《Hibernate4实战》提供了关于Hibernate如何工作的深度解析。这包括缓存机制、懒加载、代理模式以及查询优化等方面的知识点。通过理解...

    hibernate+mysql基本原理示例

    在"hibernate+mysql基本原理"示例中,可能包含了一个简单的用户管理系统的实现,包括用户注册、登录、查询等功能。这个例子旨在帮助初学者理解如何在实际项目中整合Hibernate和MySQL,以及如何在JSP页面上展示数据。...

    hibernate实现分页查询

    ### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。...以上就是关于Hibernate实现分页查询的具体介绍,希望对大家有所帮助。

    java模拟hibernate实现

    本项目通过Java的反射和注解技术,试图模拟Hibernate的部分功能,以便更好地理解和掌握ORM的核心原理。 1. **Java反射**: 反射是Java提供的一种强大的动态类型特性,允许程序在运行时获取类的信息(如类名、属性、...

    hibernate的原理详细解说

    ### Hibernate原理详细解说 #### Hibernate概述 Hibernate 是一个开源的对象关系映射(Object Relational Mapping,简称 ORM)框架,用于 Java 应用程序与关系型数据库之间的交互。它通过将对象模型与数据库模型...

    struts工作原理图、spring框架结构图、hibernate工作原理图

    3. Hibernate工作原理: Hibernate 是一个流行的Java ORM(Object-Relational Mapping)框架,它简化了数据库操作,使开发者能够以面向对象的方式处理数据。其工作流程如下: - 应用程序创建SessionFactory,这是...

    Hibernate原理解析

    **Hibernate原理解析** Hibernate是一个开源的Java语言下的对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作与业务逻辑解耦,使得代码更加...

    8Hibernate原理与实现简介

    【Hibernate原理与实现简介】 Hibernate 是一款流行的Java平台上的对象关系映射(ORM)框架,它的主要作用是简化数据库操作,将复杂的SQL语句和Java对象之间的转换工作自动化,从而提高开发效率。Hibernate通过将...

    Struts2+Hibernate实现新闻发布系统

    在"Struts2+Hibernate实现新闻发布系统"中,Action类可能被用来接收用户发布的新闻信息,如标题、内容、发布日期等,然后调用相应的服务或DAO进行处理。 Struts2还提供了拦截器(Interceptor)机制,可以添加自定义...

    Hibernate工作原理及为什么要用

    下面将详细解释Hibernate的工作原理,以及为何在开发中需要使用它。 **工作原理:** 1. **读取并解析配置文件**:Hibernate首先读取hibernate.cfg.xml配置文件,从中获取数据库连接信息、方言设置等关键配置。 2....

Global site tag (gtag.js) - Google Analytics