• jdbc02


    账户张三购买股票

    package cn.bdqn.bean;
    
    public class Account {
        private int aid; // 账户编号
        private double balance;// 账户余额
        private String name;// 账户名称
    
        public int getAid() {
            return aid;
        }
    
        public void setAid(int aid) {
            this.aid = aid;
        }
    
        public double getBalance() {
            return balance;
        }
    
        public void setBalance(double balance) {
            this.balance = balance;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Account(int aid, double balance, String name) {
            super();
            this.aid = aid;
            this.balance = balance;
            this.name = name;
        }
    
        public Account() {
            super();
        }
    
        @Override
        public String toString() {
            return "Account [aid=" + aid + ", balance=" + balance + ", name="
                    + name + "]";
        }
    
    }
    package cn.bdqn.bean;
    
    public class Stock {
        private int sid;
        private int amount;
        private String sname;
    
        public int getSid() {
            return sid;
        }
    
        public void setSid(int sid) {
            this.sid = sid;
        }
    
        public int getAmount() {
            return amount;
        }
    
        public void setAmount(int amount) {
            this.amount = amount;
        }
    
        public String getSname() {
            return sname;
        }
    
        public void setSname(String sname) {
            this.sname = sname;
        }
    
        public Stock(int sid, int amount, String sname) {
            super();
            this.sid = sid;
            this.amount = amount;
            this.sname = sname;
        }
    
        public Stock() {
            super();
        }
    
        @Override
        public String toString() {
            return "Stock [sid=" + sid + ", amount=" + amount + ", sname=" + sname
                    + "]";
        }
    
    }
    package cn.bdqn.dao;
    
    /**
     * 关于  Account的增删改查  所有公共的方法
     */
    public interface AccountDao {
        /**
         * @param name  购买人
         * @param money  转账金额
         */
        void buyStock(String name, double money);
    
    }
    package cn.bdqn.dao;
    
    /**
     *   股票的接口  
     */
    public interface StockDao {
    
        /**
         * @param name   股票持有人
         * @param amount 增加股票的数量
         */
        void update(String name, int amount);
    }
    package cn.bdqn.dao.impl;
    
    import cn.bdqn.dao.AccountDao;
    import cn.bdqn.util.BaseDao;
    
    /**
     *账户的实现类
     */
    public class AccountDaoImpl extends BaseDao implements AccountDao {
    
        /**
         * 张三买股票的具体实现
         */
        @Override
        public void buyStock(String name, double money) {
            String sql = "UPDATE Account  SET balance=balance-? WHERE aname=?";
            Object[] params = { money, name };
            int row = executeUpdate(sql, params);
            if (row > 0) {
                System.out.println("张三转账成功!");
            } else {
                System.out.println("张三转账失败!");
            }
        }
    
    }
    package cn.bdqn.dao.impl;
    
    import cn.bdqn.dao.StockDao;
    import cn.bdqn.util.BaseDao;
    
    public class StockDaoImpl extends BaseDao implements StockDao {
    
        @Override
        public void update(String name, int amount) {
            String sql = "UPDATE stock  SET amount=amount+? WHERE sname=?";
            Object[] params = { amount, name };
            int row = executeUpdate(sql, params);
            if (row > 0) {
                System.out.println("张三购买股票成功!");
            } else {
                System.out.println("张三购买股票失败!");
            }
        }
    
    }
    package cn.bdqn.service;
    
    public interface BuyStockService {
    
        /**
         * @param name  谁
         * @param money  花了多少钱
         * @param amount  买了多少股
         * @throws Exception 
         */
        void buyStock(String name, double money, int amount) throws Exception;
    
    }
    package cn.bdqn.service.impl;
    
    import cn.bdqn.dao.AccountDao;
    import cn.bdqn.dao.StockDao;
    import cn.bdqn.dao.impl.AccountDaoImpl;
    import cn.bdqn.dao.impl.StockDaoImpl;
    import cn.bdqn.service.BuyStockService;
    
    /**
     *   业务逻辑层
     *     想把  dao层的两个业务 当成一个整体来执行!
     *     
     *    业务逻辑层 做的工作 是不是别人已经书写完毕,我们只是在不改变别人代码(Dao层)的前提下!
     *    增加点逻辑???是! 
     *    
     *    怎么保证不改变dao层的代码!
     *    让你自己去调用自己的代码!
     *    
     */
    public class BuyStockServiceImpl implements BuyStockService {
        // 创建需要的两个dao层的对象 调用自己的代码
        AccountDao accountDao = new AccountDaoImpl(); // 只是张三花钱
        StockDao stockDao = new StockDaoImpl(); // 张三股票增加
    
        /**
         * 购买股票
         * @throws Exception 
         */
        @Override
        public void buyStock(String name, double money, int amount)
                throws Exception {
            accountDao.buyStock(name, money);// 谁花了多少钱
            /*if (1 == 1) {
                throw new Exception("你被忽悠啦   哈哈!");
            }*/
            stockDao.update(name, amount); // 谁股票增加多少股
        }
    }
    package cn.bdqn.test;
    
    import cn.bdqn.service.BuyStockService;
    import cn.bdqn.service.impl.BuyStockServiceImpl;
    
    public class TestBank {
        public static void main(String[] args) throws Exception {
            BuyStockService service = new BuyStockServiceImpl();
            service.buyStock("李四", 10, 10);// 前台用户的输入
        }
    
    }
    package cn.bdqn.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class BaseDao {
    
        /**
         * 提取公共的属性!
         */
        protected Connection connection = null;
        protected PreparedStatement ps = null;
        protected ResultSet rs = null;
    
        /**
         * 公共连接数据库的方法
         */
        public boolean getConnection() {
            try {
                // 001.加载驱动
                Class.forName(ConfigManager.getValue("jdbc.driverClass"));
                // 002.连接数据库
                connection = DriverManager.getConnection(
                        ConfigManager.getValue("jdbc.url"),
                        ConfigManager.getValue("jdbc.userName"),
                        ConfigManager.getValue("jdbc.password"));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                return false;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        /**
         * 释放资源   
         *   必须做非空判断
         */
        public void closeConnection() {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        /**
         *  开始提取  所有类的 增删改 方法  executeUpdate
         * @param sql  :用户传递的sql语句
         * @param params  :用户sql语句中的参数! 因为我们不确定有没有参数,有几个参数???
         *                 所以使用...!
         *                 
         *                 update  dog set name=? where id=?;
         *                  两个?放在Object数组中!
         *                 
         *                 把数组 给 params(数组的操作)!
         *                 delete  from dog;
         *                 这时候只需要传递 sql语句!  还用参数params!
         *                 
         *                 
         */
    
        public int executeUpdate(String sql, Object... params) {
            int rowNum = 0; // 影响的行数
            if (getConnection()) { // 如果有连接
                // 创建执行sql的对象
                try {
                    ps = connection.prepareStatement(sql);
                    if (params != null) { // 有参数? 有几个呀?
                        for (int i = 0; i < params.length; i++) {
                            /**
                             *  有几个参数 赋值 几次
                             *  知道参数的类型吗?所以setObject
                             *  为什么写i + 1 , ?是从1开始的!
                             */
                            ps.setObject(i + 1, params[i]);
                        }
                    }
                    rowNum = ps.executeUpdate();// 没有参数的
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    // 释放资源
                    closeConnection();
                }
            }
    
            return rowNum;
        }
    
        /**
         * 开始提取  所有类的 查询 方法  executeQuery
         * @param sql 
         * @param params
         * @return  ResultSet  结果集
         * 
         *   select * from  dog
         *   select * from  dog  where id=?
         *   
         */
        public ResultSet executeQuery(String sql, Object... params) {
            if (getConnection()) { // 如果有连接
                // 创建执行sql的对象
                try {
                    ps = connection.prepareStatement(sql);
                    if (params != null) { // 有参数? 有几个呀?
                        for (int i = 0; i < params.length; i++) {
                            ps.setObject(i + 1, params[i]);
                        }
                    }
                    rs = ps.executeQuery();// 没有参数的
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return rs;
        }
    
    }
    package cn.bdqn.util;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * 为什么要把这个类 设置成单例模式!
     *      因为 我们所有的用户公用一个properties文件就可以了!
     *      
     *     目的就是只加载一次配置文件!!!*/
    public class ConfigManager {
        // 01.创建静态的自身对象 饿汉
        private static ConfigManager configManager;
        // 创建Properties对象 读取jdbc.properties文件
        private static Properties properties;
    
        // 02.私有化构造
        static {
            String path = "jdbc.properties";
            properties = new Properties();
            // 创建输入流对象
            InputStream stream = ConfigManager.class.getClassLoader()
                    .getResourceAsStream(path);
            try {
                properties.load(stream); // properties文件加载到内存中
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    stream.close(); // 关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 03.创建供外部访问的接口
        public static synchronized ConfigManager getInstance() {
            return configManager;
        }
    
        // properties文件是键值对的形式! 我们提供key 目的获取value
        public static String getValue(String key) {
            return properties.getProperty(key);
        }
    
    }
  • 相关阅读:
    idea系列---【测试一段代码执行时间,每次都得复制粘贴,idea如何设置自定义模板代码?】
    我爱java系列---【java8时间类Instant】
    我爱java系列---【Java比较浮点数的正确方式】
    idea系列---【idea常用快捷键大全】
    linux系列---【linux系统如何创建一个软/硬连接?】
    vue系列---【vue项目如何使用element-ui的弹框提示?】
    vue系列---【vue项目中element-ui如何实现在登陆之前进行预校验?校验通过才允许调后台接口】
    vue系列---【vue项目中element-ui如何实现点击重置按钮,重置表单数据?】
    vue系列---【element-ui如何给表单添加参数验证?】
    面对对象的随笔
  • 原文地址:https://www.cnblogs.com/cuixiaomeng/p/7185359.html
Copyright © 2020-2023  润新知