`
chaoyi
  • 浏览: 309200 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SSH 银行声明式事务

 
阅读更多

Bank 实体类及映射文件

package cn.entity;
import java.util.HashSet;
import java.util.Set;
public class Bank implements java.io.Serializable {
	private String cardId;
	private String userName;
	private Double money;
	private Set transInfos = new HashSet(0);
	public Bank() {
	}
	public Bank(String userName, Double money) {
		this.userName = userName;
		this.money = money;
	}
	public Bank(String userName, Double money, Set transInfos) {
		this.userName = userName;
		this.money = money;
		this.transInfos = transInfos;
	}
	public String getCardId() {
		return this.cardId;
	}
	public void setCardId(String cardId) {
		this.cardId = cardId;
	}
	public String getUserName() {
		return this.userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Double getMoney() {
		return this.money;
	}
	public void setMoney(Double money) {
		this.money = money;
	}
	public Set getTransInfos() {
		return this.transInfos;
	}
	public void setTransInfos(Set transInfos) {
		this.transInfos = transInfos;
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="cn.entity.Bank" table="BANK" schema="BANKDB">
		<id name="cardId" type="java.lang.String">
			<column name="CARD_ID" length="50" />
			<generator class="sequence">
				<param name="sequence">seq_bank</param>
			</generator>
		</id>
		<property name="userName" type="java.lang.String">
			<column name="USER_NAME" length="30" not-null="true" />
		</property>
		<property name="money" type="java.lang.Double">
			<column name="MONEY" precision="126" scale="0" not-null="true" />
		</property>
		<set name="transInfos" inverse="true">
			<key>
				<column name="TRANS_CARD_ID" length="50" not-null="true" />
			</key>
			<one-to-many class="cn.entity.TransInfo" />
		</set>
	</class>
</hibernate-mapping>

 

TransInfo 实体类及映射文件

package cn.entity;
import java.util.Date;
public class TransInfo implements java.io.Serializable {
	private Long id;
	private Bank bank;
	private Double transMoney;
	private Date transDate;
	public TransInfo() {
	}
	public TransInfo(Bank bank, Double transMoney, Date transDate) {
		this.bank = bank;
		this.transMoney = transMoney;
		this.transDate = transDate;
	}
	public Long getId() {
		return this.id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Bank getBank() {
		return this.bank;
	}
	public void setBank(Bank bank) {
		this.bank = bank;
	}
	public Double getTransMoney() {
		return this.transMoney;
	}
	public void setTransMoney(Double transMoney) {
		this.transMoney = transMoney;
	}
	public Date getTransDate() {
		return this.transDate;
	}
	public void setTransDate(Date transDate) {
		this.transDate = transDate;
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="cn.entity.TransInfo" table="TRANS_INFO" schema="BANKDB">
		<id name="id" type="java.lang.Long">
			<column name="ID" precision="10" scale="0" />
			<generator class="sequence">
				<param name="sequence">seq_trans_info</param>
			</generator>
		</id>
		<many-to-one name="bank" class="cn.entity.Bank" fetch="select">
			<column name="TRANS_CARD_ID" length="50" not-null="true" />
		</many-to-one>
		<property name="transMoney" type="java.lang.Double">
			<column name="TRANS_MONEY" precision="126" scale="0" not-null="true" />
		</property>
		<property name="transDate" type="java.util.Date">
			<column name="TRANS_DATE" length="11" not-null="true" />
		</property>
	</class>
</hibernate-mapping>

 

BankDao 数据访问层接口及实现

package cn.dao;
import cn.entity.Bank;
/**
 * 账户 DAO
 * */
public interface BankDao {
	/**
	 * 更新账户
	 * @param bank
	 */
	public void update(Bank bank);
	/**
	 * 通过卡号到一个账户信息
	 * @param cardId
	 * @return
	 */
	public Bank get(String cardId);
}

 

package cn.dao.impl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.dao.BankDao;
import cn.entity.Bank;
/**
 * 账户 DAO
 */
public class BankDaoImpl extends HibernateDaoSupport implements BankDao {
	public void update(Bank bank) {
		super.getHibernateTemplate().update(bank);
	}
	public Bank get(String cardId) {
		return super.getHibernateTemplate().get(Bank.class, cardId);
	}
}

 

TransInfoDao 数据访问层接口及实现

package cn.dao;
import cn.entity.TransInfo;
/**
 * 交易信息 DAO
 * */
public interface TransInfoDao {
	/**
	 * 添加一条交易信息
	 * @param info
	 */
	public void save(TransInfo info);
}

 

package cn.dao.impl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.dao.TransInfoDao;
import cn.entity.TransInfo;
public class TransInfoDaoImpl extends HibernateDaoSupport implements TransInfoDao {
	public void save(TransInfo info) {
		super.getHibernateTemplate().save(info);
	}
}

 

BankBiz 业务逻辑层接口及实现

package cn.biz;
/**
 * 银行业务类
 */
public interface BankBiz {
	/**
	 * 转帐的业务方法
	 * @param fromCardId 从哪个卡
	 * @param toCardId 转到哪个卡
	 * @param money 钱
	 */
	public void transferAccount(String fromCardId,String toCardId,double money);
	/**
	 * 存钱业务方法
	 * @param cardId 卡号
	 * @param money 钱
	 */
	public void deposit(String cardId,double money);
	/**
	 * 取钱业务方法
	 * @param cardId 卡号
	 * @param money 钱
	 */
	public void withdraw(String cardId,double money);
}

 

package cn.biz.impl;
import java.util.Date;
import cn.dao.BankDao;
import cn.dao.TransInfoDao;
import cn.entity.Bank;
import cn.entity.TransInfo;
import cn.biz.BankBiz;
public class BankBizImpl implements BankBiz {
	private BankDao bankDao;//账户DAO
	private TransInfoDao transInfoDao;//交易DAO
	public void setBankDao(BankDao bankDao) {
		this.bankDao = bankDao;
	}
	public void setTransInfoDao(TransInfoDao transInfoDao) {
		this.transInfoDao = transInfoDao;
	}
	/**
	 * 转账
	 */
	public void transferAccount(String fromCardId, String toCardId, double money) {
		System.out.println("---转账操作---");
		//一个账号存入钱
		this.deposit(toCardId, money);
		//另一个账号取钱
		this.withdraw(fromCardId, money);
	}
	/**
	 * 存钱
	 */
	public void deposit(String cardId, double money) {
		//通过 ID 得到账户信息
		Bank bank =bankDao.get(cardId);
		bank.setMoney(bank.getMoney()+money);
		//更新了表
		bankDao.update(bank);
		//往交易表记录流水账
		TransInfo t =new TransInfo();
		t.setBank(bank);
		t.setTransDate(new Date());
		t.setTransMoney(money);
		//加入了一条记录
		transInfoDao.save(t);
		System.out.println("卡号:"+cardId+"存入:"+money+"余额是:"+bank.getMoney());
	}
	/**
	 * 取钱
	 */
	public void withdraw(String cardId, double money) {
		//通过 ID 得到账户信息
		Bank bank=bankDao.get(cardId);
		bank.setMoney(bank.getMoney()-money);
		//更新了记录
		bankDao.update(bank);
		//添加交易信息
		TransInfo t=new TransInfo();
		t.setBank(bank);
		t.setTransDate(new Date());
		t.setTransMoney(-money);
		//添加了记录
		transInfoDao.save(t);
		System.out.println("卡号:"+cardId+"取出:"+money+"余额是:"+bank.getMoney());

	}
}

 

applicationContext.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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<!-- 数据源配置 -->  
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />  
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:oracle11" />  
        <property name="username" value="bankDB" />  
        <property name="password" value="123456" />  
    </bean> 
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.Oracle10gDialect
				</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>cn/entity/Bank.hbm.xml</value>
				<value>cn/entity/TransInfo.hbm.xml</value>
			</list>
		</property>
	</bean>
	<!-- dao -->
	<bean id="bankDao" class="cn.dao.impl.BankDaoImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<bean id="transDao" class="cn.dao.impl.TransInfoDaoImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<!-- 业务类同时注入2个 Dao -->
	<bean id="bankBiz" class="cn.biz.impl.BankBizImpl">
		<property name="bankDao" ref="bankDao" />
		<property name="transInfoDao" ref="transDao" />
	</bean>
	<!-- 1.配置事物管理 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>
	<!-- 2.事物规则 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 可以比较加上这句和删除这句转账的区别,默认为 REQUIRED,可省 -->
			<tx:method name="transferAccount" propagation="REQUIRED" />
			<tx:method name="deposit" propagation="REQUIRED" />
			<tx:method name="withdraw" propagation="REQUIRED" />
			<tx:method name="get*" read-only="true" propagation="SUPPORTS" />
			<!-- 查询操作采用只读操作 -->
			<tx:method name="*" rollback-for="Exception"
				no-rollback-for="NullPointerException,ClassCastException" />
		</tx:attributes>
	</tx:advice>
	<!-- 3.把业务规则和类关联起来 -->
	<aop:config>
		<aop:pointcut id="bankBizMethods" expression="execution(* cn.biz..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="bankBizMethods" />
	</aop:config>
</beans>

 

Test 测试数据

package cn.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.biz.BankBiz;
public class Test {
	public static void main(String[] args) {
		ApplicationContext tx =new ClassPathXmlApplicationContext("applicationContext.xml");
		BankBiz bankBiz=(BankBiz) tx.getBean("bankBiz");
		//存钱
		//bankBiz.deposit("11111", 10000);
		//转账
		//bankBiz.transferAccount("22222", "33333", 6000);
		//取钱
		bankBiz.withdraw("11111", 12000);
	}
}

 

 效果图:

 

 

 

 

 

 

  • 大小: 79 KB
分享到:
评论

相关推荐

    声明式事务处理 SSh

    在IT行业中,声明式事务处理是一种广泛应用于Java企业级应用中的技术,主要通过Spring框架来实现。相较于编程式事务管理,声明式事务处理更加简洁、易于维护,它将事务管理与业务逻辑解耦,使开发者可以专注于业务...

    ssh整合+spring声明式事务

    在SSH整合中,Spring的声明式事务管理是一个关键部分,它允许开发者无需在业务代码中显式控制事务的开始、提交和回滚,而是通过配置来决定哪些方法应该在事务中执行。 首先,让我们来看看SSH整合的步骤: 1. **...

    在SSH框架中加入事务支持

    在SSH框架中,Spring是主要负责事务管理的组件,它提供了编程式和声明式两种事务管理方式。 **声明式事务管理**是Spring提供的强大特性,它允许开发者通过配置XML或注解来定义事务边界,无需在代码中显式处理。在...

    基于SSH的银行管理系统

    此外,Spring3还提供了事务管理服务,可以配合Hibernate进行声明式事务控制,确保业务操作的原子性和一致性。 4. **MyEclipse**:MyEclipse是集成开发环境(IDE)的一种,它为Java开发者提供了丰富的功能,包括代码...

    带事务的ssh框架源代码

    总结来说,这个“带事务的ssh框架源代码”着重展示了SSH框架如何在不同版本的Spring中处理事务,特别是Spring的声明式事务管理特性。通过深入学习这部分源代码,开发者可以更好地理解如何在实际项目中实现高效、安全...

    基于SSH银行管理系统.zip

    在银行系统中,Spring可以管理数据库连接池、事务管理、服务层接口及其实现等,确保了系统的稳定性和可测试性。 再者,Hibernate是Java持久化框架,它简化了数据库操作,提供了对象-关系映射(Object-Relational ...

    spring 声明式事务

    1.本例子的使用了 ssh 框架 2.本例子DAO层 使用了 getHibernateTemplate 来实现数据的新增修改和删除 3.本例子使用了声明式...4.本例子提供了详细的使用方法,可以根据 readme.txt 来逐步的验证声明式事务是否起作用

    SSH整合 银行管理系统

    在开发过程中,SSH框架的集成可以有效地提高开发效率,通过模块化的设计降低复杂性,同时,Spring的事务管理能够确保银行系统的数据一致性。项目中的"ESHop"可能是电子商务相关的子模块,可能是模拟了部分银行业务与...

    SSH框架银行系统(sql 数据库)

    在这个“SSH框架银行系统”中,它利用这三个组件来实现一个完整的银行系统,包括存款、取款、转账等核心功能。下面将详细介绍SSH框架及其在银行系统中的应用。 **Struts2** 是MVC(Model-View-Controller)设计模式...

    java-ssh Blank银行系统

    在银行系统中,Spring管理着所有对象的生命周期和依赖关系,比如数据库连接池、事务管理器等。它还通过Spring MVC模块支持Web应用程序的开发,与Struts协同工作,提供更灵活的控制层实现。 3. **Hibernate**: ...

    bank.zip_bank ssh_java_ssh_ssh银行_银行管理系统

    【标题】"bank.zip_bank ssh_java_ssh_ssh银行_银行管理系统" 指的是一款基于SSH框架开发的银行账目管理系统,该系统集成了多种功能,适用于处理银行日常业务操作。SSH是一个流行的企业级Web应用程序开发框架,由...

    ssh分页.事务

    在SSH中,事务的管理通常基于Spring的声明式事务,通过在方法上添加@Transactional注解来指定事务的属性,如传播行为、隔离级别和超时设置。这样,当一个方法被调用时,Spring会自动开始一个事务,如果方法执行过程...

    ssh框架项目银行系统源码

    通过研究这个SSH框架银行系统的源码,开发者可以深入理解如何在实际项目中整合和使用这三个框架,掌握MVC架构的设计思想,以及数据库操作、事务管理等核心概念。同时,也能了解在银行系统这样的业务场景下,如何构建...

    SSH笔记-事务管理

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的“SSH笔记-事务管理”主要关注的是Spring框架中的事务管理部分。Spring以其强大的依赖注入和面向切面编程能力,提供了灵活...

    ssh事务整合

    SSH事务整合是Java后台开发中常见的一种技术组合,它涵盖了Spring、SpringMVC和Hibernate三个核心框架。这个项目展示了如何将这些组件有效地集成在一起,以实现一个完整的后端解决方案。 首先,Spring作为基础架构...

    网上银行系统SSH

    网上银行系统SSH是一个基于Spring、Struts2和Hibernate(SSH)三大开源框架的集成应用,旨在提供一个简单、易理解的网上银行系统实现。SSH框架是Java Web开发中常用的技术栈,Spring负责业务层管理,Struts2处理表现...

    基于SSH框架的模拟简单银行转账源代码

    Spring的声明式事务管理可以确保转账操作的原子性,即要么全部完成,要么全部回滚。如果转账过程中出现任何错误,整个操作会被回滚,确保账目的准确性。 5. **Java编程**:整个项目的基础是Java语言,它提供了丰富...

    step by step ssh 04 Spring 事务控制

    Spring的声明式事务管理通过在配置文件中定义事务规则,可以轻松地实现事务的开始、提交、回滚,确保数据的一致性。 Hibernate作为持久层框架,用于简化数据库操作。它提供了一种对象-关系映射(ORM)机制,使得...

Global site tag (gtag.js) - Google Analytics