归纳练习
一、atm模拟系统练习spring注入、事务、控制反转
atm机项目
1,输入账号
2,输入密码
3,【再次输入密码并验证】查询余额
4,转账
5,输入转账者卡号
1,建表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for bank
-- ----------------------------
DROP TABLE IF EXISTS `bank`;
CREATE TABLE `bank` (
`id` int(0) NOT NULL,
`name` varchar(5) CHARACTER SET utf8 COLLATE utf8_croatian_ci NOT NULL,
`pass` int(0) NOT NULL,
`account` varchar(20) CHARACTER SET utf8 COLLATE utf8_croatian_ci NOT NULL,
`money` double(13, 2) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_croatian_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of bank
-- ----------------------------
INSERT INTO `bank` VALUES (1, '张三', 123456, '11111111111', 1000.00);
SET FOREIGN_KEY_CHECKS = 1;
2,建项目
建立一个普通maven项目
3,导包
<!-- spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- 连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- aop-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<!-- 事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
4,实体类
public class Bank {
private Integer id;//id
private String name;
private Integer pass;
private String account;
private Double money;
public Bank() {
}
public Bank(Integer id, String name, Integer pass, String account, Double money) {
this.id = id;
this.name = name;
this.pass = pass;
this.account = account;
this.money = money;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPass() {
return pass;
}
public void setPass(Integer pass) {
this.pass = pass;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Bank{" +
"id=" + id +
", name='" + name + '\'' +
", pass=" + pass +
", account='" + account + '\'' +
", money=" + money +
'}';
}
}
5,写jdbc文件
- 指定数据源
- 事务管理器
- 用dao框架
- 开启spring
- 开启事务注解
driverClassName=com.mysql.cj.jdbc.Driver <!-- 数据库驱动-->
url=jdbc:mysql://127.0.0.1:3306/bank
name=root <!-- 数据库的用户名,切忌使用username,系统会混淆-->
pass=root <!-- 数据库的密码-->
6,编写配置文件
<?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">
<!-- 1 读取jdbc文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!-- 2 创建数据源-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${name}"></property>
<property name="password" value="${pass}"></property>
</bean>
<!-- 3 事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 4 jdbc框架-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 5 开启spring-->
<context:component-scan base-package="com.buka"></context:component-scan>
<!-- 6 开启事务注解-->
<tx:annotation-driven></tx:annotation-driven>
</beans>
java代码
dao层
import com.buka.po.Bank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public Bank selUser(String account, Integer pass) {
Bank bank=null;
// Integer i= jdbcTemplate.queryForObject("select count(*) from bank1 where account="+account+" and pass="+pass,Integer.class);
bank= jdbcTemplate.queryForObject("select * from bank1 where account="+account+" and pass="+pass,
new BeanPropertyRowMapper<Bank>(Bank.class));
return bank;
}
public int sel(String account) {
Integer integer=jdbcTemplate.queryForObject("select count(*) from bank1 where account=?",Integer.class,account);
return integer;
}
public void subtract(String account, Double money) {
jdbcTemplate.update("update bank1 set money=money-? where account=?",money,account);
}
public void add(String account, Double money) {
jdbcTemplate.update("update bank1 set money=money+? where account=?",money,account);
}
public Double selRemains(Integer id) {
Double query = jdbcTemplate.queryForObject("select money from bank1 where id=?", Double.class, id);
return query;
}
}
po层
public class Bank {
private Integer id;
private String name;
private Integer pass;
private String account;
private Double money;
public Bank() {
}
public Bank(Integer id, String name, Integer pass, String account, Double money) {
this.id = id;
this.name = name;
this.pass = pass;
this.account = account;
this.money = money;
}
public Bank( String name, Integer pass, String account, Double money) {
this.name = name;
this.pass = pass;
this.account = account;
this.money = money;
}
@Override
public String toString() {
return "Bank{" +
"id=" + id +
", name='" + name + '\'' +
", pass=" + pass +
", account='" + account + '\'' +
", money=" + money +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPass() {
return pass;
}
public void setPass(Integer pass) {
this.pass = pass;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
}
service层
import com.buka.dao.UserDao;
import com.buka.po.Bank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public Bank selUser(String account, Integer pass) {
System.out.println("-----------------");
Bank bank= userDao.selUser(account,pass);
return bank;
}
@Transactional
public String Transfer(Bank bank,String account, Double money) {
//查询卡号在不在 1:存在 0:不存在
int i=userDao.sel(account);
//转账
if(i==1){
//存在,判断卡里的钱够不够
if(bank.getMoney()>=money){
//钱够=>得先减,后加
userDao.subtract(bank.getAccount(),money);
userDao.add(account,money);
return "ok";
}else{
//钱不够
return "Not enough money!!";
}
}else {
return "no";
}
}
public Double queryRemains(Bank bank, Integer pass) {
if(bank.getPass().equals(pass)){ //判断密码是否相同
Double remains=userDao.selRemains(bank.getId());
return remains;
}else{
return 0.0;
}
}
}
web层
import com.buka.po.Bank;
import com.buka.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.management.Query;
import java.util.Scanner;
public class UserWeb {
public static UserService userService;
static {
//1.创建spring容器
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
userService=(UserService) app.getBean("userService");
}
public static Scanner scanner=new Scanner(System.in);
public static Bank bank;
public static void main(String[] args) {
System.out.println("----------------Welcome to the ATM System!--------------------");
System.out.println("----------Please input the account -------------");
String account=scanner.next();
System.out.println("----------Please input the password -------------");
Integer pass=scanner.nextInt();
//2.调用service方法
Bank result= userService.selUser(account,pass);
//3.
if(result!=null){
System.out.println("login in successfully");
bank=result;
index();
}else{
System.out.println("Fail to login!");
}
}
private static void index() {
System.out.println("-----------Welcome you to the"+bank.getName()+"----------");
System.out.println("-------------Please choose the function---------------");
System.out.println("-----1.Query the remains--------------");
System.out.println("-----2.transfer------------");
int i=scanner.nextInt();
switch (i){
case 1:
//查余额
QueryRemains();
break;
case 2:
//转账
Transfer();
break;
default:
System.out.println("Input incorrectly!");
break;
}
}
private static void QueryRemains() {
System.out.println("-----------QueryRemains Function------------");
System.out.println("Please input the password:");
Integer pass=scanner.nextInt();
Double remains= userService.queryRemains(bank,pass);
if(remains==0.0){
System.out.println("Wrong password!");
}else{
System.out.println("Your remains is "+remains);
}
}
private static void Transfer() {
System.out.println("-----------Transfer Function------------");
System.out.println("-----------Target account------------");
String account =scanner.next();
System.out.println("-----------Target money------------");
Double money =scanner.nextDouble();
String result= userService.Transfer(bank,account,money);
if("ok".equals(result)){
System.out.println("Transfer successfully!");
}else{
System.out.println(result);
}
}
}