1.1项目目录
1.2 代码实现
持久层(Dao)
AccountDao
package cn.guardwhy.dao;
import cn.guardwhy.domain.Account;
/**
* 账户dao接口
*/
public interface AccountDao {
/**
* 根据账户id查询账户
*/
Account findAccountById(Integer accountId);
/**
* 根据账户名称查询账户
*/
Account findAccountByName(String accountName);
/**
* 更新账户
*/
void updateAccount(Account account);
}
AccountDaoImpl
package cn.guardwhy.dao.impl;
import cn.guardwhy.dao.AccountDao;
import cn.guardwhy.domain.Account;
import cn.guardwhy.rowmapper.AccountRowMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 账户dao实现类
*/
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao{
// 定义JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 根据账户id查询账户
*
* @param accountId
*/
public Account findAccountById(Integer accountId) {
List<Account> list = jdbcTemplate.query("select * from account where id=?", new AccountRowMapper(), accountId);
return list.isEmpty()?null:list.get(0);
}
/**
* 根据账户名称查询账户
*
* @param accountName
*/
public Account findAccountByName(String accountName) {
List<Account> list = jdbcTemplate.query("select * from account where name=?", new AccountRowMapper(), accountName);
// 判断不为空
if(list.isEmpty()){
return null;
}
// 判断账户是否唯一
if(list.size()>1){
throw new RuntimeException("账户不唯一,请检查!");
}
return list.get(0);
}
/**
* 更新账户
*
* @param account
*/
public void updateAccount(Account account) {
jdbcTemplate.update("update account set money=? where id=?",account.getMoney(),account.getId());
}
}
业务层(Service)
AccountService
package cn.guardwhy.service;
import cn.guardwhy.domain.Account;
/**
* 账户service接口
*/
public interface AccountService {
/**
* 根据账户id查询账户
*/
Account findAccountById(Integer accountId);
/**
* 转账操作:
* 参数说明:
* sourceName:转出账户
* destName:转入账户
* money:转账金额
*
*/
void transfer(String sourceName,String destName,Float money);
}
AccountServiceImpl
package cn.guardwhy.service.impl;
import cn.guardwhy.dao.AccountDao;
import cn.guardwhy.domain.Account;
import cn.guardwhy.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 账户service实现类
*/
@Service("accountService")
public class AccountServiceImpl implements AccountService{
// 定义账户dao
@Autowired
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
/**
* 根据账户id查询账户
*
* @param accountId
*/
public Account findAccountById(Integer accountId) {
return accountDao.findAccountById(accountId);
}
/**
* 转账操作:
* 参数说明:
* sourceName:转出账户
* destName:转入账户
* money:转账金额
* @param sourceName
* @param destName
* @param money
*/
public void transfer(String sourceName, String destName, Float money) {
// 1.查询转出账户
Account sourceAccount = accountDao.findAccountByName(sourceName);
// 2.查询转入账户
Account destAccount = accountDao.findAccountByName(destName);
// 3.转出账户-money
sourceAccount.setMoney(sourceAccount.getMoney()-money);
// 4.转入账户+money
destAccount.setMoney(destAccount.getMoney()+money);
// 5.更新转出账户
accountDao.updateAccount(sourceAccount);
// 6.更新转入账户
accountDao.updateAccount(destAccount);
}
}
配置bean.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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置包扫描dao/service-->
<context:component-scan base-package="cn.guardwhy"/>
<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置数据源对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--注入连接数据库的四个基本要素-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/spring"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!--数据库连接池常用属性-->
<!-- 初始化连接数量 -->
<property name="initialSize" value="6" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="3" />
<!-- 最大并发连接数(最大连接池数量) -->
<property name="maxActive" value="50" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
</bean>
<!--spring事务管理配置步骤-->
<!--第一步:配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源对象-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--第二步:开启spring对注解事务的支持 -->
<tx:annotation-driven/>
</beans>
表现层(Controller)
AccountController
package cn.guardwhy.controller;
import cn.guardwhy.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 账户表现层
*/
public class AccountController {
public static void main(String[] args) {
// 1.加载spring配置文件,创建spring ioc容器
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");
// 2.获取账户service
AccountService accountService = (AccountService)context.getBean("accountService");
// 3.转账操作
accountService.transfer("curry","james",200f);
}
}
1.3 执行结果
扫描二维码关注公众号,回复:
12991112 查看本文章
![](/qrcode.jpg)