spring整合hibernate

9 篇文章 0 订阅
8 篇文章 0 订阅

上次讲到了struts2与spring的整合,今天讲一下spring和hibernate的整合。
两者一般的分配角色是:hibernate负责和数据库打交道,主要实现的是dao层的业务逻辑。spring主要是工作在dao层上面的service层,调用dao层的业务功能完成service层的业务逻辑,同时对service层提供声明式事务。

spring整合hibernate步骤:

一:jar包,包括spring和hibernate的各自必须的jar包:

这里写图片描述

二:配置文件

hibernate配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

    <!-- 配置连接数据库的基本属性,这一部分可以写在spring框架的applicationcontext.xml文件中 -->

    <!-- 连接映射文件 ,同上,写在applicationcontext.xml文件中
    其实在spring整合hibernate的时候,hibernate的配置文件完全可以不要,而把所有配置信息写到applicationcontext.xml文件中
-->

    <!-- 基本属性 -->

    <property name="hibernate.show_sql">true</property>

    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

    <property name="hibernate.format_sql">true</property>

    <property name="hbm2ddl.auto">update</property>

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

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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    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-4.3.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    <!-- 配置数据源 -->

    <context:property-placeholder location="classpath:db.properties"/>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>

    <!-- 配置hibernate的sessionfactory -->

    <bean id="sessionfactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
        <property name="mappingLocations" value="classpath:com/sh/en/*.hbm.xml"></property>
    </bean>


    <!-- 配置事务管理器 -->
    <bean id="TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionfactory"></property>
    </bean>

    <!-- 配置事务属性 -->
    <tx:advice id="txadvice" transaction-manager="TransactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>


    <!-- 配置事务切入点 -->

    <aop:config>
        <aop:pointcut expression="execution(* com.service.*.*(..))" id="pointcut"/>
        <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut"/>
    </aop:config>

<!-- 配置dao层bean -->

    <bean id="bookdao" class="com.dao.BookDaoImp">
        <property name="sessionfactory" ref="sessionfactory"></property>
    </bean>

<!-- 配置service层 -->

<bean id="bookservice" class="com.service.BookService">
    <property name="bookdaoimp" ref="bookdao"></property>
</bean>


</beans>

下面看示例代码:

实体类:

book类:

public class Books {

    private Integer BookId;

    private String BookName;

    private Integer BookBalance;

    private Integer BookStore;

    public Integer getBookBalance() {
        return BookBalance;
    }

    public void setBookBalance(Integer bookBalance) {
        BookBalance = bookBalance;
    }

account类:

public class account {

    private Integer accountId;

    private String accountName;

    private Integer accountBalance;

    public Integer getaccountId() {
        return accountId;
    }

    public void setaccountId(Integer accountId) {
        accountId = accountId;
    }

    public String getaccountName() {
        return accountName;
    }

    public void setCountName(String accountName) {
        accountName = accountName;
    }

    public Integer getaccountBalance() {
        return accountBalance;
    }

    public void setCountBalance(Integer accountBalance) {
        accountBalance = accountBalance;
    }



}

映射文件:

book类:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-25 12:29:58 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.sh.en.Books" table="BOOKS">
        <id name="BookId" type="java.lang.Integer">
            <column name="BOOKID" />
            <generator class="native" />
        </id>
        <property name="BookName" type="java.lang.String">
            <column name="BOOKNAME" />
        </property>

        <property name="BookBalance" type="java.lang.Integer">
            <column name="BOOKBALANCE"></column>
        </property>

        <property name="BookStore" type="java.lang.Integer">
            <column name="BOOKSTORE" />
        </property>
    </class>
</hibernate-mapping>

account类:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-25 12:29:58 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>

    <class name="com.sh.en.Count" table="COUNT">
        <id name="CountId" type="java.lang.Integer">
            <column name="COUNTID" />
            <generator class="native" />
        </id>
        <property name="CountName" type="java.lang.String">
            <column name="COUNTNAME" />
        </property>
        <property name="CountBalance" type="java.lang.Integer">
            <column name="COUNTBALANCE" />
        </property>
    </class>
</hibernate-mapping>

dao层:无非就是数据库的增删改查

package com.dao;

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

import com.Exception.BookStoreException;
import com.Exception.CountBalanceException;

public class BookDaoImp implements BookDao{

    private SessionFactory sessionfactory;

    public SessionFactory getSessionfactory() {

        return sessionfactory;
    }

    public void setSessionfactory(SessionFactory sessionfactory) {

        this.sessionfactory = sessionfactory;
    }

    public Session GetSession()
    {
        return sessionfactory.getCurrentSession();
    }

    //查询书的单价
    @Override
    public int findbookpricebyname(String bookname) {

        String hql="SELECT b.BookBalance from Books b where b.BookName=?";

        Query query=GetSession().createQuery(hql).setString(0, bookname);

        return (int) query.uniqueResult();

    }
    //查询用户余额
    @Override
    public int findcountbalancebyname(String username) {

        String hql="select c.CountBalance from Count c where c.CountName=?";

        Query query=GetSession().createQuery(hql).setString(0, username);

        return (int) query.uniqueResult();
    }

    //更新书的库存
    @Override
    public void updatebookstore(String bookname) {
        //检查异常
        String hql="select b.BookStore from Books b where b.BookName=?";

        int bookstore=(Integer) GetSession().createQuery(hql).setString(0, bookname).uniqueResult();

        if(bookstore==0)
        {
            throw new BookStoreException("库存不足");
        }

        hql="update Books b set b.BookStore=b.BookStore-1 where b.BookName=?";

        GetSession().createQuery(hql).setString(0, bookname).executeUpdate();

    }

    //更新用户余额
    @Override
    public void updateacountbalance(String username,int price) {
        //检查异常
        String hql="select c.CountBalance from Count c where c.CountName=?";
        int countbalance=(int) GetSession().createQuery(hql).setString(0, username).uniqueResult();

        if(countbalance<price)
        {
            throw new CountBalanceException("余额不足");
        }
        hql="update Count c set c.CountBalance= c.CountBalance-? where c.CountName=?";
        GetSession().createQuery(hql).setInteger(0, price).setString(1, username).executeUpdate();
    }

}

service层:调用dao层的业务功能

import com.dao.BookDaoImp;



public class BookService {

    private BookDaoImp bookdaoimp;

    public BookDaoImp getBookdaoimp() {
        return bookdaoimp;
    }

    public void setBookdaoimp(BookDaoImp bookdaoimp) {
        this.bookdaoimp = bookdaoimp;
    }


    public int  findbookbalancebyname(String name)
    {
        return bookdaoimp.findbookpricebyname(name);
    }

    public void Countbuybook(String countname,String bookname)
    {
        bookdaoimp.updatebookstore(bookname);
        bookdaoimp.updateacountbalance(countname, bookdaoimp.findbookpricebyname(bookname));
    }


}

异常类:

public class BookStoreException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    public BookStoreException(String message)
    {
        super(message);
    }   
}
public class CountBalanceException extends RuntimeException{

    public CountBalanceException(String message)
    {
        super(message);
    }
}

三:编写测试



import static org.junit.Assert.*;

import java.sql.SQLException;

import javax.sql.DataSource;

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

import com.dao.BookDaoImp;
import com.service.BookService;

public class test {

    private BookService bookservice;

    private ApplicationContext ac;

    {

        ac=new ClassPathXmlApplicationContext("applicationcontext.xml");

        bookservice=ac.getBean(BookService.class);

    }

    @Test
    public void buybook()
    {
        bookservice.Countbuybook("Tom", "c++");

    }

    @Test
    public void testbookdao()
    {
        System.out.println(bookservice.findbookbalancebyname("java"));


    }

    @Test
    public void tests() throws SQLException {

        DataSource datasource=(DataSource) ac.getBean(DataSource.class);

        System.out.println(datasource.getConnection());
    }



}

上面只是简单的测试了一下,可以使用的

至此,spring和hibernate的整合完成,具体功能就根据项目需求了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring整合Hibernate是一种常见的Java开发组合,通过将SpringHibernate框架结合起来,可以实现更加灵活、高效的应用程序开发。下面是一个简单的Spring整合Hibernate的示例。 首先,我们需要创建一个Spring的配置文件applicationContext.xml,配置Hibernate的会话工厂、数据源以及其他相关的Bean。在该配置文件中,我们可以指定数据源、事务管理器,并定义Hibernate的会话工厂,以及设置SessionFactory所需要的Hibernate属性。 接下来,我们需要创建一个Hibernate的配置文件hibernate.cfg.xml,用于设置数据库连接、持久化实体类的映射关系等。在该配置文件中,我们可以指定数据库连接的URL、用户名和密码,还可以定义实体类与数据库表之间的映射关系。 然后,我们需要创建实体类,这些实体类将与数据库表对应。我们需要使用注解或XML来映射实体类与数据库表之间的字段关系。 接下来,在DAO层中定义接口和实现类。接口用于声明数据库操作的方法,而实现类则负责具体的数据库操作,包括增删改查等。在实现类中,我们可以使用Hibernate的API和查询语言来访问数据库,实现对数据库的操作。 最后,在Service层中定义业务逻辑的方法。Service层负责处理业务逻辑,并调用DAO层的方法访问数据库。在Service层中,我们可以通过@Transactional注解来定义事务的边界,保证数据库操作的一致性和完整性。 通过以上步骤,我们就完成了Spring整合Hibernate的基本配置和代码编写。在运行项目时,Spring会自动加载配置文件并创建相关的对象,同时会自动管理事务和会话等。 通过Spring整合Hibernate,我们可以充分发挥SpringHibernate各自的优势,实现数据库访问的灵活性、可扩展性和高性能。它们共同为Java开发提供了一个强大的框架,使得开发者能够更加便捷地开发出功能完善、高效稳定的应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值