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

}
原文地址:https://www.cnblogs.com/cuixiaomeng/p/7185359.html