功能分析:

只有一个角色客户,客户可以

  --查看图书信息(包括查看图书详细信息,使用条件(例价格区间)查看图书信息,对图书进行翻页)

  --把图书加入购物车

  --查看购物车

  --修改购物车(包括清空购物车,修改购物车单本图书数量,删除单本图书)

  --结账(填写用户名和账号信息)

  --查看交易记录

总体架构:

MVC 设计模式:

  --model:POJO

  --controller:Servlet

  --view:JSP + EL + JSTL

技术选型:

  数据库:Mysql

  数据源:C3P0

  JDBC 工具:DBUtils

  事务解决方案:Filter + ThreadLocal

  Ajax 解决方案:jQuery + JavaScript + JSON + google-gson

  层之间解耦方案:工厂设计模式

数据表设计:

在 Mysql 数据库中建好这些数据表。

配置好环境

实体类设计Account(账户表,用于支付),User(客户表,存储客户基本信息),Trade(交易项),TradeItem(交易记录),Book,ShoppingCartItem,ShoppingCart

DAO 层设计:(这里先每个方法手动的获取Connection,在后面操作事务时,再改成获取统一的Connection)

  - Dao 接口,定义 Dao 的基本操作,使用BaseDao 实现 Dao 接口。

  - BaseDao :使用 DBUtils 工具类提供 Dao 接口的具体实现。

     BookDao 接口:用于定义操作 Book 实体类的基本方法。

  - BookDaoImpl :使用 BaseDao 中的方法实现 BookDao。

Dao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import java.util.List;
 4
 5 /**
 6  * Dao 接口,定义 Dao 的基本操作,由BaseDao 提供实现。
 7  * @param <T>:Dao 实际操作的泛型类型。
 8  */
 9 public interface Dao<T> {
10
11     /**
12      * 执行 update 操作(insert(但没有返回值)、update、delete)
13      * @param sql:待执行的 SQL 语句。
14      * @param args:填充占位符的可变参数。
15      */
16     void update(String sql, Object...args);
17
18     /**
19      * 执行 insert 操作,返回插入后的记录的ID
20      * @param sql:待执行的 SQL 语句。
21      * @param args:填充占位符的可变参数。
22      * @return:插入新记录的ID。
23      */
24     long insert(String sql, Object...args);
25
26     /**
27      * 执行单条记录的查询,返回与记录对应的类的一个对象。
28      * @param sql:待执行的SQL 语句。
29      * @param args:填充占位符的可变参数。
30      * @return:与记录对应的类的一个对象。
31      */
32     T query(String sql, Object...args);
33
34     /**
35      * 执行多条记录的查询,返回与记录对应的类的一个List。
36      * @param sql:待执行的 SQL 语句。
37      * @param args:填充占位符的可变参数。
38      * @return:与记录对应的类的一个 List。
39      */
40     List<T> queryForList(String sql, Object...args);
41
42     /**
43      * 执行一个属性或值得查询,例如查询某一条记录的一个字段或查询某个统计信息,返回要查询的值。
44      * @param sql:待执行的 SQL 语句。
45      * @param args:填充占位符的可变参数。
46      * @return:返回要查询的一个属性或值。
47      */
48     <E> E getForValue(String sql, Object...args);
49
50     /**
51      * 执行批量根性操作
52      * @param sql:待执行的 SQL 语句。
53      * @param params:填充占位符的可变参数。
54      */
55     void batch(String sql, Object[]...params);
56 }

BookDao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import java.util.Collection;
 4 import java.util.List;
 5
 6 import com.hnust.bookstore.domain.Book;
 7 import com.hnust.bookstore.domain.ShoppingCartItem;
 8 import com.hnust.bookstore.web.CriteriaBook;
 9 import com.hnust.bookstore.web.Page;
10
11 public interface BookDao {
12
13     /**
14      * 根据 bookId 获取指定的 Book 对象
15      * @param bookId
16      * @return
17      */
18     public abstract Book getBook(int bookId);
19
20     /**
21      * 根据传入的CriteriaBook 对象返回对应的 Page 对象。
22      * @param cb
23      * @return
24      */
25     public abstract Page<Book> getPage(CriteriaBook cb);
26
27     /**
28      * 根据传入的 CriteriaBook 对象返回对应的记录个数。
29      * @param cb
30      * @return
31      */
32     public abstract long getTotalBookNumber(CriteriaBook cb);
33
34     /**
35      * 根据传入的 CriteriaBook 和 pageSize 返回当前页对应的 List。
36      * @param cb
37      * @param pageSize
38      * @return
39      */
40     public abstract List<Book> getPageList(CriteriaBook cb, int pageSize);
41
42     /**
43      * 返回指定的 id 的 book 的 storeNumber 字段的值。
44      * @param id
45      * @return
46      */
47     public abstract int getStoreNumber(Integer bookId);
48
49     /**
50      * 根据传入的 ShoppingCartItem 的集合,
51      * 批量更新 books 数据表的 storenumber 和 salesnumber 字段的值
52      * @param items
53      */
54     public abstract void batchUpdateStoreNUmberAndSalesAmount(Collection<ShoppingCartItem> items);
55 }

AccountDao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import com.hnust.bookstore.domain.Account;
 4
 5 public interface AccountDao {
 6
 7     /**
 8      * 根据传入的 accountId 获取对应的 Account 对象。
 9      * @param accountId
10      * @return
11      */
12     public abstract Account get(Integer accountId);
13
14     /**
15      * 根据传入的 accountId、amount 更新指定账户的余额:扣除 amount 指定的钱数。
16      * @param accountId
17      * @param amount
18      */
19     public abstract void updateBalance(Integer accountId, float amount);
20 }

TradeDao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import java.util.Set;
 4
 5 import com.hnust.bookstore.domain.Trade;
 6
 7 public interface TradeDao {
 8
 9     /**
10      * 向数据表中插入 Trade 对象
11      * @param trade
12      */
13     public abstract void insert(Trade trade);
14
15     /**
16      * 根据 userId 获取和其关联的 Trade 的集合
17      * @param userId
18      * @return
19      */
20     public abstract Set<Trade> getTradesWithUserId(Integer userId);
21 }

TradeItemDao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import java.util.Collection;
 4 import java.util.Set;
 5
 6 import com.hnust.bookstore.domain.TradeItem;
 7
 8 public interface TradeItemDao {
 9
10     /**
11      * 批量保存 TradeItem 对象
12      * @param items
13      */
14     public abstract void batchSave(Collection<TradeItem> items);
15
16     /**
17      * 根据 tradeId 获取和其关联的 TradeItem 的集合。
18      * @param tradeId
19      * @return
20      */
21     public abstract Set<TradeItem> getTradeItemsWithTradeId(Integer tradeId);
22 }

UserDao 接口 代码:

 1 package com.hnust.bookstore.dao;
 2
 3 import com.hnust.bookstore.domain.User;
 4
 5 public interface UserDao {
 6
 7     /**
 8      * 根据用户名获取 User 对象。
 9      * @param userName
10      * @return
11      */
12     public abstract User getUser(String userName);
13 }

封装翻页信息的 Page 类:

  -pageNo (当前页的页码)

  -list (本业需要显示的 list (选购的书籍的集合))

  -pageSize (每页显示多少条记录)

  -totalItemNumber (总的记录数,用来计算总的页数)

  -Page(int) : 构造器,初始化当前页的页码 pageNo,在Servlet 里面对其进行赋值。

  -getPageNo():返回当前页的页码,注意:需通过 getTatalPageNumber() 进行校验,因为有可能传入的页码不一定是合法的。

  -getList():

  -setList():设置当前页需要显示的 List 对象,是在 DAO 对其进行赋值。

  -getPageSize():返回当前页显示多少条记录

  -getTotalPageNumber():获取总页码数,需计算得出

  -setTotalItemNumber():设置总的记录数,是在 DAO 对其进行赋值。

  -isHasNext()

  -isHasPrev()

  -getPrevPage()

  -getNextPage()

封装查询条件的 CriteriaBook 类:

  -minPrice:价格区间的最小值,默认为 0

  -maxPrice:价格区间的最大值,默认为 Integer.MAX_VALUE

  -pageNo:当前页的页码

  -CriteriaBook()

  -CriteriaBook(int, int, int)

  -getMinPrice()

  -setMinPrice(int)

  -getMaxPrice()

  -setMaxPrice(int)

  -getPageNo()

  -setPageNo(int)

  -toString()

BaseDao 代码:

  1 package com.hnust.bookstore.dao.impl;
  2
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.Statement;
  7 import java.util.List;
  8
  9 import org.apache.commons.dbutils.QueryRunner;
 10 import org.apache.commons.dbutils.handlers.BeanHandler;
 11 import org.apache.commons.dbutils.handlers.BeanListHandler;
 12 import org.apache.commons.dbutils.handlers.ScalarHandler;
 13
 14 import com.hnust.bookstore.dao.Dao;
 15 import com.hnust.bookstore.db.JDBCUtils;
 16 import com.hnust.bookstore.utils.ReflectionUtils;
 17 import com.hnust.bookstore.web.ConnectionContext;
 18 import com.sun.org.apache.regexp.internal.recompile;
 19
 20 public class BaseDao<T> implements Dao<T> {
 21
 22     private QueryRunner queryRunner = new QueryRunner();
 23
 24     private Class<T> clazz;
 25
 26     public BaseDao(){
 27         clazz = ReflectionUtils.getSuperGenericType(getClass());
 28     }
 29
 30     @Override
 31     public void update(String sql, Object... args) {
 32
 33         Connection conn = null;
 34
 35         try {
 36             //获取连接
 37             conn = JDBCUtils.getConnection();
 38             queryRunner.update(conn, sql, args);
 39
 40         } catch (Exception e) {
 41             e.printStackTrace(); }
 42         }finally{
 43             JDBCUtils.release(conn);
 44         }
 45     }
 46
 47     @Override
 48     public long insert(String sql, Object... args) {
 49
 50         long id = 0;
 51         Connection conn = null;
 52         PreparedStatement ps = null;
 53         ResultSet rs = null;
 54
 55         try {
 56             conn = JDBCUtils.getConnection();
 57             ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
 58
 59             if(args != null){
 60                 for(int i = 0; i < args.length; i++){
 61                     ps.setObject(i + 1, args[i]);
 62                 }
 63             }
 64             ps.executeUpdate();
 65             //获取生成的主键值
 66             rs = ps.getGeneratedKeys();
 67             if(rs.next()){
 68                 id = rs.getLong(1);
 69             }
 70         } catch (Exception e) {
 71             e.printStackTrace();
 72         }finally{
 73             JDBCUtils.release(rs, ps);
 74             JDBCUtils.release(conn);
 75         }
 76         return id;
 77     }
 78
 79     @Override
 80     public T query(String sql, Object... args) {
 81         Connection conn = null;
 82
 83         try {
 84             conn = JDBCUtils.getConnection();
 85             return queryRunner.query(conn, sql, new BeanHandler<>(clazz), args);
 86         } catch (Exception e) {
 87             e.printStackTrace();
 88         }
 89         finally{
 90             JDBCUtils.release(conn);
 91         }
 92         return null;
 93     }
 94
 95     @Override
 96     public List<T> queryForList(String sql, Object... args) {
 97
 98         Connection conn = null;
 99         try {
100             conn = JDBCUtils.getConnection();
101             return queryRunner.query(conn, sql, new BeanListHandler<>(clazz), args);
102         } catch (Exception e) {
103             e.printStackTrace();
104         }
105         finally{
106             JDBCUtils.release(conn);
107         }
108         return null;
109     }
110
111     @Override
112     public <E> E getForValue(String sql, Object... args) {
113         Connection conn = null;
114
115         try {
116             conn = JDBCUtils.getConnection();
117             return (E) queryRunner.query(conn, sql, new ScalarHandler(), args);
118         } catch (Exception e) {
119             e.printStackTrace();
120         }
121         finally{
122             JDBCUtils.release(conn);
123         }
124         return null;
125     }
126
127     @Override
128     public void batch(String sql, Object[]... params) {
129         Connection conn = null;
130
131         try {
132             conn = JDBCUtils.getConnection();
133             queryRunner.batch(conn, sql, params);
134         } catch (Exception e) {
135             e.printStackTrace();
136         }
137         finally{
138             JDBCUtils.release(conn);
139         }
140     }
141
142 }

最后完成对以上剩余DAO层的实现,BookDaoImpl、AccountDaoImpl、TradeDaoImpl、TradeItemDaoImpl、UserDaoImpl。

明天继续,over。

转载于:https://www.cnblogs.com/daoxiaobai/p/6347136.html

JavaWeb:网上书店的案例相关推荐

  1. javaweb网上书店图书馆管理系统

    最近博主参与了一个项目,是设计一个网上书店.在项目完成后,收获了许多,在这里分享一下开发过程: 首先是建立数据库: 接下来是创建项目结构,采用MVC开发模式: 实现效果如图所示: 项目更新 博主新开发 ...

  2. javaweb网上书店项目设计_计算机毕业设计能不能用成品?

    大家好,今天我们的话题是计算机毕业设计能不能使用成品.这也是很多学生会问到的一个问题.今天我们就来详细解答一下. 对于这个问题,答案当然是能. 但是有一定前提条件,我们首先列出这些条件: 第一,对成品 ...

  3. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...

    原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证 ...

  4. 项目案例:网上书店数据库设计

    项目案例:网上书店数据库设计 CREATE TABLE `category` (`cateid` int(20) NOT NULL AUTO_INCREMENT,`catename` varchar( ...

  5. javaweb课程设计网上书店

    网上书店系统是一个基于Internet,采用B2C(Business to Consumers)模式,并根据现有的网上书店系统的现状而设计开发的电子商务平台.本文以JSP为开发技术,实现了一个虚拟的网 ...

  6. 基于JavaWeb的网上书店的设计与实现

    基于JavaWeb的网上书店的设计与实现 摘 要 设计说明 项目显示文件目录展示 摘 要 本设计作品基于JavaWeb技术开发的网上图书购物系统,为该系统使用用户购书提供多了一种选购方式.同时该网上书 ...

  7. javaweb JAVA JSP图书销售系统JSP网上书店商城JSP购物系统JSP网上书店JSP图书在线销售系统JSP图书商城jsp二手图书销售系

    JSP图书销售系统JSP网上书店商城JSP购物系统JSP网上书店JSP图书在线销售系统JSP图书商城jsp图书销售系 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查 ...

  8. javaweb JAVA JSP书店销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上书店在线销售

    JSP书店销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上书店在线销售 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁 ...

  9. 基于javaweb+JSP+Servlet网上书店图书商城(前台、后台)

    基于javaweb+JSP+Servlet网上书店图书商城(前台.后台) 开发工具:eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习 ...

最新文章

  1. pycharms怎么看文件被什么引用_误删文件咋办?看我怎么起死回生……
  2. 别人以为搞AI的高大上,我却觉得自己是个骗子
  3. HDFS文件详情查看案例
  4. 关于stm32芯片解锁方法
  5. python 3.5 3.6 3.7_选择 Python3.6 还是 Python 3.7
  6. C++实践参考——数组类运算的实现
  7. python学习之数据类型(int,bool,str)
  8. 接口监控_java应用监控之利用cat接口性能优化,每一次都是血的教训
  9. (转)使用JMeter进行Web压力测试
  10. mysql5.5java安装_配置非安装版的mysql 5.5
  11. C++ 取得系统当前时间
  12. java序列化,看这篇就够了
  13. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第2节 反射_9_反射_Class对象功能_获取Constructor...
  14. 运维工程师故障排查思路(备忘)
  15. WPS 手动去除广告
  16. Olly Script Editor V2.0
  17. android mvp设计思想,android MVP 设计模式
  18. 水果店的货源来自哪里,怎样做水果店找货源
  19. 【数据结构与算法】初识二叉树(中)
  20. 2017中国呼叫中心及企业通信大会在京成功召开

热门文章

  1. Peer.js Based Video Share Among Connected Peers (基于Peer.js实现的对等端间视频共享)
  2. python做泰勒展开_python中的泰勒展开-问答-阿里云开发者社区-阿里云
  3. 冀欧速长杆式噪声传感器高规格OSA-36B
  4. 如何打造好社群经济模式
  5. python进阶版《植物大战僵尸》
  6. QT:检测U盘插入和拔出(windows)
  7. html摄像头app,HTML5 Camera(摄像头) 和 Video(视频)控制
  8. 最优控制电池储能模型 蓄电池储能模型的最优控制python源代码 包含五个python脚本,它从data .csv读取价格、负载和温度数据。 然后用本文中描述的决策变量、目标和约束构造一个pyomo抽
  9. Q1营收超预期,耐克离两千亿市值还差“临门一脚”?
  10. 南大通用GBase8s 常用SQL语句(257)