ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java+mybatis实现一个简单的银行系统,实现存取款与账户查询

2021-03-15 12:04:31  阅读:152  来源: 互联网

标签:java String 存取款 System public mybatis return balance id


先创建数据库和表,使用的是MySQL数据库。

create database mybatis;
use mybatis;
CREATE TABLE `accountdo` (
  `id` varchar(255) NOT NULL COMMENT '账户',
  `name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
  `sex` varchar(255) DEFAULT NULL COMMENT '性别',
  `tele` varchar(255) DEFAULT NULL COMMENT '电话',
  `address` varchar(255) DEFAULT NULL COMMENT '住址',
  `balance` double DEFAULT NULL COMMENT '账户余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

新建一个Java项目,项目下新建一个lib文件夹,放入mysql-connector-java和mybatis的jar包,build path一下。src目录下创建一个conf.xml和一个db.properties,

db.properties的内容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
name=root
password=root

password填写自己的密码。

编写一个mybatis工具类,代码如下:

package utils;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUtil {

    /**
     * 获取SqlSessionFactory
     * @return SqlSessionFactory
     */
    public static SqlSessionFactory getSqlSessionFactory() {
        String resource = "conf.xml";
        InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        return factory;
    }

    /**
     * 获取SqlSession
     * @return SqlSession
     */
    public static SqlSession getSqlSession() {
        return getSqlSessionFactory().openSession();
    }

    /**
     * 获取SqlSession
     * @param isAutoCommit
     *         true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务
     *         false 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
     * @return SqlSession
     */
    public static SqlSession getSqlSession(boolean isAutoCommit) {
        return getSqlSessionFactory().openSession(isAutoCommit);
    }
}

编写账户实体类,将setId方法改为private,代码如下:

package bank.d;

/**
 * 账户实体类
 * 
 * @author xmj
 *
 */
public class AccountDO {

    private String id;// 账户的号码
    private String name;// 账户姓名
    private String sex;// 性别
    private String tele;// 电话
    private String address;// 地址
    private double balance = 0;// 账户的余额,默认为0

    public String getId() {
        return id;
    }

    @SuppressWarnings("unused")
    private void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTele() {
        return tele;
    }

    public void setTele(String tele) {
        this.tele = tele;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "\n账号:" + id + " \n姓名:" + name + "\n余额:" + balance;
    }

}

定义sql映射的接口,代码如下:

package bank.i;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import bank.d.AccountDO;

public interface IAccountMapper {

    // 使用@Insert注解指明add方法要执行的SQL
    @Insert("insert into AccountDO(id, name,sex,tele,address,balance) values(concat('BANK',DATE_FORMAT(now(),'%Y%m%d%H%i%s'),floor(1000+rand()*8999)), #{name}, #{sex}, #{tele}, #{address}, #{balance})")
    public int add(AccountDO user);

    // 使用@Delete注解指明deleteById方法要执行的SQL
    @Delete("delete from AccountDO where id=#{id}")
    public int deleteById(String id);

    // 使用@Update注解指明update方法要执行的SQL
    @Update("update AccountDO set name=#{name},sex=#{sex} ,tele=#{tele},address=#{address},balance=#{balance} where id=#{id}")
    public int update(AccountDO user);

    // 使用@Select注解指明getById方法要执行的SQL
    @Select("select * from AccountDO where id=#{id}")
    public AccountDO getById(String id);

    // 使用@Select注解指明getAll方法要执行的SQL
    @Select("select * from AccountDO")
    public List<AccountDO> getAll();

}

 

在conf.xml文件中注册这个映射接口,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 引用db.properties配置文件 -->
    <properties resource="db.properties" />

    <!-- development : 开发模式 work : 工作模式 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${name}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
    
        <!-- 注册IAccountMapping映射接口 -->
        <mapper class="bank.i.IAccountMapper" />
        
    </mappers>

</configuration>

编写一个实现类,封装上面的映射接口里的方法,代码如下:

package bank.s;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import bank.d.AccountDO;
import bank.i.IAccountMapper;
import utils.MyBatisUtil;

public class AccountMapperImpl {

    /**
     * 判断字符串是否为空
     * 
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        if (str == null || "".equals(str))
            return true;
        return false;
    }

    /**
     * 添加用户
     * 
     * @param aggdo
     */
    public static void add(AccountDO aggdo) {
        if (aggdo == null)
            return;
        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
        IAccountMapper mapper = sqlSession.getMapper(IAccountMapper.class);
        int add = mapper.add(aggdo);
        sqlSession.close();
        System.out.println("有【" + add + "】条数据发生了改变");
    }

    /**
     * 修改
     * 
     * @param aggdo
     */
    public static void update(AccountDO aggdo) {
        if (aggdo == null)
            return;
        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
        IAccountMapper mapper = sqlSession.getMapper(IAccountMapper.class);
        @SuppressWarnings("unused")
        int add = mapper.update(aggdo);
        // System.out.println("有【" + add + "】条数据发生了改变");
        sqlSession.close();
    }

    /**
     * 修改用户余额
     * 
     * @param balance
     * @param id
     */
    public static void updateBalance(double balance, String id) {
        if (isEmpty(id))
            return;
        AccountDO user = getById(id);
        if (user == null) {
            System.out.println("无法通过【" + id + "】查到该用户信息");
            return;
        }
        user.setBalance(balance);
        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
        IAccountMapper mapper = sqlSession.getMapper(IAccountMapper.class);
        @SuppressWarnings("unused")
        int add = mapper.update(user);
        sqlSession.close();
        // System.out.println("有【" + add + "】条数据发生了改变");
    }

    /**
     * 通过账号查询用户信息
     * 
     * @param id
     * @return
     */
    public static AccountDO getById(String id) {
        if (isEmpty(id))
            return null;
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        IAccountMapper mapper = sqlSession.getMapper(IAccountMapper.class);
        AccountDO lstUsers = mapper.getById(id);
        sqlSession.close();
        return lstUsers;
    }

    /**
     * 获取所有用户信息
     * 
     * @return
     */
    public static List<AccountDO> getAll() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        IAccountMapper mapper = sqlSession.getMapper(IAccountMapper.class);
        List<AccountDO> lstUsers = mapper.getAll();
        sqlSession.close();
        return lstUsers;
    }

}

编写银行系统类,实现对账户的查询和存取款操作,代码如下:

package bank.bp;

import java.util.Scanner;

import bank.d.AccountDO;
import bank.s.AccountMapperImpl;

/**
 * 银行系统
 * 
 * @author xmj
 *
 */
public class BankSystem {

    public AccountDO user;// 当前账户
    private double balance;// 余额

    /**
     * 银行操作系统。原存取款都对数据库的数据进行修改,现改成退出系统时才对数据库进行修改
     */
    public void system(String id) {
        this.user = AccountMapperImpl.getById(id);
        if (user == null) {
            System.out.println("无【" + id + "】此账户");
            return;
        }
        this.balance = user.getBalance();
        double unchang = balance;// 用户刚登陆系统时账户的余额,用来与操作后的balance比较,看余额是否发生改变
        System.out.println("------银行账户操作系统-------- ");
        System.out.println("----------1取款操作------------");
        System.out.println("----------2存款操作------------");
        System.out.println("----------3账户信息------------");
        System.out.println("----------4退出系统------------");
        boolean go_on = true;
        while (go_on) {
            @SuppressWarnings("resource")
            Scanner num = new Scanner(System.in);
            System.out.println("请输入您的选择:");
            int choice = num.nextInt();
            switch (choice) {
            case 1:
                System.out.println("-----正在进行【取款】操作------");
                this.withDrawal();
                break;
            case 2:
                System.out.println("-----正在进行【存款】操作------");
                this.deposit();
                break;
            case 3:
                System.out.println("-----账户信息------");
                this.info();
                break;
            case 4:
                if (unchang != balance)
                    AccountMapperImpl.updateBalance(balance, user.getId());
                System.out.println("------退出系统,欢迎下次光临------");
                go_on = false;
                break;
            default:
                System.out.println("您的选择有误!");
                break;
            }
        }
    }

    /**
     * 账户信息
     */
    private void info() {
        System.out.println("账号:" + user.getId() + "\n姓名:" + user.getName() + "\n余额:" + this.balance);
    }

    /**
     * 存款
     */
    private void deposit() {
        @SuppressWarnings("resource")
        Scanner balance1 = new Scanner(System.in);
        System.out.println("请输入您要存入的金额:");
        double money = balance1.nextDouble();
        balance = balance + money;
//        AccountMapperImpl.updateBalance(balance, user.getId());
        System.out.println("余额:" + balance);
    }

    /**
     * 取款
     */
    private void withDrawal() {
        @SuppressWarnings("resource")
        Scanner balance1 = new Scanner(System.in);
        System.out.println("请输入您要提取的金额:");
        double money = balance1.nextDouble();
        if (money > balance)
            System.out.println("您的余额不足");
        else {
            balance = (balance - money);
//            AccountMapperImpl.updateBalance(balance, user.getId());
        }
        System.out.println("余额:" + balance);
    }

}

编写测试类,代码如下:

package bank;

import bank.bp.BankSystem;
import bank.d.AccountDO;
import bank.s.AccountMapperImpl;

public class BankTest {

    public static void main(String[] args) {
        BankSystem s = new BankSystem();
        s.system("BANK202103151039575919");
//        add();
    }
    
    public static void add() {
        AccountDO a = new AccountDO();
        a.setName("小马驹");
        a.setSex("男");
        a.setTele("12345678901");
        a.setAddress("武汉市");
        AccountMapperImpl.add(a);
    }

}

整个项目的结构如图:

第一次写博客,如果有做的不好的地方还请见谅。

 

 

 

 

 

withDrawal

标签:java,String,存取款,System,public,mybatis,return,balance,id
来源: https://www.cnblogs.com/xiaomaju/p/14536772.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有