用hibernate和spring整合做小例子对数据库增删改查

用hibernate和spring整合做小例子对数据库增删改查  

注意:先添加hibernate能力,再添加spring能力,最后逆向数据库

一.配置applicationContext.xml

1.

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


 2.管理sessionFactory:(创建SessionFactory 实例)

  <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation"
   value="classpath:hibernate.cfg.xml">
  </property>
  </bean>

SessionFactory接口

一个SessionFactory对应一个数据源,它是个重量级对象,不可随意生成多个实例。对于一般的单数据库应用来说,只需要一个SessionFactory就足够了。当然如果有多个数据库的话,还是需要为每个数据库生成对应的SessionFactory。它是线程安全的,同一个实例可以被应用中的多个线程共享。

理解:

(1)Hibernate的核心接口之一:
SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory
(2)Hibernate 的 SessionFactory,是单个数据库映射关系编译后的内存镜像,是Hibernate执行持久化访问的基础部分。大部分情况下,一个 J2EE 应用对应一个数据库。而Spring 通过ApplicationContext管理SessionFactory无须采用单独Hiberate应用所必需的hibernate.cfg.xml文件Spring 配置管理SessionFactory 与数据库的连接。而在实际的J2EE应用中,数据源会采用依赖注入的方式,传给 Hibernate 的 SessionFactory。具体配置如下所示:

<?xml version="1.0" encoding="gb2312"?>
<!--Spring配置文件的DTD定义--〉
<!DOCTYPE beans PUBLIC"-//SPRiNG//DTDBEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd">
<!--Spring配置文件的根元素是beans-->
<beans>
<!--定义数据源,该bean的 ID 为 dataSource-->
<bean id="dataSource" class="org.springframework.jdbc.
datasource.DriverManagerDataSource"><!…指定数据库驱动--〉
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<!--指定连接数据库的URL--〉
<property name="url"><value>jdbc:mysql://wonder:3306/
j2ee</ value></property><!--root 为数据库的用户名…〉
<property name="username"><value>root</value></property><!--pass 为数据库密码--〉
<property name="password"><value>pass</value></property></bean>
<!--定义Hibernate的 SessionFactory-->
<beanid="sessionFactory"class="org.springframework.
orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入数据源,注入正是上文定义的dataSource>
<property name="dataSource"><ref local="dataSource"/>
</property><! --mappingResouces属性用来列出全部映射文件〉
<property name="mappingResources"><list>
<!--以下用来列出所有的PO 映射文件-->
<value>lee/MyTest.hbm.xml</value></list></property>
<!--定义Hibernate的 SessionFactory的属性一〉
<property name="hibernateProperties"><props>
<!--指定Hibernate的连接方法一〉
<propkey="hibernate.dialect">org.hibernate.dialect.
MySQLDialect</prop>
<!-- 不同数据库连接,启动时选择create,update, create-drop-->
<prop key="hibernate.hbm2ddl.auto">update</prop></props></property></bean></beans>

(3)SessionFactory由ApplicationContext管理,并随着应用启动时自动加载,可以被处于ApplicaionContext管理的任意一个bean引用,比如DAOHibernate的数据库访问需要在Session管理下,而SessionFactory是 Session的工厂。 Spring采用依赖注入为DAO对象注入SessionFactory的引用。

Spring也提供了Hibernate的简化访问方式,Spring采用模板设计模式,提供Hibernate访问与其他持久层访问的一致性。如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 dataSource Bean 替换成如下所示:

<!--此处配置 JNDI 数据源--〉
<bean id="myDataSource" class="org.springframework.
jndi.JndiObjectFactoryBean"><property name="jndiName">
<!--指定数据源的JNDI-->
<value>java:comp/env/jdbc/myds</value></property></bean>

 3. 创建 Configuration 实例:
   <bean id="TUserDAO" class="userHib.TUserDAO">//数据库中的用户表逆向回来
   <property name="sessionFactory">
   <ref bean="sessionFactory" />
   </property>
   </bean>

创建 Configuration 实例:Configuration用于配置并启动Hibernate。Hibernate应用通过Configuration的实例来指定对象-关系映射文件,或通过Configuration动态配置Hibernate的属性,然后通过Configuration来创建相应的SessionFactory实例。

4.创建 Session 实例
 <bean id="wj" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory">
 <ref bean="sessionFactory"/>
 </property>
 </bean>

从SessionFactory中可以获得Session实例。

Session接口是Hibernate应用中使用最广泛的接口了,它是持久化管理器,提供添加、更新、删除、加载、查询对象。Session不是线程安全的,所以应避免多个线程共享同一个Session实例。Session是轻量级对象,它的创建和销毁不需要太多资源,这意味着在应用中可以经常创建和销毁Session对象。

Session有一个缓存,称之为Hibernate的一级缓存,它存放当前工作单元加载的持久化对象,每个Session都有自己的缓存,缓存中的对象只能被当前工作单元访问。

5.TUserDAO的代理类
 <bean id="TUserDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 <property name="proxyTargetClass"><value>true</value></property>

6.Transaction接口(打开事务;开始持久化访问;提交事务;如果遇到异常,回滚事务; 关闭Session)

Transaction是Hibernate的数据库事务接口,它对底层道德事务接口进行了封装,底层事务接口包括:

    JDBC API

    JTA(Java Transaction API)

    CORBA(Common Object Requet Broker Architecture) API

Hibernate应用可以通过一致Transaction接口来声明事务边界,这有助于应用可以在不同的环境或容器中移植。具体的事务实现使用在Hibernate.properties中进行指定。


 <property name="transactionManager">
 <ref bean="wj"/>//session实例
 </property>
 <property name="target">//联系DAO和代理类
 <ref local="TUserDAO"/></property>
 <property name="transactionAttributes">//使具有什么功能
 <props>
 <prop key="*">PROPAGATION_REQUIRED</prop>//需要事务支持

<!--    

<prop key="attach*">PROPAGATION_REQUIRED</prop>

<prop key="insert*">PROPAGATION_REQUIRED</prop>   插入

<prop key="save">PROPAGATION_REQUIRED</prop>   保存

<prop key="update*">PROPAGATION_REQUIRED</prop>  更新 

<prop key="merge.*">PROPAGATION_REQUIRED</prop>更新

<prop key="edit*">PROPAGATION_REQUIRED</prop>   

 <prop key="del*">PROPAGATION_REQUIRED</prop>  删除 

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>   

<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>   

<prop key="disPlay*">PROPAGATION_REQUIRES_NEW</prop>  

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>

 

  --> 
 </props>
 </property>
 </bean>
 </beans>

7.Query和Criteria接口

这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。Query实例包装了一个HQL(Hibernate Query Language)来查询。Criteria接口完全封装了基于字符串形式的查询语句,比Query更面向对象,Criteria更擅长执行动态查询

二.测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import userHib.TUser;
import userHib.TUserDAO;


public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
  TUserDAO td=(TUserDAO)ac.getBean("TUserDAOProxy");
  TUser user=td.findById("2");//查询
  System.out.print(user.getPassword());
  TUser user1=new TUser();
  user1.setUserId("11");
  user1.setUserName("11");
  user1.setPassword("11");
  td.save(user1);//增加
  TUser user2=td.findById("3");
  td.delete(user2);//删除
  TUser user3=td.findById("4");
  user3.setUserName("5");
  user3.setPassword("5");
  td.merge(user3);//更改
 }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值