账户张三购买股票
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); } }