Spring与Hibernate结合

一、先来看代码


1.准备好所需要的Jar包

antlr-2.7.6.jar
aopalliance-1.0.jar
c3p0-0.9.1.2.jar
commons-collections-3.2.1.jar
commons-logging.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate3.jar
javassist-3.11.0.GA.jar
jta-1.1.jar
ojdbc6.jar
slf4j-api-1.6.1.jar
spring-aop-3.2.4.RELEASE.jar
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
spring-jdbc-3.2.4.RELEASE.jar
spring-orm-3.2.4.RELEASE.jar
spring-tx-3.2.4.RELEASE.jar

2.准备数据库

create table USER_INFO(
id number(8,0) primary key,
USERNAME varchar2(32),
PASSWORD varchar2(32)
);

3.准备实体类

package net.csdn.model;

/**
 * 实体类
 * @author Bowen
 *
 */
public class UserInfoEntity {
    /** ********** 成员变量 ********** **/
    //映射表中的id字段
    private int id;
    //映射表中的username字段
    private String username;
    //映射表中的password字段
    private String password;

    /** ********** Get方法 ********** **/
    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    /** ********** Set方法 ********** **/
    public void setId(int id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }


}

4.准备映射文件

<?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 package="net.csdn.model">
    <class name="UserInfoEntity" table="USER_INFO">
        <id name="id" column="ID"/>
        <property name="username" />
        <property name="password" />
    </class>
</hibernate-mapping>

5.重点:配置Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 1) 通过C3P0连接池链接数据库-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
        <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl" />
        <property name="user" value="CNDS" />
        <property name="password" value="CNDS" />
        <property name="autoCommitOnClose" value="true" />
        <property name="checkoutTimeout" value="10000" />
        <property name="initialPoolSize" value="10" />
        <property name="minPoolSize" value="3" />
        <property name="maxPoolSize" value="20" />
        <property name="maxIdleTime" value="30000" />
        <property name="acquireIncrement" value="3" />
        <property name="maxIdleTimeExcessConnections" value="1800" />
    </bean>
    <!-- 2) 创建SessionFactory实例 -->
    <!-- 所有的配置都由spring维护(项目中不需要hibernate.cfg.xml) -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- a. 注入连接池 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- b. 注入hibernate常用配置 -->
        <property name="hibernateProperties">
            <props>
                <!-- 设置方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <!-- 设置是否显示SQL语句 -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- 设置是否自动更新 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!-- c. 注入映射配置 -->
        <property name="mappingLocations">
            <list>
                <!-- 向List加入配置文件对应的路径
                        这里要注意通常我们会将映射配置文件和实体类放置在同一个包内
                        那么该值默认是读取的Web目录
                        所以我们要在前面配置classpath:向目录引导至项目根目录
                        而这里也不是使用的完整类名的格式
                        而是使用的目录格式
                        配置文件的名字可以使用通配符 -->
                <value>classpath:net/csdn/model/*.hbm.xml</value>
            </list>
        </property>
    </bean>
    <!-- 3) 事务配置 -->
    <!-- a. 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <!-- 注入SessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- b. 配置事务管理方式 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <!-- 配置事务属性 -->
        <tx:attributes>
            <!-- 配置事务方法 -->
            <!-- 支持当前事务,如果执行到save开头的任何方法时没有事务则开启一个事务 这是最常见的方式
                propagation配置事务的处理方式        read-only配置是否只读
            --> 
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    <!-- c. AOP配置 -->
    <aop:config>
        <!-- 配置aop指向的路径 -->
        <aop:pointcut id="ap" expression="execution(* net.csdn.*.*(..))"/>
        <!-- 引用事务管理方式 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="ap" />
    </aop:config>
    <!-- hibernate封装的模版类 -->  
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="userInfoDaoImpl" class="net.csdn.dao.impl.UserInfoDaoImpl">
        <property name="hibernateTemplate" ref="hibernateTemplate"/>
    </bean>

    <bean id="userInfoEntity" class="net.csdn.model.UserInfoEntity"/>

</beans>

6.Dao层接口

package net.csdn.dao.inter;

import java.util.List;

import net.csdn.model.UserInfoEntity;
/**
 * Dao层接口
 * @author Bowen
 *
 */
public interface UserInfoDaoInter{
    /**
     * 保存
     * @param entity
     */
    public void save(UserInfoEntity entity);
    /**
     * 分页查询
     * @param hql
     * @param offset
     * @param length
     * @return
     */
    public List<UserInfoEntity> queryPage(final String hql,final int offset,final int length);
}

7.Dao层实现类

package net.csdn.dao.impl;

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.HibernateTemplate;

import net.csdn.dao.inter.UserInfoDaoInter;
import net.csdn.model.UserInfoEntity;

/**
 * Dao层实现类
 * @author Bowen
 *
 */
public class UserInfoDaoImpl implements UserInfoDaoInter{

    private HibernateTemplate hibernateTemplate;

    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
    /**
     * 保存方法
     */
    @Override
    public void save(UserInfoEntity entity){
        this.hibernateTemplate.save(entity);
    }
    /**
     * 这里举例一个常用的利用executeFind()方法获取到原始的session
     * 常用的比如分页查询便需要使用到这种方法
     * 在这个方法中用到了匿名类的应用
     * 注意要使用这个匿名类并且像里面传入变量,则必须将变量改为常量
     * 即使用final修饰
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public List<UserInfoEntity> queryPage(final String hql,final int offset,final int length){

        return this.hibernateTemplate.executeFind(new HibernateCallback(){
            @Override
            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(hql);
                query.setFirstResult(offset);
                query.setMaxResults(length);
                return query.list();
            }
        });
    }






}

8.测试类

package net.csdn.test;

import java.util.List;

import net.csdn.dao.inter.UserInfoDaoInter;
import net.csdn.model.UserInfoEntity;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试类 通过Junit单元测试功能来实现测试
 * 
 * @author Bowen
 * 
 */
public class TestClass {
    //定义的Dao层接口
    private UserInfoDaoInter userInfoDaoInter;
    //定义的实体类
    private UserInfoEntity userInfoEntity;

    private ApplicationContext context;

    /**
     * 在测试前先注入
     */
    @Before
    public void init() {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
        this.userInfoDaoInter = (UserInfoDaoInter) context.getBean("userInfoDaoImpl");
        this.userInfoEntity = (UserInfoEntity) context.getBean("userInfoEntity");
    }
    /**
     * 测试保存方法
     */
    @Test
    public void testSave(){
        userInfoEntity.setId(1101);
        userInfoEntity.setUsername("csdn");
        userInfoEntity.setPassword("csdn");
        userInfoDaoInter.save(userInfoEntity);
    }
    /**
     * 测试分页查询
     */
    @Test
    public void testQueryPage(){
        List<UserInfoEntity> list = userInfoDaoInter.queryPage("from UserInfoEntity", 0, 3);
        for(UserInfoEntity userInfo:list){
            System.out.println(userInfo.getUsername());
        }
    }
}

9.最终目录结构图

这里写图片描述

二 、简述

Spring结合Hibernate可以有效的进行AOP(切面)结构的搭建,并且通过Spring的事务管理机制来管理Hibernate的事务从而提高开发效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值