欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用数据库和JDBC完成控制台版本的小型银行系统

程序员文章站 2022-07-13 14:11:45
...

一、功能介绍

完成顾客功能:登录、存款、取款、转账、修改密码、退出,如下图:

图1(顾客登录)
用数据库和JDBC完成控制台版本的小型银行系统

图2(顾客登录成功界面)
用数据库和JDBC完成控制台版本的小型银行系统

图3(存款)
用数据库和JDBC完成控制台版本的小型银行系统

图4(存款成功后,选择“1”返回顾客主菜单)
用数据库和JDBC完成控制台版本的小型银行系统

图5(存款成功后,选择“0”退出系统)

用数据库和JDBC完成控制台版本的小型银行系统

图6(取款,当前账户余额不足提示)
用数据库和JDBC完成控制台版本的小型银行系统

图7(取款成功)
用数据库和JDBC完成控制台版本的小型银行系统

图8(查询余额)
用数据库和JDBC完成控制台版本的小型银行系统

图9(转账:账号不存在、余额不足提示)
用数据库和JDBC完成控制台版本的小型银行系统

图10(转账成功)
用数据库和JDBC完成控制台版本的小型银行系统

图11(修改密码:旧密码错误提示,修改成功后跳转)
用数据库和JDBC完成控制台版本的小型银行系统

图12(顾客退出:选择“6”,退出顾客界面,返回到角色选择)
用数据库和JDBC完成控制台版本的小型银行系统

二、开发背景

  • 开发工具为mysql+IDEA。
  • 使用经典MVC模式。

M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。
M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

三、项目结构

用数据库和JDBC完成控制台版本的小型银行系统
用数据库和JDBC完成控制台版本的小型银行系统

四、file.properties

DRIVER = com.mysql.jdbc.Driver
URL = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
USER = root
PWD = root

五、DBUtils工具类

package goodsmanagesystem.utils;


import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import java.io.File;
import java.io.FileInputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class DBUtils {
	//	要连接的驱动类型
	private static String DRIVER = null;
	//要连接的URL
	private static String URL = null;
	//	要连接的数据库的用户名
	private static String USER = null;
	//	要连接的数据库的密码
	private static String PWD = null;

	private static QueryRunner runner ;


	static {
		//建立连接器
		File f = new File("novexam/src/goodsmanagesystem/file.properties");
		Properties p = new Properties();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(f);
			p.load(fis);
			DRIVER = p.getProperty("DRIVER");
			URL = p.getProperty("URL");
			USER = p.getProperty("USER");
			PWD = p.getProperty("PWD");
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		//连接数据库
		DruidDataSource ds = new DruidDataSource();
		ds.setUrl(URL);
		ds.setUsername(USER);
		ds.setPassword(PWD);
		ds.setDriverClassName(DRIVER);
		runner = new QueryRunner(ds);
	}

	/**
	 * 进行新增、修改、删除操作
	 * @param sql  进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL执行后受影响的行
	 */
	public static int udpate(String sql ,Object... param ){
		try {
			return runner.update(sql, param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0 ;
	}

	/**
	 * 查询1个对象封装成Bean对象
	 * @param sql 进行操作的SQL语句
	 * @param clazz 结果封装的Bean类型
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的Bean对象,如果异常则返回null
	 */
	public static<T> T queryOneToBean(String sql, Class<T> clazz,Object... param  ){
		try {
			BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
			return runner.query(sql, new BeanHandler<T>(clazz,brp),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 查询只有1行结果的操作,结果封装成Map
	 * @param sql 进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的1行内容封装到Map中,如果异常则返回null
	 */
	public static Map<String,Object> queryOneToMap(String sql, Object... param  ){
		try {
			return  runner.query(sql,new MapHandler(),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 有多行结果的查询操作,结果封装成List,元素为bean类型
	 * @param sql sql 进行操作的SQL语句
	 * @param clazz 结果封装的Bean类型
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的多行内容封装到List中,如果异常则返回null
	 */
	public static<T> List<T> queryAllList(String sql, Class<T> clazz,Object... param ){
		try {
			BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
			return runner.query(sql, new BeanListHandler<T>(clazz,brp),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 查询有多行结果的操作,结果封装成List中,元素为map类型
	 * @param sql 进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的多行内容封装到List中,如果异常则返回null
	 */
	public static List<Map<String,Object>> queryAllMap(String sql, Object... param ){
		try {
			return runner.query(sql,new MapListHandler(),param );
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

}

六、BankView(用户界面)

package banksystem.view;


import banksystem.beans.User;

import java.util.Scanner;

// 用户界面:用于用户交互
public class BankView {

    //创建Scanner对象
    private Scanner sc = new Scanner(System.in);

    //后台信息管理系统界面(主界面)
    public int showMenu(){
        System.out.println("-------------银行系统------------------");
        System.out.println("**********1.管理员**********");
        System.out.println("**********2.顾客************");
        System.out.println("--------------------------------------");
        System.out.print("请选择:");
        return  sc.nextInt();
    }


    //登录
    public User login(){
        System.out.print("请输入用户名:");
        String user_name = sc.next();
        System.out.print("请输入密码:");
        String user_password = sc.next();
        return new User(user_name,user_password);
    }

    //顾客功能选择界面
    public int showUser(){
        System.out.println("               银行系统[顾客]             ");
        System.out.println("**********************************************");
        System.out.println("1.存款 2.取款 3.查询余额 4.转账 5.修改密码 6.退出");
        System.out.println("**********************************************");
        System.out.print("请选择:");
        return sc.nextInt();
    }

    //1.存款
    public double addMoney(){
        System.out.print("请输入存款金额:");
        return sc.nextDouble();
    }
    public void addMoneyResult(int a,double b){
        if (a>0){
            System.out.println("存款成功,当前余额:"+b);
        }else {
            System.out.println("存款失败");
        }
    }

    //功能完成后的选择界面
    public int overResult(){
        System.out.println("1.返回顾客主菜单 0.退出系统:");
        return sc.nextInt();
    }

    public void logOff(){
        System.out.println("谢谢使用!");
    }


    //2.取款
    public double outMoney(){
        System.out.print("请输入取款金额:");
        return sc.nextDouble();
    }
    public void outMoneyResult(int a,double b){
        if (a>0){
            System.out.println("取款成功,当前余额:"+b);
        }else{
            System.out.println("余额不足,当前余额:"+b);
        }

    }
    //3.查询余额
    public void findMoney(double a){
        System.out.println("当前余额:"+a);
    }

    //4.转账
    public String transMoney(){
        System.out.print("请输入转账账号:");
        return sc.next();
    }
    public double transMoneyResult1(int a){
        if (a>0){
            System.out.print("请输入转入金额:");
            return sc.nextDouble();
        }else {
            System.out.println("输入账号不存在,请重新输入。");
            return -1;
        }
    }
    public void transMoneyResult2(int a,double b){
        if (a>0){
            System.out.println("转账成功!");
        }else {
            System.out.println("账户余额不足,当前余额:"+b);
        }
    }

    //5.修改密码
    public String updatePassword(){
        System.out.println("请输入旧密码:");
        return sc.next();
    }
    public String updatePwdResult1(int a){
        if (a>0){
            System.out.print("请输入新密码:");
            return sc.next();

        }else {
            System.out.println("旧密码错误,请重新输入");
        }
        return null;
    }
    public void updatePwdResult2(int a){
        if (a>0){
            System.out.println("密码修改成功");
        }else {
            System.out.println("密码修改失败");
        }
    }

}

七、BankModel(业务模型)

package banksystem.model;


import banksystem.beans.User;
import banksystem.utils.DBUtils;

import java.util.Map;

//业务模型:数据处理 跟数据库相关,sql语句、调用增删改查的方法
public class BankModel {
    //登录验证
    public int login(User u1){
        String sql ="SELECT user_password from bank WHERE user_name=?";
        User u2 = DBUtils.queryOneToBean(sql, User.class, u1.getUser_name());
        //账号密码错误找不到用户,需要空值判断
        if (u2==null){
            return -1;
        }else {
            //不为空,则比较是否可以登录
            if (u1.getUser_password().equals(u2.getUser_password())){
                return 1;
            }else {
                return -1;
            }
        }

    }

    //1.存款
    public int addMoney(double a,User u){
        String sql ="UPDATE bank set user_balance=user_balance+? where user_name=?";
        return DBUtils.udpate(sql,a,u.getUser_name());
    }
//1.2转账的存款,name是要转账的账号
    public int addMoney(double a,String name){
        String sql ="UPDATE bank set user_balance=user_balance+? where user_name=?";
        return DBUtils.udpate(sql,a,name);
    }

    //2.取款
    public int outMoney(double a ,double b,User u){
        if (a<b){
            String sql ="UPDATE bank set user_balance=user_balance-?where user_name=?";
            return DBUtils.udpate(sql, a, u.getUser_name());
        }
            return -1;
    }

    //3.查询余额
    public double findMoney(User u){
        String sql ="SELECT user_balance from bank WHERE user_name=?";
        User user = DBUtils.queryOneToBean(sql, User.class, u.getUser_name());
        return user.getUser_balance();
    }
    //转账,判断账号是否存在
    public int findMoney(String a){
        String sql ="SELECT user_balance from bank WHERE user_name=?";
        User user = DBUtils.queryOneToBean(sql, User.class, a);
        if (user==null){
            return -1;
        }else {
            return 1;
        }

    }

//5.修改密码(验证旧密码)
    public Map<String, Object>  updatePassword(String a,User u){
        String sql ="SELECT * from bank where user_name=? and user_password=?";
       return DBUtils.queryOneToMap(sql, u.getUser_name(), a);
    }
//修改密码
    public int updatePassword1(String user_password,User u){
String sql ="UPDATE  bank set user_password=? WHERE user_name=?";
        return DBUtils.udpate(sql, user_password, u.getUser_name());
    }

}

八、BankController(控制器)

package banksystem.controller;

import banksystem.beans.User;
import banksystem.model.BankModel;
import banksystem.view.BankView;

import java.util.Map;

//控制器:调用方法

public class BankController {
    private static BankView view = new BankView();
    private static BankModel model = new BankModel();


    public static void main(String[] args) {

        boolean isMenu = true;//主界面退出控制器
        boolean isWork = true;//功能菜单退出控制器
        while (isMenu){
        //主界面
       if (view.showMenu()==2){
           //获取当前登录的用户信息
          User user = view.login();
           if (user!=null){
               //验证登录信息
               int loginNum = model.login(user);
                //大于0就登录成功
               if (loginNum>0) {
                   while (isWork) {
                       //功能菜单
                       int choesNum = view.showUser();
                       //1.存款
                       if (choesNum == 1) {
                           boolean isAdd=true;
                           while (isAdd){
                               int i = model.addMoney(view.addMoney(), user);
                               if (i > 0) {
                                   view.addMoneyResult(i, model.findMoney(user));

                                   int overNum = view.overResult();
                                   if ( overNum== 0) {//退出系统
                                       view.logOff();
                                       isWork=false;
                                       isMenu = false;
                                       break;
                                   }else if (overNum == 1){//回到菜单界面
                                       break;
                                   }
                               }
                           }

                           //2.取款
                       } else if (choesNum == 2) {
                           boolean isOut=true;
                           while (isOut){
                               int i = model.outMoney(view.outMoney(), model.findMoney(user), user);
                               view.outMoneyResult(i,model.findMoney(user));

                               int overNum = view.overResult();
                               if ( overNum== 0) {//退出系统
                                   view.logOff();
                                   isOut=false;
                                   isWork=false;
                                   isMenu = false;
                               }else if (overNum == 1){//回到菜单界面
                                   break;
                               }
                           }

                           //3.查询余额
                       } else if (choesNum == 3) {
                           boolean isFind= true;
                           while (isFind){
                               view.findMoney(model.findMoney(user));

                               int overNum = view.overResult();
                               if ( overNum== 0) {//退出系统
                                   view.logOff();
                                   isFind=false;
                                   isWork=false;
                                   isMenu = false;
                               }else if (overNum == 1){//回到菜单界面
                                   break;
                               }
                           }

                           //4.转账
                       } else if (choesNum == 4) {
                           boolean isTrans=true;
                           while (isTrans){
                               //获取转账账号
                               String transName = view.transMoney();
                               //判断是否有此账号
                               int isName = model.findMoney(transName);
                               if (isName>0){//账号存在
                                   //获取转账金额
                                   double money = view.transMoneyResult1(isName);
                                   //调用取钱的方法,顺便判断钱够不够
                                   int i = model.outMoney(money, model.findMoney(user), user);
                                   if (i>0){//钱够,transName是转账账户
                                       int i1 = model.addMoney(money, transName);
                                       //获取当前用户的余额
                                       double money1 = model.findMoney(user);
                                       //输出转账成功
                                       view.transMoneyResult2(i1,money1);
                                   }else{//钱不够
                                       double money1 = model.findMoney(user);
                                       view.transMoneyResult2(-1,money1);
                                   }

                                   int overNum = view.overResult();
                                   if ( overNum== 0) {//退出系统
                                       view.logOff();
                                       isTrans=false;
                                       isWork=false;
                                       isMenu = false;
                                   }else if (overNum == 1){//回到菜单界面
                                       break;
                                   }
                               }else{//账号不存在
                                   view.transMoneyResult1(-1);
                               }
                           }

                        //5.修改密码
                       } else if (choesNum == 5) {
                           boolean isUpdate =true;
                           while (isUpdate){
                               Map<String, Object> updateMap = model.updatePassword(view.updatePassword(), user);
                               if(updateMap==null){
                                   view.updatePwdResult1(-1);
                               }else{
                                   int i = model.updatePassword1(view.updatePwdResult1(1), user);
                                   if (i>0){
                                       view.updatePwdResult2(1);
                                   }else {
                                       view.updatePwdResult2(-1);
                                   }
                               }

                               int overNum = view.overResult();
                               if ( overNum== 0) {//退出系统
                                   view.logOff();
                                   isUpdate=false;
                                   isWork=false;
                                   isMenu = false;
                               }else if (overNum == 1){//回到菜单界面
                                   break;
                               }
                           }
                           //6.退出
                       } else if (choesNum == 6) {
                           isWork=false;
                       }

                   }
               }
           }

       }

        }
    }
}

九、User顾客类

package banksystem.beans;
//顾客类:编号、用户名、密码、余额
public class User {
    private int user_id;
    private String user_name;
    private String user_password;
    private double user_balance;


    public User(String user_name, String user_password) {
        this.user_name = user_name;
        this.user_password = user_password;
    }

    public User() {
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getUser_password() {
        return user_password;
    }

    public void setUser_password(String user_password) {
        this.user_password = user_password;
    }

    public double getUser_balance() {
        return user_balance;
    }

    public void setUser_balance(double user_balance) {
        this.user_balance = user_balance;
    }


}

十、数据库

小型银行系统:
创建表
create table bank(
user_id int PRIMARY KEY auto_increment,
user_name VARCHAR(20),
user_password VARCHAR(20),
user_balance double
);


新增数据
INSERT into bank VALUES (NULL,1002,'abc',2999.00);
INSERT into bank VALUES (NULL,1003,'123',6888.00);



查看数据
SELECT * from bank where user_name=1002 and user_password="abc";


SELECT user_password from bank WHERE user_name=1002;
SELECT user_balance from bank WHERE user_name=1005;


存款
UPDATE bank set user_balance=user_balance-1000 where user_name=1002

UPDATE bank set user_balance=user_balance+1000 where user_name=1002
UPDATE  bank set user_password=123 WHERE user_name=1002