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

     */

    

    @Autowired

    private SessionFactory sessionFactory;

    

    public Session getSession(){

        return sessionFactory.getCurrentSession();

    }

    @Override

    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();

    }

 

    @Override

    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();

    }

 

    @Override

    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{

    @Autowired

    private BookShopDao bookShopDao;

    

    @Override

    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=?

Hibernate:

update

SH_ACCOUNT

set

BALANCE=?

where

USER_NAME=?

 

 

Spring Hibernate 事务的流程

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

3若方法出现异常,则

    ① 回滚事务

  1. 使和当前线程绑定的Session解除绑定
  2. 关闭Session

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

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

    摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...

  2. mybatis与spring的整合(代码实现)

    mybatis与spring的整合(代码实现) 需要jar包: mybatis核心包:依赖包:log4j包:spring croe;beans;tx;aop;aspects;context;expre ...

  3. Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 依赖 <dependencies> <dependency> <groupId>org.spri ...

  4. spring之整合Hibernate

    spring整合Hibernate整合什么? 1.让IOC容器来管理Hibernate的SessionFactory. 2.让Hibernate使用上spring的声明式事务. 整合步骤: 1.加入H ...

  5. Spring Data-Spring整合Hibernate基于JPA规范

    JPA:由 Sun 公司提供了一对对于持久层操作的标准(接口+文档) Hibernate:是 Gavin King 开发的一套对于持久层操作的自动的 ORM 框架. Hibernate JPA:是在 ...

  6. Java框架:spring框架整合hibernate框架的xml配置(使用注解的方式)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. spring框架整合hibernate框架简单操作数据库

    1.配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...

  8. Spring笔记——配置Hibernate框架事务

    原文:http://www.iteye.com/topic/1123347 Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这 ...

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

    1.导入jar watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400 ...

随机推荐

  1. javascript初学者注意事项

    注:以下属于个人学习中的理解不能保证全部正确,如果有错误以后修正. 1.javascript和c#语言一样严格区分大小写,有没有类的概念. 2.所有的变量声明都使用var,虽然能打出蓝色int,但却不 ...

  2. 一、Django的简介

    2019-04-09 22:58:22 大家好,我是一名普普通通的运维工程师,不甘平庸,想在工作之余多学习一些编程技能,不仅提升自我,还能应用于公司的运维自动化工作(代码的自动发布等).希望今后在这记 ...

  3. Redis全方位讲解--主从复制

    前言 前面介绍了redis持久化和容灾备份,这篇会介绍redis主从复制和redis持久化在主从复制中的一些应用.因为本人没有那么多服务器或机器,所以这里主要介绍下如何在docker容器中搭建主从复制 ...

  4. php如何实现统计一个数字在排序数组中出现的次数(代码)

    统计一个数字在排序数组中出现的次数. 博客 www.51msk.cn 1.有序的数组查找,使用二分法2.二分法查找第一次出现的位置,二分法查找最后一次出现的位置,end - start +1 left ...

  5. Verilog 奇数分频

    代码: module odd_div( ); ; //分频系数,3即3分频 ; reg clk, rstn, clk_div_pos, clk_div_neg; wire clk_div_out; : ...

  6. 几种交叉验证(cross validation)方式的比较

    模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...

  7. Java虚拟机笔记(四):垃圾收集器

    前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...

  8. SSISDB2:SSIS工程的操作实例

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  9. UWP 应用程序名称本地化以及商店显示名称本地化

    大家应该都知道,在做多语言的时候,我们一般会让App名字也会随着语言变化而本地化. 比如我的App微识别 https://www.microsoft.com/store/productId/9PDSN ...

  10. tabindex 属性

    tabindex 属性规定元素的 tab 键控制次序(当 tab 键用于导航时). 语法:<element tabindex="number">规定元素的 tab 键控 ...