dao层结束之后,来写service层,就是业务逻辑层,这一层也采用接口加impl的方式实现。比如atm的业务层:
package org.atm.service;
import java.util.*;
import org.atm.po.*;
public interface AtmService
{
/**
*返回卡的信息
*/
public Card getCard(String cardNumber);
/**
*显示余额
*/
public double showBalance(String cardNumber);
/**修改密码
*/
public void updateCardPass(String cardNumber,String newPassword);
/**取款
*/
public String getMoney(String cardNumber,double money,int atm_id);
/**存款
*/
public void putMoney(String cardNumber,double money,int atm_id);
/**转账
*/
public String transferMoney(String cardNumber,String tocardNumber,double money,int atm_id);
/**打印凭条(即打印最近一次CardLog)
*/
public CardLog printTip(String cardNumber);
/**查看存取记录
*/
public Set<CardLog> showCardLogs(String cardNumber);
}
package org.atm.service.impl;
import java.util.*;
import org.atm.dao.*;
import org.atm.service.*;
import org.atm.po.*;
import org.atm.util.*;
public class AtmServiceImpl implements AtmService
{
private AtmDao atmDao;
private CustomerDao customerDao;
private CardDao cardDao;
private CardLogDao cardlogDao;
private CardTypeDao cardtypeDao;
private BankDao bankDao;
private BankEmployeeDao bankemployeeDao;
private AtmLogDao atmlogDao;
public BankEmployeeDao getBankemployeeDao() {
return bankemployeeDao;
}
public void setBankemployeeDao(BankEmployeeDao bankemployeeDao) {
this.bankemployeeDao = bankemployeeDao;
}
public AtmDao getAtmDao() {
return atmDao;
}
public void setAtmDao(AtmDao atmDao) {
this.atmDao = atmDao;
}
public CustomerDao getCustomerDao() {
return customerDao;
}
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
public CardDao getCardDao() {
return cardDao;
}
public void setCardDao(CardDao cardDao) {
this.cardDao = cardDao;
}
public CardLogDao getCardlogDao() {
return cardlogDao;
}
public void setCardlogDao(CardLogDao cardlogDao) {
this.cardlogDao = cardlogDao;
}
public CardTypeDao getCardtypeDao() {
return cardtypeDao;
}
public void setCardtypeDao(CardTypeDao cardtypeDao) {
this.cardtypeDao = cardtypeDao;
}
public BankDao getBankDao() {
return bankDao;
}
public void setBankDao(BankDao bankDao) {
this.bankDao = bankDao;
}
public AtmLogDao getAtmlogDao()
{
return atmlogDao;
}
public void setAtmlogDao(AtmLogDao atmlogDao)
{
this.atmlogDao=atmlogDao;
}
/**
*返回卡的信息
*/
public Card getCard(String cardNumber)
{
return cardDao.findByCardNumber(cardNumber).get(0);
}
/**
*显示余额
*/
public double showBalance(String cardNumber)
{
return cardDao.findByCardNumber(cardNumber).get(0).getBalance();
}
/**修改密码
*/
public void updateCardPass(String cardNumber,String newPassword)
{
Card card=cardDao.findByCardNumber(cardNumber).get(0);
card.setPassword(newPassword);
cardDao.update(card);
System.out.println("密码更新成功");
}
/**取款
*/
public String getMoney(String cardNumber,double money,int atm_id)
{
Card card=cardDao.findByCardNumber(cardNumber).get(0);
double balance=card.getBalance();
if(balance>=money)
{
Atm atm=atmDao.get(atm_id);
if((atm.getMoney())>=money)
{
card.setBalance(balance-money);
cardDao.update(card);
CardLog cardlog=new CardLog();
cardlog.setId(1);
cardlog.setLogmessage("取款"+money);
cardlog.setCard(card);
cardlog.setTime(DateToString.getString(new Date()));
cardlog.setAtm(atmDao.get(atm_id));
cardlogDao.save(cardlog);
AtmLog atmlog=new AtmLog();
atmlog.setId(1);
atmlog.setLogmessage("-"+money);
atmlog.setAtm(atmDao.get(atm_id));
atmlog.setTime(DateToString.getString(new Date()));
atmlogDao.save(atmlog);
atm.setMoney(atm.getMoney()-money);
atmDao.save(atm);
return "正在出钞";
}
else
return "ATM余额不足";
}
else
return "账户余额不足";
}
/**存款
*/
public void putMoney(String cardNumber,double money,int atm_id)
{
Card card=cardDao.findByCardNumber(cardNumber).get(0);
card.setBalance(card.getBalance()+money);
cardDao.update(card);
//卡的记录
CardLog cardlog=new CardLog();
cardlog.setId(1);
cardlog.setLogmessage("存款"+money);
cardlog.setCard(card);
cardlog.setTime(DateToString.getString(new Date()));
cardlog.setAtm(atmDao.get(atm_id));
cardlogDao.save(cardlog);
//ATM的记录
AtmLog atmlog=new AtmLog();
atmlog.setId(1);
atmlog.setLogmessage("+"+money);
atmlog.setAtm(atmDao.get(atm_id));
atmlog.setTime(DateToString.getString(new Date()));
atmlogDao.save(atmlog);
Atm atm=atmDao.get(atm_id);
atm.setMoney(atm.getMoney()+money);
atmDao.save(atm);
}
/**转账
*/
public String transferMoney(String cardNumber,String tocardNumber ,double money,int atm_id)
{
Card card=cardDao.findByCardNumber(cardNumber).get(0);
double balance=card.getBalance();
if(balance>=money)
{
card.setBalance(card.getBalance()-money);
cardDao.update(card);
Card card2=cardDao.findByCardNumber(tocardNumber).get(0);
card2.setBalance(card2.getBalance()+money);
cardDao.update(card2);
CardLog cardlog=new CardLog();
cardlog.setId(1);
cardlog.setLogmessage("转"+money+"元到"+tocardNumber);
cardlog.setCard(card);
cardlog.setTime(DateToString.getString(new Date()));
cardlog.setAtm(atmDao.get(atm_id));
cardlogDao.save(cardlog);
return "正在转账";
}
else
return "账户余额不足";
}
/**打印凭条(即打印最近一次CardLog)
*/
public CardLog printTip(String cardNumber)
{
return cardlogDao.findLastLog(getCard(cardNumber));
}
/**查看存取记录
*/
public Set<CardLog> showCardLogs(String cardNumber)
{
return cardDao.findByCardNumber(cardNumber).get(0).getCardlogs();
}
}
可以看到,有了dao的基础业务层十分简单。这里要想到一个问题,就是业务逻辑层的实现类的属性要有全部的dao对象,如何创建这些对象,spring出场了,看看配置文件:
<bean id="serviceTemplate" abstract="true" lazy-init="true">
<property name="customerDao" ref="customerDao"/>
<property name="cardDao" ref="cardDao"/>
<property name="cardtypeDao" ref="cardtypeDao"/>
<property name="cardlogDao" ref="cardlogDao"/>
<property name="bankDao" ref="bankDao"/>
<property name="atmDao" ref="atmDao"/>
<property name="bankemployeeDao" ref="bankemployeeDao"/>
<property name="atmlogDao" ref="atmlogDao"/>
</bean>
<bean id="atmService" class="org.atm.service.impl.AtmServiceImpl" parent="serviceTemplate"/>
<bean id="bankEmployeeService" class="org.atm.service.impl.BankEmployeeServiceImpl" parent="serviceTemplate"/>
其中有两个业务逻辑atmService和bankEmployeeService,他们都具有所有dao层的对象作为属性,即使用时有spring框架依赖注入。
但是还要注意,我们希望业务层的每个方法具有事务性,即每个方法中对数据库的操作同时成功或者失败,这时我们要考虑事务管理,Spring框架提供了食物是管理,配置文件如下:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" />
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="leePointcut" expression="bean(atmService)||bean(bankEmployeeService)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="leePointcut"/>
</aop:config>
自此,业务逻辑层完毕。
分享到:
相关推荐
SSH4(struts2框架验证)02SSH4(struts2框架验证)02
SSH4(struts2框架验证)01SSH4(struts2框架验证)01SSH4(struts2框架验证)01
可以用于ssh的管理工具
ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ssh shhs ssh ...
SSHA(Salted SHA,加盐SHA)是一种增强版的SHA哈希算法,它在原始的SHA哈希基础上增加了一个随机的盐值,以提高密码的安全性。在Java中,SSHA常用于用户密码的存储,以防止彩虹表攻击。在本教程中,我们将深入探讨...
4. **SCP服务**:使用SCP协议进行文件传输,类似于FTP,但更安全。 5. **端口转发**:通过SSH隧道转发本地或远程端口,实现数据的安全传输。 6. **密钥管理**:支持RSA、DSA等公钥算法,进行密钥对的生成和管理。 ...
ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ssh 框架 ...
4. **远程服务器管理**:通过SSH,可以集成到终端模拟器(如Tmux、Screen)或者SSH客户端工具(如SSH Tunnel、MobaXterm),实现多会话管理和端口转发。 5. **容器化环境**:在Docker或Kubernetes中,SSH可用于容器...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。在IT领域,SSHshell是Linux或Unix类系统中常用的一种命令行接口,用于远程控制和管理服务器。通过SSH,用户可以执行命令、...
4. SFTP文件传输:在VB中实现安全文件传输协议(SFTP),上传或下载文件。 5. 错误处理:捕获并处理SSH操作中可能出现的异常情况,如网络错误、认证失败等。 “素数的求法”这部分,VB可以用来实现各种算法,比如...
4. **服务端功能**: 要使Android设备作为SSH服务器,需要设置一个后台服务来监听并接受连接请求。这通常涉及到创建一个SSH服务器实例,配置端口、用户权限等,并保持服务常驻内存。 5. **客户端功能**: 对于SSH...
- **步骤4**: 将OpenSSH的公钥文件转换成SSH2的公钥文件。执行命令: ``` ssh-keygen -e -f id_rsa.pub > id_rsa_SSH2.pub ``` 命令中的`-e`选项表示对公钥文件进行编码处理,以便于SSH2使用。 - **步骤5**: 将...
Bitvise SSH是一款由Bitvise公司开发的强大的SSH(Secure Shell)客户端和服务端软件,其全称为BvSsh Bitvise Secure Shell。这款工具提供了安全的远程访问和文件传输功能,广泛应用于IT专业人士和系统管理员之间。...
本资源包含了SSH协议相关的主要rfc文档 其中有: rfc4250 The Secure Shell SSH Protocol Assigned Numbers pdf rfc4251 The Secure Shell SSH Protocol Architecture pdf rfc4252 The Secure Shell SSH ...
记录一下ssh离线升级版本(有openssh8.8安装包和依赖),redhad的ssh7.4升级到8.8,不用卸载旧版本ssh直接替换历史版本,迁移密钥重启ssh。有一定危险,我这有安全限制不能用telnet连接,需要多开几个ssh连接已被...
4. **使用SSH Secure Shell** - **基本命令**:`ssh user@hostname`用于连接到远程主机,其中`user`是用户名,`hostname`是远程服务器的IP地址或域名。 - **公钥认证**:为避免每次连接都输入密码,可以设置公钥...
4. 配置 Hibernate Hibernate 是一个流行的 ORM 框架,用于将 Java 对象映射到数据库表中。在配置 Hibernate 时,需要指定数据库连接信息、dialect 等参数。 三、配置文件解释 在提供的部分内容中,出现了多个...
SSH SSH SSH SSH SSH SSH SSH SSH SSH SSH SSH SSH
4. 会话建立:服务器端和客户端建立加密的会话连接。 5. 数据传输:客户端和服务器端通过加密的会话连接进行数据传输。 6. 会话关闭:客户端和服务器端关闭会话连接。 三、SSH 配置文件 SSH 配置文件用于存储 SSH ...