mapengpeng1999@163.com Dao买书程序

有三张表:
账户表 : 账户ID,账户名,密码,账户余额
图书信息表 :图书编号,图书名称,图书单价 ,库存ID
图书库存表: 库存ID,图书编号,图书库存数量
1,编写登录程序,用户输入用户名和密码,和账户表进行匹配,匹配成功进入第2步,失败提示用户登录失败
2,显示所有图书信息,包括图书编号,书名,单价及图书库存,显示当前登录的账户名称和账户余额
3,用户输入所需要购买的图书编号,进行图书购买
(1)查询图书单价
(2)减少账户余额
(3)减少图书库存数量1
如果账户余额小于0或者图书库存小于0则不能够购买
库和表的设计:
CREATE DATABASE buybook;
CREATE TABLE IF NOT EXISTS account (
	acc_id INT PRIMARY KEY AUTO_INCREMENT,
	acc_name VARCHAR(20) NOT NULL,
	acc_pass VARCHAR(20) NOT NULL,
	acc_balance DOUBLE(10,2) DEFAULT 0
);
CREATE TABLE book_info(
	book_no INT PRIMARY KEY AUTO_INCREMENT,
	book_name VARCHAR(20) NOT NULL,
	book_price DOUBLE(10,2)  DEFAULT 0,
	stock_id INT
	);
CREATE TABLE book_stock(
	stock_id INT PRIMARY KEY AUTO_INCREMENT,
	stock_num INT DEFAULT 0,
	book_no INT,
	CONSTRAINT book_stock_fk FOREIGN KEY(book_no) REFERENCES book_info(book_no)
);
ALTER TABLE book_info ADD CONSTRAINT book_info_fk FOREIGN KEY(stock_id) REFERENCES book_stock(stock_id);
package com.wanbangee.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtil {
	public static final String DRIVERCLASS = "com.mysql.jdbc.Driver";
	public static final String URL = "jdbc:mysql:///buybook";
	public static final String USER = "root";
	public static final String PASSWORD = "3306";
	
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName(DRIVERCLASS);
			conn = DriverManager.getConnection(URL,USER,PASSWORD);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}
package com.wanbangee.books;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import com.wanbangee.util.DBUtil;

public class BooksDemo {
	public static void main(String[] args) {
		BooksManager bm = new BooksManager();
		Scanner sc = new Scanner(System.in);
		boolean flag = false;//判断是否登入
		int temp = 1;
		do {
			if(!flag) {//没有登入,则必须先登入
				System.out.println("请输入账户名:");
				String inputAccName = sc.next();
				System.out.println("请输入账户密码:");
				String inputAccPass = sc.next();
				flag = bm.login(inputAccName, inputAccPass);
				if(flag) {
					System.out.println("欢迎您:" + inputAccName + ",您的账户余额为:" + bm.getAccBalance());
				}else {
					System.out.println("登入失败:");
				}
			}else {
				bm.showBppksInfo();
				System.out.println("请输入购买图书的编号:");
				Integer bookNo = sc.nextInt();
				boolean f = bm.buyBook(bm.getAccId(), bookNo);
				if(f) {
					System.out.println("买书成功");
					bm.showBppksInfo();
					System.out.println("买书成功,继续购买请输入1,退出请输入0:");
					temp = sc.nextInt();
				}
			}
		}while(temp != 0);
	}
}

class BooksManager{
	private Integer accId;
	private String accName;
	private Double accBalance;
	public Integer getAccId() {
		return accId;
	}
	public void setAccId(Integer accId) {
		this.accId = accId;
	}
	public String getAccName() {
		return accName;
	}
	public void setAccName(String accName) {
		this.accName = accName;
	}
	public Double getAccBalance() {
		return accBalance;
	}
	public void setAccBalance(Double accBalance) {
		this.accBalance = accBalance;
	}
	
	//登入,通过用户名和密码验证用户是否存在
	public boolean login(String accName,String accPass) {
		boolean flag = false;
		Connection conn =null;
		PreparedStatement pstate = null;
		ResultSet res = null;
		
		try {
			conn = DBUtil.getConnection();//获得数据库连接
			String sql = "select acc_id,acc_balance from account where acc_name = ? and acc_pass = ?";
			pstate = conn.prepareStatement(sql);
			pstate.setString(1, accName);
			pstate.setString(2, accPass);
			res = pstate.executeQuery();
			while(res.next()) {
				flag = true;
				this.accId = res.getInt(1);
				this.accName = accName;
				this.accBalance = res.getDouble(2);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				res.close();
				pstate.close();
				conn.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return flag;
	}


//显示图书信息
public void showBppksInfo() {
	Connection conn =null;
	PreparedStatement pstate = null;
	ResultSet res = null;
	
	try {
		conn = DBUtil.getConnection();//获得数据库连接
		String sql = "select a.book_no,a.book_name,a.book_price, b.stock_num from book_info a inner join book_stock b on a.book_no = b.book_no and a.stock_id = b.stock_id";
		pstate = conn.prepareStatement(sql);
		res = pstate.executeQuery();
		System.out.println("书号\t书名\t单价\t库存数量");
		while(res.next()) {
			System.out.println(res.getInt(1) + "\t" + res.getString(2) + "\t" +res.getDouble(3) + "\t" +res.getInt(4));
		}
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		try {
			res.close();
			pstate.close();
			conn.close();
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
}

//购买图书,有3个步骤,要加事务
public boolean buyBook(Integer accId,Integer bookNo) {
	boolean flag = false;
	Connection conn =null;
	PreparedStatement pstate1 = null;
	PreparedStatement pstate2 = null;
	PreparedStatement pstate3 = null;
	ResultSet res = null;
	
	try {
		conn = DBUtil.getConnection();//获得数据库连接
		
		conn.setAutoCommit(false);//取消事务自动提交
		//1查询图书单价
		String sql = "select book_price from book_info where book_no = ?";
		pstate1 = conn.prepareStatement(sql);
		pstate1.setInt(1, bookNo);
		res = pstate1.executeQuery();
		double bookPrice = 0;
		while(res.next()) {
			bookPrice = res.getDouble(1);
		}
		//2减少账户余额,在原来余额上减掉图书价格
		sql = "update account set acc_balance = acc_balance - ? where acc_id = ?";
		pstate2 = conn.prepareStatement(sql);
		pstate2.setDouble(1, bookPrice);
		pstate2.setInt(2, accId);
		pstate2.execute();
		//3减少图书库存数量1
		sql = "update book_stock set stock_num = stock_num - 1 where book_no = ?";
		pstate3 = conn.prepareStatement(sql);
		pstate3.setInt(1, bookNo);
		pstate3.execute();
		
		flag = true;
		conn.commit();//没有异常提交事务
	} catch (Exception e) {
		try {
			conn.rollback();//有异常回滚事务
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		e.printStackTrace();
	}finally {
		try {
			res.close();
			pstate3.close();
			pstate2.close();
			pstate1.close();
			conn.close();
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
	return flag;
}
}

Dao总结:先来三个包名,com.wanbangee.dao com.wanbangee.service com.wanbangee.controller
在dao包中先建entities实体类(一个表或视图就是一个实体类,set和get方法,有参和无参构造器),dao , daoimp, daoproxy(丢弃), daofactory

package com.wanbangee.entities;

public class Account {
	private Integer accId;
	private String accName;
	private String accPass;
	private Double accBalance;
	public Integer getAccId() {
		return accId;
	}
	public void setAccId(Integer accId) {
		this.accId = accId;
	}
	public String getAccName() {
		return accName;
	}
	public void setAccName(String accName) {
		this.accName = accName;
	}
	public String getAccPass() {
		return accPass;
	}
	public void setAccPass(String accPass) {
		this.accPass = accPass;
	}
	public Double getAccBalance() {
		return accBalance;
	}
	public void setAccBalance(Double accBalance) {
		this.accBalance = accBalance;
	}
	public Account() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Account(Integer accId, String accName, String accPass, Double accBalance) {
		super();
		this.accId = accId;
		this.accName = accName;
		this.accPass = accPass;
		this.accBalance = accBalance;
	}
	
}
package com.wanbangee.entities;

public class BookInfo {
	private Integer bookNo;
	private String bookName;
	private Double bookPrice;
	private Integer stockId;
	//引用图书库存,每本书都有个库存对象,每本书引用一个库存对象
	private BookStock bookStock;
	public Integer getBookNo() {
		return bookNo;
	}
	public void setBookNo(Integer bookNo) {
		this.bookNo = bookNo;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public Double getBookPrice() {
		return bookPrice;
	}
	public void setBookPrice(Double bookPrice) {
		this.bookPrice = bookPrice;
	}
	public Integer getStockId() {
		return stockId;
	}
	public void setStockId(Integer stockId) {
		this.stockId = stockId;
	}
	public BookStock getBookStock() {
		return bookStock;
	}
	public void setBookStock(BookStock bookStock) {
		this.bookStock = bookStock;
	}
	public BookInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public BookInfo(Integer bookNo, String bookName, Double bookPrice, Integer stockId) {
		super();
		this.bookNo = bookNo;
		this.bookName = bookName;
		this.bookPrice = bookPrice;
		this.stockId = stockId;
	}
	
}
package com.wanbangee.entities;

public class BookStock {
	private Integer stockId;
	private Integer stockNum;
	private Integer bookNo;
	public Integer getStockId() {
		return stockId;
	}
	public void setStockId(Integer stockId) {
		this.stockId = stockId;
	}
	public Integer getStockNum() {
		return stockNum;
	}
	public void setStockNum(Integer stockNum) {
		this.stockNum = stockNum;
	}
	public Integer getBookNo() {
		return bookNo;
	}
	public void setBookNo(Integer bookNo) {
		this.bookNo = bookNo;
	}
	public BookStock(Integer stockId, Integer stockNum, Integer bookNo) {
		super();
		this.stockId = stockId;
		this.stockNum = stockNum;
		this.bookNo = bookNo;
	}
	public BookStock() {
		super();
		// TODO Auto-generated constructor stub
	}
	
}
package com.wanbangee.dao;
import com.wanbangee.entities.Account;
public interface AccountDao {
//账户表有2个操作,即有2个方法,一个是登入方法,一个是买书减少账户余额方法
	//登入,查询操作,根据用户名和密码查询用户信息并返回用户对象
	//实体类的一个对象就是表中的一笔数据(含多个字段信息)
	public Account selectAccountByAccNameAndAccPass(String accName,String accPass);

//减少账户余额,减少的余额就是图书的单价
	public boolean updateAccBalanceByAccId(Double bookPrice,Integer accId);
	//两个参数,一个是减少金额,一个是减少账户ID
}
package com.wanbangee.dao;
import java.util.List;
import com.wanbangee.entities.BookInfo;
public interface BookInfoDao {
	//图书表的操作,查询所有图书信息,图书信息有多个,用集合存储
	//没有库存信息,只是针对图书表的操作
	public List<BookInfo> selectBookInfo();
	//查询图书单价(买书过程),根据图书编号查询图书单价
	public double selectBookPriceByBookNo(Integer bookNo);
}
package com.wanbangee.dao;
import com.wanbangee.entities.BookStock;
public interface BookStockDao {
	//在图书表查不到图书库存信息
	//根据图书编号查询库存信息
	public BookStock selectBookStockByBookNo(Integer bookNo);
	//减少图书库存数量,根据图书编号
	public boolean updateStockNumByBookNo(Integer bookNo);
}
package com.wanbangee.dao.imp;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.wanbangee.dao.AccountDao;
import com.wanbangee.entities.Account;
import com.wanbangee.util.DBUtil;

public class AccountDaoImp implements AccountDao {
	private Connection conn;
	public AccountDaoImp(Connection conn) {
		this.conn = conn;
	}
	@Override
	public Account selectAccountByAccNameAndAccPass(String accName, String accPass) {
		Account account = null;
		PreparedStatement pstate = null;
		ResultSet res = null;
		
		try {
			String sql = "select acc_id,acc_balance from account where acc_name = ? and acc_pass = ?";
			pstate = this.conn.prepareStatement(sql);
			pstate.setString(1, accName);
			pstate.setString(2, accPass);
			res = pstate.executeQuery();
			while(res.next()) {
				//Integer accId, String accName, String accPass, Double accBalance
				account = new Account(res.getInt(1),accName,null,res.getDouble(2));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				res.close();
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return account;
	}

	@Override
	public boolean updateAccBalanceByAccId(Double bookPrice, Integer accId) {
		boolean flag = false;
		PreparedStatement pstate = null;
		try {
			String sql = "update account set acc_balance = acc_balance - ? where acc_id = ?";
			pstate = conn.prepareStatement(sql);
			pstate.setDouble(1, bookPrice);
			pstate.setInt(2, accId);
			pstate.execute();
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return flag;
	}

}
package com.wanbangee.dao.imp;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.wanbangee.dao.BookInfoDao;
import com.wanbangee.entities.BookInfo;

public class BookInfoDaoImp implements BookInfoDao {
	private Connection conn;
	public BookInfoDaoImp(Connection conn) {
		this.conn = conn;
	}
	@Override
	public List<BookInfo> selectBookInfo() {
		List<BookInfo> bookInfos = new ArrayList<>();//查询的信息以集合形式返回
		PreparedStatement pstate = null;
		ResultSet res = null;
		try {
			String sql = "select book_no,book_name,book_price,stock_id from book_info ";
			pstate = this.conn.prepareStatement(sql);
			res = pstate.executeQuery();
			while (res.next()) {
				// Integer bookNo, String bookName, Double bookPrice, Integer stockId
				BookInfo bookInfo = new BookInfo(res.getInt(1), res.getString(2), res.getDouble(3), res.getInt(4));
				bookInfos.add(bookInfo);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				res.close();
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return bookInfos;
	}
	@Override
	public double selectBookPriceByBookNo(Integer bookNo) {
		PreparedStatement pstate = null;
		ResultSet res = null;
		double bookPrice = 0;
		try {
			String sql = "select book_price from book_info where book_no = ?";
			pstate = conn.prepareStatement(sql);
			pstate.setInt(1, bookNo);
			res = pstate.executeQuery();
			while (res.next()) {
				bookPrice = res.getDouble(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				res.close();
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return bookPrice;
	}

}
package com.wanbangee.dao.imp;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.wanbangee.dao.BookStockDao;
import com.wanbangee.entities.BookStock;

public class BookStockDaoImp implements BookStockDao {
	private Connection conn ;
	public BookStockDaoImp(Connection conn) {
		this.conn  = conn;
	}
	@Override
	public BookStock selectBookStockByBookNo(Integer bookNo) {
		PreparedStatement pstate = null;
		ResultSet res = null;
		BookStock bookStock = null;
		try {
			String sql = "select stock_id,stock_num from book_stock where book_no = ?";
			pstate = conn.prepareStatement(sql);
			pstate.setInt(1, bookNo);
			res = pstate.executeQuery();
			while (res.next()) {
				//Integer stockId, Integer bookNo, Integer stockNum
				bookStock = new BookStock(res.getInt(1),bookNo,res.getInt(2));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				res.close();
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return bookStock;
	}

	@Override
	public boolean updateStockNumByBookNo(Integer bookNo) {
		PreparedStatement pstate = null;
		boolean flag = false;
		try {
			String sql = "update book_stock set stock_num = stock_num-1 where book_no = ?";
			pstate = conn.prepareStatement(sql);
			pstate.setInt(1, bookNo);
			pstate.execute();
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				pstate.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return flag;
	}

}
package com.wanbangee.dao.proxy;

import java.sql.Connection;
import java.sql.SQLException;

import com.wanbangee.dao.AccountDao;
import com.wanbangee.dao.imp.AccountDaoImp;
import com.wanbangee.entities.Account;
import com.wanbangee.util.DBUtil;

public class AccountDaoProxy implements AccountDao {
//代理类要调用真实主题类,取得和关闭数据库连接
//之前数据库的连接和关闭放在代理实现类,
//加了事务后数据库的连接和关闭放在业务实现类层。	
//代理实现类阻碍了事务的操作,丢弃代理实现类
	@Override
	public Account selectAccountByAccNameAndAccPass(String accName, String accPass) {
		Connection conn = null;
		Account account = null;
		try {
			conn = DBUtil.getConnection();
			AccountDaoImp imp = new AccountDaoImp(conn);
			account = imp.selectAccountByAccNameAndAccPass(accName, accPass);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return account;
	}

	@Override
	public boolean updateAccBalanceByAccId(Double bookPrice, Integer accId) {
		Connection conn = null;
		boolean flag = false;
		try {
			conn = DBUtil.getConnection();
			AccountDaoImp imp = new AccountDaoImp(conn);
			flag = imp.updateAccBalanceByAccId(bookPrice, accId);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return flag;
	}

}
package com.wanbangee.dao.proxy;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import com.wanbangee.dao.BookInfoDao;
import com.wanbangee.dao.imp.BookInfoDaoImp;
import com.wanbangee.entities.BookInfo;
import com.wanbangee.util.DBUtil;

public class BookInfoDaoProxy implements BookInfoDao {

	@Override
	public List<BookInfo> selectBookInfo() {
		Connection conn = null;
		List<BookInfo> bookInfos = null;
		try {
			conn = DBUtil.getConnection();
			BookInfoDaoImp imp = new BookInfoDaoImp(conn);
			bookInfos = imp.selectBookInfo();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return bookInfos;
	}

	@Override
	public double selectBookPriceByBookNo(Integer bookNo) {
		Connection conn = null;
		double bookPrice = 0;
		try {
			conn = DBUtil.getConnection();
			BookInfoDaoImp imp = new BookInfoDaoImp(conn);
			bookPrice = imp.selectBookPriceByBookNo(bookNo);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return bookPrice;
	}

}
package com.wanbangee.dao.proxy;

import java.sql.Connection;
import java.sql.SQLException;

import com.wanbangee.dao.BookStockDao;
import com.wanbangee.dao.imp.BookStockDaoImp;
import com.wanbangee.entities.BookStock;
import com.wanbangee.util.DBUtil;

public class BookStockDaoProxy implements BookStockDao {

	@Override
	public BookStock selectBookStockByBookNo(Integer bookNo) {
		Connection conn = null;
		BookStock bookStock = null;
		try {
			conn = DBUtil.getConnection();
			BookStockDaoImp imp = new BookStockDaoImp(conn);
			bookStock = imp.selectBookStockByBookNo(bookNo);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return bookStock;
	}

	@Override
	public boolean updateStockNumByBookNo(Integer bookNo) {
		Connection conn = null;
		boolean flag = false;
		try {
			conn = DBUtil.getConnection();
			BookStockDaoImp imp = new BookStockDaoImp(conn);
			flag = imp.updateStockNumByBookNo(bookNo);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return flag;
	}
}
package com.wanbangee.dao.factory;
import java.sql.Connection;
import com.wanbangee.dao.AccountDao;
import com.wanbangee.dao.imp.AccountDaoImp;

public class AccountDaoFactory {
	public static AccountDao getAccountDaoInstance(Connection conn) {
		return new AccountDaoImp(conn);
	}
}
package com.wanbangee.dao.factory;
import java.sql.Connection;
import com.wanbangee.dao.BookInfoDao;
import com.wanbangee.dao.imp.BookInfoDaoImp;

public class BookInfoDaoFactory {
	public static BookInfoDao getBookInfoDaoInstance(Connection conn) {
		return new BookInfoDaoImp(conn);
	}
}
package com.wanbangee.dao.factory;
import java.sql.Connection;
import com.wanbangee.dao.BookStockDao;
import com.wanbangee.dao.imp.BookStockDaoImp;

public class BookStockDaoFactory {
	public static BookStockDao getBookStockDaoInstance(Connection conn) {
		return new BookStockDaoImp(conn);
	}
}
package com.wanbangee.service;
import java.util.List;
import com.wanbangee.entities.Account;
import com.wanbangee.entities.BookInfo;

public interface BuyBookService {
	//业务层命名没有Dao那么规范
    public Account login(String accName,String accPass);
	
	public List<BookInfo> getBookInfo();//获得图书信息
	
	public  boolean buyBook(Integer accId,Integer bookNo);
}
package com.wanbangee.service.imp;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import com.wanbangee.dao.factory.AccountDaoFactory;
import com.wanbangee.dao.factory.BookInfoDaoFactory;
import com.wanbangee.dao.factory.BookStockDaoFactory;
import com.wanbangee.entities.Account;
import com.wanbangee.entities.BookInfo;
import com.wanbangee.service.BuyBookService;
import com.wanbangee.util.DBUtil;

public class BuyBookServiceImp implements BuyBookService {

	//登录
		@Override
		public Account login(String accName, String accPass) {
			Connection conn = null;
			Account account = null;
			try {
				conn = DBUtil.getConnection();
				account = AccountDaoFactory.getAccountDaoInstance(conn).selectAccountByAccNameAndAccPass(accName, accPass);
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return account;
		}

		//获得图书信息
		@Override
		public List<BookInfo> getBookInfo() {
			Connection conn = null;
			List<BookInfo> bookInfos = null;
			try {
				conn = DBUtil.getConnection();
				bookInfos = BookInfoDaoFactory.getBookInfoDaoInstance(conn).selectBookInfo();
				/*
				 *  注意点:目前的bookInfos 中没有携带图书库存信息
				 * */
				for (BookInfo bookInfo : bookInfos) {
					// 查询图书的库存信息设置到bookInfos中
					bookInfo.setBookStock(BookStockDaoFactory.getBookStockDaoInstance(conn).selectBookStockByBookNo(bookInfo.getBookNo()));
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return bookInfos;
		}

		//买书
		@Override
		public boolean buyBook(Integer accId, Integer bookNo) {
			Connection conn = null;
			boolean flag = false;
			try {
				conn = DBUtil.getConnection();
				conn.setAutoCommit(false);
				//1 查询图书单价
				double bookPrice = BookInfoDaoFactory.getBookInfoDaoInstance(conn).selectBookPriceByBookNo(bookNo);
				//2减少账户余额
				flag = AccountDaoFactory.getAccountDaoInstance(conn).updateAccBalanceByAccId(bookPrice, accId);
				if(flag) {
					//3 减少图书库存信息
					flag = BookStockDaoFactory.getBookStockDaoInstance(conn).updateStockNumByBookNo(bookNo);
				}
				if(flag) {
					conn.commit();
				}
				
				if(!flag){
					try {
						conn.rollback();
					} catch (SQLException e1) {
						e1.printStackTrace();
					}
				}
			}catch(Exception e){
				try {
					conn.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			return flag;
		}

	}
package com.wanbangee.controller;

import java.util.List;

import com.wanbangee.entities.Account;
import com.wanbangee.entities.BookInfo;
import com.wanbangee.service.BuyBookService;
import com.wanbangee.service.imp.BuyBookServiceImp;

public class BuyBookController {
//控制层:把业务层处理的数据响应给前端
//控制层 :前端通过请求访问到控制层,控制调用业务层,业务层调用数据访问层
	public Account login(String accName,String accPass) {
		BuyBookService service = new BuyBookServiceImp();
		return service.login(accName, accPass);
	}
	
	public List<BookInfo> getBookInfo(){
		BuyBookService service = new BuyBookServiceImp();
		return service.getBookInfo();
	}
	
	public  boolean buyBook(Integer accId,Integer bookNo) {
		BuyBookService service = new BuyBookServiceImp();
		return service.buyBook(accId, bookNo);
	}
}
package com.wanbangee.controller.test;

import java.util.List;
import java.util.Scanner;

import com.wanbangee.controller.BuyBookController;
import com.wanbangee.entities.Account;
import com.wanbangee.entities.BookInfo;

public class BuyBookControllerTest {
	public static void main(String[] args) {
		BuyBookController controller = new BuyBookController();
		Scanner sc = new Scanner(System.in);
		Account account = null;
		int temp = 1;
		do {
			if (account == null) { // 没有登录,则必须先登录
				System.out.print("请输入账户名:");
				String inputAccName = sc.next();
				System.out.print("请输入账户密码:");
				String inputAccPass = sc.next();
				account = controller.login(inputAccName, inputAccPass);
				if (null != account) {
					System.out.println("欢迎您:" + inputAccName + ",您的账户余额为:" + account.getAccBalance());
				} else {
					System.out.println("登录失败");
				}
			} else {
				printBookInfo(controller);
				System.out.print("请输入购买图书的编号:");
				Integer bookNo = sc.nextInt();
				boolean f = controller.buyBook(account.getAccId(), bookNo);
				if(f) {
					System.out.println("卖书成功");
					printBookInfo(controller);
					System.out.print("继续购买请输入1,退出请输入0 : ");
					temp = sc.nextInt();
				}
		}
		
	}
	while(temp != 0);
	}
	
	public static void printBookInfo(BuyBookController controller) {
		List<BookInfo> bookInfos = controller.getBookInfo();
		System.out.println("图书编号\t\t图书名称\t\t图书单价\t\t图书库存");
		for (BookInfo bookInfo : bookInfos) {
			System.out.println(bookInfo.getBookNo() + "\t\t" + bookInfo.getBookName()+"\t\t" + bookInfo.getBookPrice() + "\t\t" + bookInfo.getBookStock().getStockNum());
		}
	}
}
package com.wanbangee.util;
import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtil {
	public static final String DRIVERCLASS = "com.mysql.jdbc.Driver";
	public static final String URL = "jdbc:mysql:///buybook";
	public static final String USER = "root";
	public static final String PASSWORD = "3306";
	
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName(DRIVERCLASS);
			conn = DriverManager.getConnection(URL,USER,PASSWORD);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值