Spring笔记⑤--整合hibernate代码测试

String整合hibernate代码测试

在上节生成的表中插入数据:

?

注意:使用myeclipse2014生成的整合项目可能存在问题需要我们自己导入。

?

第一步 我们写dao接口


package com.ssh.spring_hibernate.dao;

?

public
interface BookShopDao {

????//根据书号获取数的单价

????public
int findBookPriceByIsbn(String isbn);

????

????//更新书的库存,使书号对应的库存-1

????public
void updataBookStock(String isbn);

????

????//更新用户的账户余额:使username的balance-price

????public
void
updateUserAccount(String username,int price);

}

写好其实现类


package com.ssh.spring_hibernate.dao;

?

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

@Repository

public class BookShopDaoImpl implements BookShopDao {

????/**

???? * 怎么用hibernate

???? * 从SessionFactory中拿到跟当前线程绑定的Session

???? */

????

[email protected]

????private SessionFactory sessionFactory;

????

????public Session getSession(){

????????return sessionFactory.getCurrentSession();

????}

[email protected]

????public int findBookPriceByIsbn(String isbn) {

????????String hql="select b.price from Book b where b.isbn=?";

????????Query q=getSession().createQuery(hql).setString(0, isbn);

????????return (Integer) q.uniqueResult();

????}

?

[email protected]

????public void updataBookStock(String isbn) {

????????//验证书的库存是否足够

????????String hql2="select b.stock from Book b where b.isbn=?";

????????int stock=(Integer) getSession().createQuery(hql2).setString(0, isbn).uniqueResult();

????????if (stock==0) {

????????????System.out.println("库存不足!");

????????}

????????String hql="update Book b set b.stock=b.stock-1 where b.isbn=?";

????????getSession().createQuery(hql).setString(0, isbn).executeUpdate();

????}

?

[email protected]

????public void updateUserAccount(String username, int price) {

????????//验证余额是否足够

????????String hql2="select a.balance from Account a where a.username=?";

????????int balance=(Integer) getSession().createQuery(hql2).setString(0, username).uniqueResult();

????????System.out.println(balance);

????????if (balance<price) {

????????????System.out.println("余额不足");

????????}

????????int result=balance-price;

????????String hql="update Account a set a.balance=? where a.username=?";

????????getSession().createQuery(hql).setInteger(0, result).setString(1, username).executeUpdate();

????????System.out.println("余额为"+result);

????}

?

}

?

注意:需要在spring的配置文件中添加自动扫描的路径


<!-- 设置自动扫描的包-->

????<context:component-scan
base-package="com.ssh.spring_hibernate"></context:component-scan>

?

第二步写好service

public
interface BookShopService {

????public
void
purchase(String username,String isbn);

}

?

?

public
interface
Cashier {

????public
void checkout(String username,List<String>isbn);

}

?

其实现类


package com.ssh.spring_hibernate.service;

?

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

?

import com.ssh.spring_hibernate.dao.BookShopDao;

?

@Service

public class BookShopServiceImpl implements BookShopService{

[email protected]

????private BookShopDao bookShopDao;

????

[email protected]

????public void purchase(String username, String isbn) {

????????int price =bookShopDao.findBookPriceByIsbn(isbn);

????????bookShopDao.updataBookStock(isbn);

????????bookShopDao.updateUserAccount(username, price);

????}

?

}

?


package com.ssh.spring_hibernate.service;

?

import java.util.List;

?

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

?

@Service

public
class CashierImpl implements Cashier {

????@Autowired

????private BookShopService bookShopService;

????

????@Override

????public
void checkout(String username, List<String> isbn) {

????????for (String is : isbn) {

????????????bookShopService.purchase(username, is);

????????}

????????

????}

?

}

?

第三步写我们的测试类


public
class Go {

????

????private ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

????private BookShopService bookShopService=null;

????{

????????bookShopService=ctx.getBean(BookShopService.class);

????}

????

????public
void testDataSource () throws SQLException{

????????DataSource d=ctx.getBean(DataSource.class);

????????System.out.println(d.getConnection());

????}

????

????public
void testBookShopService(){

????????bookShopService.purchase("aa", "1002");

????}

????public
static
void main(String[] args) throws SQLException {

????????new Go().testBookShopService();

????}

}

?

?

控制台打印


Hibernate:

select

book0_.PRICE as col_0_0_

from

SH_BOOK book0_

where

book0_.ISBN=?

Hibernate:

select

book0_.STOCK as col_0_0_

from

SH_BOOK book0_

where

book0_.ISBN=?

Hibernate:

update

SH_BOOK

set

STOCK=STOCK-1

where

ISBN=?

Hibernate:

select

account0_.BALANCE as col_0_0_

from

SH_ACCOUNT account0_

where

account0_.USER_NAME=?

230

Hibernate:

update

SH_ACCOUNT

set

BALANCE=?

where

USER_NAME=?

余额为160

?

?

Spring Hibernate 事务的流程

  1. 在方法之前

    1. 获取Session
    2. 把Session和当前线程绑定,这样就可以在Dao中使用SessionFactory的getCurrentSession()方法来获取Session了
    3. 开启事务
  2. 若方法正常结束,即没有出现异常,则

    1. 提交事务
    2. 使和当前线程绑定的Session解除绑定
    3. 关闭Session

3若方法出现异常,则

????① 回滚事务

  1. 使和当前线程绑定的Session解除绑定
  2. 关闭Session
时间: 2024-10-01 23:05:30

Spring笔记⑤--整合hibernate代码测试的相关文章

【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明

摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFactory和数据库对应,有多少个数据库,就需要配置多少个sessionFactory: 2. session相当于数据库连接,进行数据库的CRUD操作时,需要开启session,用完需要关闭session: 3. 配置sessionFactory,主要要配置如下三个方面: 3.1. 数据源配置: 3.

基于注解的Spring MVC整合Hibernate

1.导入jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&

Java框架:spring框架整合hibernate框架的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" xmlns:context="http://www.springframework.org/sch

基于注解的Spring MVC整合Hibernate(所需jar包,spring和Hibernate整合配置,springMVC配置,重定向,批量删除)

1.导入jar watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"> 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version

Spring笔记⑥--整合struts2

Spring如何在web应用里面用 需要额外加入的jar包 Spring-web-4.0.0 Spring-webmvc-4.0.0 Spring的配置文件,没什么不同 ? 需要在web.xml下配置,使用myeclipse2014可自动生成 ? <!-- 启动ioc容器的servletcontextLin --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListen

spring 4 整合hibernate 4的新变化

1.在spring中注入hibernate4 sessionfactory时,没有AnnotationSessionFactoryBean,如果要使用Annotation进行映射,可以直接使用LocalSessionFactoryBean 2.当表名和类名不一样时,注解@[email protected]("t_user")会出现java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persisten

spring mvc 整合hibernate

配置分为两步 :1.引入jar包   2.xml文件配置

【Spring实战-3】Spring整合Hibernate、Struts

作者:ssslinppp      1. 摘要 版本: Spring4.0.4:Hibernate4.3.5:struts2.3.16: 主要介绍了如下内容: 项目结构的规划: Spring下整合Hibernate的具体过程: 整合struts的过程: 重点介绍Dao层的设计: 2. 项目结构 lib文件: 3. web.xml 因为需要整合struts和Hibernate,所以需要配置spring监听器.以及struts分发器. <?xml version="1.0" enco

Spring整合Hibernate的两种方式

在使用spring注解整合hibernate时出现"org.hibernate.MappingException: Unknown entity: com.ssh.entry.Product“异常的问题. 最后找到了问题,总结一下 1.spring整合hibernate,取代*.hbm.xml配置文件  在applicationContext.xml文件中配置方式 <!-- 创建sessionFactory --> <bean id="sessionFactory&q