目录结构
model实体类
public class Atm {
//用户名
private String username;
//用户密码
private String pasword;
//账户金额
private int banlance;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasword() {
return pasword;
}
public void setPasword(String pasword) {
this.pasword = pasword;
}
public int getBanlance() {
return banlance;
}
public void setBanlance(int banlance) {
this.banlance = banlance;
}
@Override
public String toString() {
return "Atm [username=" + username + ", pasword=" + pasword + ", banlance=" + banlance + "]";
}
dao层
登录dao实现
import com.example.demo.model.Atm;
import com.example.demo.dao.AtmDao;
public class LoginDao {
public Atm login(String username){
AtmDao ad=new AtmDao();
return ad.queryDao(username);
}
//编写一个检测用户是否存在的功能
public boolean detection(String username) {
Atm atm=new AtmDao().queryDao(username);
if(atm==null) {
return false;
}
else{
return true;
}
}
}
ATM取款dao实现
import com.example.demo.model.Atm;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
//方法有:1.单人数据更新2.单人的数据查询3.分页数据查询4.余额查询5.用户 注册6.转账功能
public class AtmDao {
//加载驱动,连接数据库,获得Statement
public Connection getConn() {
Connection conn=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Atm?serverTimezone=UTC", "root", "root");
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败...");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败...");
e.printStackTrace();
}
return conn;
}
public Statement getState() {
Statement state=null;
try {
state=getConn().createStatement();
} catch (SQLException e) {
System.out.println("创建Statement失败");
e.printStackTrace();
}
return state;
}
//对数据库对应用户余额的更新
public void updateDao(String username,int money) {
String sql="update tb_atm set banlance='"+money+"'where username='"+username+"'";
try {
getState().executeUpdate(sql);
} catch (SQLException e) {
System.err.println(username+"用户数据跟新失败!");
e.printStackTrace();
}
}
//查询用户在数据库的数据,完成ATM的映射
public Atm queryDao(String username) {
Atm atm=null;
try {
String sql="select * from tb_atm where username='"+username+"'";
ResultSet rs=getState().executeQuery(sql);
if(rs.next()) {
atm=new Atm();
atm.setUsername(rs.getString("username"));
atm.setPasword(rs.getString("pasword"));
atm.setBanlance(rs.getInt("banlance"));
}
else{
System.out.println("用户数据获取失败");
}
} catch (SQLException e) {
System.err.println("用户数据获取失败!");
e.printStackTrace();
}
return atm;
}
//余额查询
public int banlanceDao(String username) {
return queryDao(username).getBanlance();
}
//分页查询
public List<Atm> queryAll(int start,int end) {
List<Atm> list=new ArrayList<Atm>();
String sql="select * from (select rownum r,tb_atm.* from tb_atm)t where t.r between'"+start+"' and '"+end+ "'";
Statement st=getState();
try {
ResultSet rs=st.executeQuery(sql);
while(rs.next()) {
Atm atm=new Atm();
atm.setUsername(rs.getString("username"));
atm.setPasword(rs.getString("pasword"));
atm.setBanlance(rs.getInt("banlance"));
list.add(atm);
}
} catch (SQLException e) {
System.out.println("分页查询失败");
e.printStackTrace();
}
return list;
}
//注册用户,此处使用预处理,此时就不能使用Stament了,由于以上没有封装
public void register(Atm atm){
Connection conn=getConn();
//预处理
try {
System.out.println("开始注册");
String sql="insert into tb_atm(username,pasword,banlance)values(?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, atm.getUsername());
ps.setString(2, atm.getPasword());
ps.setInt(3, atm.getBanlance());
ps.executeUpdate();
} catch (SQLException e) {
System.out.println("注册失败!");
e.printStackTrace();
}
}
//对于转账功能应当重新写一个方法,因为转账的过程可能会失败,此时需要事务回滚,不能扣除转账人的存款,由于在Java
//中提交事务是系统默认的,所以我们需要修改一下状态,使用conn.setAutteoCunmmit(false),然后将conn.rollBack()写入catch中
//保证在数据出出现问题时,会执行数据回滚操作
public void zhuanzhangDao(String zusername,int money,String rusername) {
Connection conn=getConn();
//改变事务自动提交的状态
try {
conn.setAutoCommit(false);
Statement st=conn.createStatement();
//对转账人数据的查询处理
if(money<this.banlanceDao(zusername)) {
int n=this.banlanceDao(zusername)-money;
String sql="update tb_atm set banlance='"+n+"'where username='"+zusername+"'";
st.executeUpdate(sql);
//对转入账户的处理
int n1=this.banlanceDao(rusername)+money;
String sql1="update tb_atm set banlance='"+n1+"'where username='"+rusername+"'";
st.executeUpdate(sql1);
System.out.println("转账成功");
conn.commit();
}else {
System.out.println(zusername+"余额不足!");
}
} catch (Exception e) {
System.out.println("转账失败!");
try {
conn.rollback();
} catch (SQLException e1) {
System.out.println("事务回滚失败");
e1.printStackTrace();
}
}
}
}
service层实现
import com.example.demo.dao.AtmDao;
import com.example.demo.model.Atm;
import java.util.List;
public class AtmService {
//存款
public void cunkuan(String username,int money) {
AtmDao ad=new AtmDao();
Atm atm=ad.queryDao(username);
atm.setBanlance(atm.getBanlance()+money);
ad.updateDao(username, atm.getBanlance());
}
//取款
public void qukuan(String username,int money) {
AtmDao ad=new AtmDao();
Atm atm=ad.queryDao(username);
if(atm.getBanlance()>money) {
atm.setBanlance(atm.getBanlance()-money);
ad.updateDao(username, atm.getBanlance());
}else {
System.out.println("余额不足!");
}
}
//查询余额
public int query(String username) {
AtmDao ad=new AtmDao();
Atm atm=ad.queryDao(username);
return atm.getBanlance();
}
//查询多条数据,指定分页查询
public List<Atm> allQuery(int start, int end) {
AtmDao ad=new AtmDao();
return ad.queryAll(start, end);
}
//转账功能
public void zhuanzhang(String zusername,int money,String rusername) {
AtmDao ad=new AtmDao();
ad.zhuanzhangDao(zusername, money, rusername);
}
//用户注册功能
public void register(Atm atm) {
AtmDao ad=new AtmDao();
ad.register(atm);
}
}
action层实现
import com.example.demo.dao.LoginDao;
public class Action {
public boolean login(String username,String password) {
LoginDao ld=new LoginDao();
if(ld.login(username)==null) {
System.out.println("用户不存在,登陆失败");
return false;
}else if(ld.login(username).getPasword().equals(password)){
return true;
}
else {
System.out.println("密码错误");
return false;
}
}
}
DemoApplicationTests测试
import com.example.demo.action.Action;
import com.example.demo.dao.LoginDao;
import com.example.demo.service.AtmService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Scanner;
@SpringBootTest
class DemoApplicationTests {
/**
* 测试
*/
public static void main(String[] args) {
//模拟登陆
Scanner scan=new Scanner(System.in);
Action ac=new Action();
AtmService ad=new AtmService();
String username=null;
String password=null;
System.out.println("请输入用户名:");
username=scan.nextLine();
System.out.println("请输入密码:");
password=scan.nextLine();
if(ac.login(username, password)) {
System.out.println("登陆成功....");
System.out.println("欢迎 "+username+" 使用ATM");
p:while(true) {
System.out.println("1.存款 2.取款 3.转账4.查询服务/r/n请输入您的服务请求编号");
int value=scan.nextInt();
scan.nextLine();
switch(value) {
case 1:
System.out.println("请输入要存款的金额:");
int money=scan.nextInt();
scan.nextLine();
ad.cunkuan(username, money);
System.out.println("是否继续使用服务?是请数入1,否请输入2");
int n=scan.nextInt();
scan.nextLine();
if(n==2) {
break p;
}else {
continue;
}
case 2:
System.out.println("请输入要存款的金额:");
int money1=scan.nextInt();
scan.nextLine();
ad.qukuan(username, money1);
System.out.println("是否继续使用服务?是请数入1,否请输入2");
int n3=scan.nextInt();
scan.nextLine();
if(n3==2) {
break p;
}else {
continue;
}
case 3:
System.out.println("请输入对方的姓名:");
String name=scan.nextLine();
LoginDao ld=new LoginDao();
boolean bl=ld.detection(name);
if(bl) {
System.out.println("请输入转款的额度:");
int money3=scan.nextInt();
scan.nextLine();
ad.zhuanzhang(username, money3, name);
}else {
System.out.println("对方账号不存在");
}
System.out.println("是否继续使用服务?是请数入1,否请输入2");
int n2=scan.nextInt();
scan.nextLine();
if(n2==2) {
break p;
}else {
continue;
}
case 4:
System.out.println("您的账户余额为:"+ad.query(username));
System.out.println("是否继续使用服务?是请数入1,否请输入2");
int n1=scan.nextInt();
scan.nextLine();
if(n1==2) {
break p;
}else {
continue;
}
}
}
}
}
}
结果: