java 事物控制(模拟银行)+mysql数据库

目录结构

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;
                        }

                }
            }
        }
    }

}

 

 结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值