diff --git a/sql/bookstore.sql b/sql/bookstore.sql index 4baa7bf..62c6171 100644 --- a/sql/bookstore.sql +++ b/sql/bookstore.sql @@ -20,62 +20,87 @@ INSERT INTO t_user(username,`password`,email,address) VALUES('admin','admin','ad ## 查询表 SELECT * FROM t_user; +-- 创建名为t_book的表 CREATE TABLE t_book( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `name` VARCHAR(100), - `price` DECIMAL(11,2), - `author` VARCHAR(100), - `classification` VARCHAR(20), - `sales` INT, - `stock` INT, - `imgpath` VARCHAR(200) + -- 定义名为id的字段,数据类型为INT(整数类型),将其设置为主键,并且设置为自增(AUTO_INCREMENT),这样每插入一条新记录时,该字段的值会自动按顺序递增,用于为每本图书生成唯一的标识符 + `id` INT PRIMARY KEY AUTO_INCREMENT, + -- 定义名为name的字段,数据类型为VARCHAR(可变长度字符串),长度为100,用于存储图书的书名信息 + `name` VARCHAR(100), + -- 定义名为price的字段,数据类型为DECIMAL(精确数值类型),总长度为11位,其中小数部分占2位,用于存储图书的价格信息 + `price` DECIMAL(11,2), + -- 定义名为author的字段,数据类型为VARCHAR,长度为100,用来记录图书的作者姓名 + `author` VARCHAR(100), + -- 定义名为classification的字段,数据类型为VARCHAR,长度为20,可用于存储图书的分类信息,例如文学、科技等类别 + `classification` VARCHAR(20), + -- 定义名为sales的字段,数据类型为INT,用于记录图书的销量情况 + `sales` INT, + -- 定义名为stock的字段,数据类型为INT,用于表示图书的库存数量 + `stock` INT, + -- 定义名为imgpath的字段,数据类型为VARCHAR,长度为200,可用于存储图书封面图片的路径信息,方便在应用中展示图书封面图片 + `imgpath` VARCHAR(200) ); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('解忧杂货店','东野圭吾','文学',27.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('边城','沈从文','文学',23.00,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('中国哲学史','冯友兰','文学',44.5,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('苏东坡传','林语堂','文学',19.30,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('百年孤独','马尔克斯','文学',29.50,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('扶桑','严歌苓','文学',19.8,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('给孩子的诗','北岛','文学',22.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('为奴十二年','所罗门','文学',16.5,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('平凡的世界','路遥','文学',55.00,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('悟空传','今何在','文学',14.00,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('硬派健身','斌卡','文学',31.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('从晚清到民国','唐德刚','文学',39.90,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('三体','刘慈欣','文学',56.5,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('看见','柴静','文学',19.50,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('活着','余华','文学',11.00,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('小王子','安托万','文学',19.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('我们仨','杨绛','文学',11.30,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification,price, sales , stock , imgpath) VALUES('生命不息,折腾不止','罗永浩','文学',25.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification,price, sales , stock , imgpath) VALUES('皮囊','蔡崇达','文学',23.90,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('恰到好处的幸福','毕淑敏','文学',16.40,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('大数据预测','埃里克','文学',37.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('人月神话','布鲁克斯','文学',55.90,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('C语言入门经典','霍尔顿','文学',45.00,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('数学之美','吴军','文学',29.90,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('Java编程思想','埃史尔','文学',70.50,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('设计模式之禅','秦小波','文学',20.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('图解机器学习','杉山将','文学',33.80,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('艾伦图灵传','安德鲁','文学',47.20,100,100,'static/img/default.jpg'); -INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('教父','马里奥普佐','文学',29.00,100,100,'static/img/default.jpg'); - +-- 向t_book表中插入一条图书数据记录,指定要插入值的字段为(name, author, classification, price, sales, stock, imgpath),并对应给出具体的值,分别为图书的书名、作者、分类、价格、销量、库存以及封面图片路径 +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('解忧杂货店','东野圭吾','文学',27.20,100,100,'static/img/default.jpg'); +-- 同样是向t_book表中插入图书数据记录,以下每条INSERT语句的结构和作用与上面类似,只是对应不同的图书信息 +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('边城','沈从文','文学',23.00,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('中国哲学史','冯友兰','文学',44.5,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('苏东坡传','林语堂','文学',19.30,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('百年孤独','马尔克斯','文学',29.50,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('扶桑','严歌苓','文学',19.8,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('给孩子的诗','北岛','文学',22.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('为奴十二年','所罗门','文学',16.5,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('平凡的世界','路遥','文学',55.00,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('悟空传','今何在','文学',14.00,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('硬派健身','斌卡','文学',31.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('从晚清到民国','唐德刚','文学',39.90,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('三体','刘慈欣','文学',56.5,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('看见','柴静','文学',19.50,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('活着','余华','文学',11.00,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('小王子','安托万','文学',19.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('我们仨','杨绛','文学',11.30,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification,price, sales, stock, imgpath) VALUES('生命不息,折腾不止','罗永浩','文学',25.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification,price, sales, stock, imgpath) VALUES('皮囊','蔡崇达','文学',23.90,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('恰到好处的幸福','毕淑敏','文学',16.40,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('大数据预测','埃里克','文学',37.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('人月神话','布鲁克斯','文学',55.90,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('C语言入门经典','霍尔顿','文学',45.00,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('数学之美','吴军','文学',29.90,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('Java编程思想','埃史尔','文学',70.50,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('设计模式之禅','秦小波','文学',20.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('图解机器学习','杉山将','文学',33.80,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('艾伦图灵传','安德鲁','文学',47.20,100,100,'static/img/default.jpg'); +INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('教父','马里奥普佐','文学',29.00,100,100,'static/img/default.jpg'); +-- 创建名为t_order的表 CREATE TABLE t_order( - `order_id` VARCHAR(50) PRIMARY KEY, - `create_time` DATETIME, - `price` DECIMAL(11,2), - `status` INT, - `user_id` INT, - FOREIGN KEY(`user_id`) REFERENCES t_user(`id`) + -- 定义名为order_id的字段,数据类型为VARCHAR(可变长度字符串),长度为50,并且将该字段设置为主键,用于唯一标识每条订单记录 + `order_id` VARCHAR(50) PRIMARY KEY, + -- 定义名为create_time的字段,数据类型为DATETIME(用于存储日期和时间信息),用来记录订单创建的时间 + `create_time` DATETIME, + -- 定义名为price的字段,数据类型为DECIMAL(精确数值类型),总长度为11位,其中小数部分占2位,用于存储订单的价格信息 + `price` DECIMAL(11,2), + -- 定义名为status的字段,数据类型为INT(整数类型),可能用于表示订单的状态,比如不同的数值对应不同的订单处理阶段等情况 + `status` INT, + -- 定义名为user_id的字段,数据类型为INT,该字段将作为外键,与另一个表(t_user)中的id字段建立关联关系 + `user_id` INT, + -- 使用FOREIGN KEY关键字为user_id字段添加外键约束,指定它参照t_user表中的id字段,意味着t_order表中的user_id值必须在t_user表的id字段值中存在,以此建立起两张表之间的关联,通常表示订单所属的用户 + FOREIGN KEY(`user_id`) REFERENCES t_user(`id`) ); +-- 创建名为t_order_item的表 CREATE TABLE t_order_item( - `id` INT PRIMARY KEY AUTO_INCREMENT, - `name` VARCHAR(100), - `count` INT, - `price` DECIMAL(11,2), - `total_price` DECIMAL(11,2), - `order_id` VARCHAR(50), - FOREIGN KEY(`order_id`) REFERENCES t_order(`order_id`) + -- 定义名为id的字段,数据类型为INT(整数类型),并将该字段设置为主键,同时设置为自增(AUTO_INCREMENT),这样每当插入一条新记录时,该字段的值会自动按顺序递增,常用于为每条记录生成唯一的标识符 + `id` INT PRIMARY KEY AUTO_INCREMENT, + -- 定义名为name的字段,数据类型为VARCHAR,长度为100,可用于存储商品名称等相关信息,比如订单中具体商品的名字 + `name` VARCHAR(100), + -- 定义名为count的字段,数据类型为INT,用于记录商品的数量,比如某个商品在该订单中的购买数量 + `count` INT, + -- 定义名为price的字段,数据类型为DECIMAL,总长度11位,小数部分占2位,可能用于存储单个商品的价格信息 + `price` DECIMAL(11,2), + -- 定义名为total_price的字段,数据类型为DECIMAL,总长度11位,小数部分占2位,用于存储该商品的总价(可能是通过商品单价乘以数量计算得出) + `total_price` DECIMAL(11,2), + -- 定义名为order_id的字段,数据类型为VARCHAR,长度为50,该字段将作为外键,与t_order表中的order_id字段建立关联关系 + `order_id` VARCHAR(50), + -- 使用FOREIGN KEY关键字为order_id字段添加外键约束,指定它参照t_order表中的order_id字段,意味着t_order_item表中的order_id值必须在t_order表的order_id字段值中存在,以此建立起两张表之间的关联,表明该订单项所属的订单 + FOREIGN KEY(`order_id`) REFERENCES t_order(`order_id`) ); diff --git a/src/com/yj/bean/Book.java b/src/com/yj/bean/Book.java index 30432c7..3f6e5c6 100644 --- a/src/com/yj/bean/Book.java +++ b/src/com/yj/bean/Book.java @@ -5,88 +5,176 @@ import java.math.BigDecimal; /** * @author yj * @create 2020-10-02 19:51 + * + * Book类表示一本书的信息,包含了书籍的基本属性,如ID、书名、作者、价格、销量、库存、分类和图片路径等。 */ public class Book { - private Integer id;//id - private String name;//姓名 - private String author;//作者 + + // 书籍的唯一标识符 + private Integer id; + + // 书籍的名称 + private String name; + + // 书籍的作者 + private String author; + + // 书籍的价格,使用BigDecimal类型以确保精度 private BigDecimal price; + + // 书籍的销量 private Integer sales; + + // 书籍的库存数量 private Integer stock; + + // 书籍的分类 private String classification; - private String imgPath="static/img/default.jpg"; + // 书籍的图片路径,默认值为"static/img/default.jpg" + private String imgPath = "static/img/default.jpg"; + + /** + * 获取书籍的分类 + * @return 书籍的分类 + */ public String getClassification() { return classification; } + /** + * 设置书籍的分类 + * @param classification 书籍的分类 + */ public void setClassification(String classification) { this.classification = classification; } - - + /** + * 获取书籍的ID + * @return 书籍的ID + */ public Integer getId() { return id; } + /** + * 设置书籍的ID + * @param id 书籍的ID + */ public void setId(Integer id) { this.id = id; } + /** + * 获取书籍的名称 + * @return 书籍的名称 + */ public String getName() { return name; } + /** + * 设置书籍的名称 + * @param name 书籍的名称 + */ public void setName(String name) { this.name = name; } + /** + * 获取书籍的作者 + * @return 书籍的作者 + */ public String getAuthor() { return author; } + /** + * 设置书籍的作者 + * @param author 书籍的作者 + */ public void setAuthor(String author) { this.author = author; } + /** + * 获取书籍的价格 + * @return 书籍的价格 + */ public BigDecimal getPrice() { return price; } + /** + * 设置书籍的价格 + * @param price 书籍的价格 + */ public void setPrice(BigDecimal price) { this.price = price; } + /** + * 获取书籍的销量 + * @return 书籍的销量 + */ public Integer getSales() { return sales; } + /** + * 设置书籍的销量 + * @param sales 书籍的销量 + */ public void setSales(Integer sales) { this.sales = sales; } + /** + * 获取书籍的库存数量 + * 如果库存数量小于0,则返回0 + * @return 书籍的库存数量 + */ public Integer getStock() { - if(stock<0) stock=0;return stock; + if (stock < 0) stock = 0; + return stock; } + /** + * 设置书籍的库存数量 + * 如果库存数量小于0,则将其设置为0 + * @param stock 书籍的库存数量 + */ public void setStock(Integer stock) { - if(stock<0) stock=0; + if (stock < 0) stock = 0; this.stock = stock; } + /** + * 获取书籍的图片路径 + * @return 书籍的图片路径 + */ public String getImgPath() { return imgPath; } + /** + * 设置书籍的图片路径 + * 如果传入的图片路径为null或空字符串,则使用默认图片路径"static/img/default.jpg" + * @param imgPath 书籍的图片路径 + */ public void setImgPath(String imgPath) { - if(imgPath==null||"".equals(imgPath)) { + if (imgPath == null || "".equals(imgPath)) { this.imgPath = "static/img/default.jpg"; } else { this.imgPath = imgPath; } } + /** + * 重写toString方法,返回书籍的详细信息 + * @return 书籍的详细信息字符串 + */ @Override public String toString() { return "Book{" + @@ -101,9 +189,23 @@ public class Book { '}'; } + /** + * 无参构造方法 + */ public Book() { } + /** + * 全参构造方法 + * @param id 书籍的ID + * @param name 书籍的名称 + * @param author 书籍的作者 + * @param price 书籍的价格 + * @param sales 书籍的销量 + * @param stock 书籍的库存数量 + * @param classification 书籍的分类 + * @param imgPath 书籍的图片路径 + */ public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String classification, String imgPath) { this.id = id; this.name = name; @@ -114,4 +216,4 @@ public class Book { this.classification = classification; this.imgPath = imgPath; } -} +} \ No newline at end of file diff --git a/src/com/yj/dao/BookDao.java b/src/com/yj/dao/BookDao.java index 48740be..65ba631 100644 --- a/src/com/yj/dao/BookDao.java +++ b/src/com/yj/dao/BookDao.java @@ -8,34 +8,108 @@ import java.util.List; /** * @author yj * @create 2020-08-23 21:08 + * + * BookDao接口定义了对书籍数据的操作方法,包括增删改查、分页查询、按价格范围查询、按名称或作者查询等功能。 */ public interface BookDao { + /** + * 添加一本书籍到数据库 + * @param book 要添加的书籍对象 + * @return 受影响的行数,成功返回1,失败返回0 + */ public int addBook(Book book); + /** + * 根据书籍ID删除书籍 + * @param id 要删除的书籍ID + * @return 受影响的行数,成功返回1,失败返回0 + */ public int deleteBookById(Integer id); + /** + * 更新书籍信息 + * @param book 包含更新信息的书籍对象 + * @return 受影响的行数,成功返回1,失败返回0 + */ public int updateBook(Book book); + /** + * 根据书籍ID查询书籍信息 + * @param id 要查询的书籍ID + * @return 查询到的书籍对象,如果未找到返回null + */ public Book queryBookById(Integer id); + /** + * 查询所有书籍信息 + * @return 包含所有书籍的列表 + */ public List queryBooks(); + /** + * 查询所有书籍的总记录数 + * @return 所有书籍的总记录数 + */ Integer queryForPageTotalCount(); + /** + * 分页查询书籍信息 + * @param begin 分页的起始索引 + * @param pageSize 每页显示的记录数 + * @return 当前页的书籍列表 + */ List queryForPageItems(int begin, int pageSize); + /** + * 根据价格范围查询书籍的总记录数 + * @param min 价格范围的最小值 + * @param max 价格范围的最大值 + * @return 符合价格范围的书籍总记录数 + */ Integer queryForPageTotalCountByPrice(int min, int max); + /** + * 根据价格范围分页查询书籍信息 + * @param begin 分页的起始索引 + * @param pageSize 每页显示的记录数 + * @param min 价格范围的最小值 + * @param max 价格范围的最大值 + * @return 当前页的书籍列表 + */ List queryForPageItemsByPrice(int begin, int pageSize, int min, int max); + /** + * 根据书籍名称或作者查询书籍的总记录数 + * @param nameorauthor 书籍名称或作者的关键字 + * @return 符合条件的书籍总记录数 + */ Integer queryForPageTotalCountByNameOrAuthor(String nameorauthor); + /** + * 根据书籍名称或作者分页查询书籍信息 + * @param begin 分页的起始索引 + * @param pageSize 每页显示的记录数 + * @param nameorauthor 书籍名称或作者的关键字 + * @return 当前页的书籍列表 + */ List queryForPageItemsByNameOrAuthor(int begin, int pageSize, String nameorauthor); + /** + * 查询所有书籍并按某种顺序排序(如销量、价格等) + * @return 按顺序排序的书籍列表 + */ List queryForPageItemsOrder(); + /** + * 查询所有书籍的总金额(价格总和) + * @return 所有书籍的总金额 + */ BigDecimal queryTotalMoney(); + /** + * 查询书籍的总数量 + * @return 书籍的总数量 + */ public Integer queryBooknums(); -} +} \ No newline at end of file diff --git a/src/com/yj/service/BookService.java b/src/com/yj/service/BookService.java index 94a4b80..3916727 100644 --- a/src/com/yj/service/BookService.java +++ b/src/com/yj/service/BookService.java @@ -9,28 +9,84 @@ import java.util.List; /** * @author yj * @create 2020-08-24 14:40 + * + * BookService接口定义了与书籍相关的业务逻辑操作,包括书籍的增删改查、分页查询、按价格范围查询、按名称或作者查询等功能。 */ public interface BookService { + /** + * 添加一本书籍 + * @param book 要添加的书籍对象 + */ public void addBook(Book book); + /** + * 更新书籍信息 + * @param book 包含更新信息的书籍对象 + */ public void updateBook(Book book); + /** + * 根据书籍ID删除书籍 + * @param id 要删除的书籍ID + */ public void deleteBookById(Integer id); + /** + * 根据书籍ID查询书籍信息 + * @param id 要查询的书籍ID + * @return 查询到的书籍对象,如果未找到返回null + */ public Book queryBookById(Integer id); + /** + * 查询所有书籍信息 + * @return 包含所有书籍的列表 + */ public List queryBooks(); + /** + * 分页查询书籍信息 + * @param pageNo 当前页码 + * @param pageSize 每页显示的记录数 + * @return 分页对象,包含当前页的书籍列表和分页信息 + */ Page page(int pageNo, int pageSize); + /** + * 根据价格范围分页查询书籍信息 + * @param pageNo 当前页码 + * @param pageSize 每页显示的记录数 + * @param min 价格范围的最小值 + * @param max 价格范围的最大值 + * @return 分页对象,包含当前页的书籍列表和分页信息 + */ Page pageByPrice(int pageNo, int pageSize, int min, int max); + /** + * 根据书籍名称或作者分页查询书籍信息 + * @param pageNo 当前页码 + * @param pageSize 每页显示的记录数 + * @param nameOrAuthor 书籍名称或作者的关键字 + * @return 分页对象,包含当前页的书籍列表和分页信息 + */ Page pageByNameOrAuthor(int pageNo, int pageSize, String nameOrAuthor); + /** + * 查询所有书籍并按某种顺序排序(如销量、价格等) + * @return 分页对象,包含按顺序排序的书籍列表和分页信息 + */ Page pageOrder(); + /** + * 查询书籍的总数量 + * @return 书籍的总数量 + */ public Integer queryTotalBooks(); + /** + * 查询所有书籍的总金额(价格总和) + * @return 所有书籍的总金额 + */ BigDecimal queryTotalMoney(); -} +} \ No newline at end of file diff --git a/src/com/yj/test/BookDaoTest.java b/src/com/yj/test/BookDaoTest.java index 19ca13d..dd64eda 100644 --- a/src/com/yj/test/BookDaoTest.java +++ b/src/com/yj/test/BookDaoTest.java @@ -10,59 +10,102 @@ import java.math.BigDecimal; /** * @author yj * @create 2020-08-24 11:01 + * + * BookDaoTest类用于测试BookDao接口的实现类BookDaoImpl中的各个方法。 + * 通过JUnit测试框架,验证数据库操作的正确性。 */ public class BookDaoTest { + + // 创建BookDao接口的实现类BookDaoImpl对象 BookDao bookDao = new BookDaoImpl(); + /** + * 测试添加书籍的方法 + */ @Test public void addBook() { - //`name`,`author`,`classification`,`price`,`sales`,`stock`,`img_path` - //Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String classification, String imgPath) - bookDao.addBook(new Book(null,"舌的中国","yjjj",new BigDecimal("5"),100,23,"","")); + // 创建一个新的Book对象,并调用addBook方法将其添加到数据库中 + bookDao.addBook(new Book(null, "舌的中国", "yjjj", new BigDecimal("5"), 100, 23, "", "")); } + /** + * 测试删除书籍的方法 + */ @Test public void deleteBook() { + // 调用deleteBookById方法,删除ID为3的书籍 bookDao.deleteBookById(3); } + /** + * 测试根据ID查询书籍的方法 + */ @Test public void queryById() { + // 调用queryBookById方法,查询ID为64的书籍,并打印结果 System.out.println(bookDao.queryBookById(64)); } + /** + * 测试更新书籍信息的方法 + */ @Test public void update() { - bookDao.updateBook(new Book(35,"舌尖的中国","yj",new BigDecimal("5"),100,23,"文学","")); + // 创建一个新的Book对象,并调用updateBook方法更新ID为35的书籍信息 + bookDao.updateBook(new Book(35, "舌尖的中国", "yj", new BigDecimal("5"), 100, 23, "文学", "")); } + /** + * 测试查询所有书籍的方法 + */ @Test public void queryList() { + // 调用queryBooks方法,查询所有书籍,并打印结果 System.out.println(bookDao.queryBooks()); } + /** + * 测试查询书籍总记录数的方法 + */ @Test public void queryForPageTotalCount() { + // 调用queryForPageTotalCount方法,查询所有书籍的总记录数,并打印结果 System.out.println(bookDao.queryForPageTotalCount()); } + /** + * 测试分页查询书籍的方法 + */ @Test public void queryForPageItems() { - System.out.println(bookDao.queryForPageItems(1,4)); + // 调用queryForPageItems方法,分页查询书籍,并打印结果 + System.out.println(bookDao.queryForPageItems(1, 4)); } + /** + * 测试根据价格范围查询书籍总记录数的方法 + */ @Test public void queryForPageTotalCountByPrice() { - System.out.println(bookDao.queryForPageTotalCountByPrice(10,50)); + // 调用queryForPageTotalCountByPrice方法,查询价格在10到50之间的书籍总记录数,并打印结果 + System.out.println(bookDao.queryForPageTotalCountByPrice(10, 50)); } + /** + * 测试根据价格范围分页查询书籍的方法 + */ @Test public void queryForPageItemsByPrice() { - System.out.println(bookDao.queryForPageItemsByPrice(1,4,10,50)); + // 调用queryForPageItemsByPrice方法,根据价格范围分页查询书籍,并打印结果 + System.out.println(bookDao.queryForPageItemsByPrice(1, 4, 10, 50)); } + /** + * 测试查询书籍总数量的方法 + */ @Test public void queryBooknums() { + // 调用queryBooknums方法,查询书籍的总数量,并打印结果 System.out.println(bookDao.queryBooknums()); } -} +} \ No newline at end of file diff --git a/src/com/yj/test/BookServiceTest.java b/src/com/yj/test/BookServiceTest.java index f2358b1..8ffc3ee 100644 --- a/src/com/yj/test/BookServiceTest.java +++ b/src/com/yj/test/BookServiceTest.java @@ -12,43 +12,78 @@ import java.math.BigDecimal; /** * @author yj * @create 2020-08-24 14:57 + * + * BookServiceTest类用于测试BookService接口的实现类BookServiceImpl中的各个方法。 + * 通过JUnit测试框架,验证业务逻辑的正确性。 */ public class BookServiceTest { + // 创建BookDao接口的实现类BookDaoImpl对象 private BookDao bookDao = new BookDaoImpl(); + + // 创建BookService接口的实现类BookServiceImpl对象 private BookService bookService = new BookServiceImpl(); + + /** + * 测试添加书籍的方法 + */ @Test public void addBook() { - bookDao.addBook(new Book(null,"舌尖上的中国","yj",new BigDecimal("5"),100,23,"文学","")); + // 创建一个新的Book对象,并调用addBook方法将其添加到数据库中 + bookDao.addBook(new Book(null, "舌尖上的中国", "yj", new BigDecimal("5"), 100, 23, "文学", "")); } + /** + * 测试更新书籍信息的方法 + */ @Test public void updateBook() { - bookDao.updateBook(new Book(null,"舌尖上的中国","yj",new BigDecimal("5"),100,23,"文学","")); + // 创建一个新的Book对象,并调用updateBook方法更新书籍信息 + bookDao.updateBook(new Book(null, "舌尖上的中国", "yj", new BigDecimal("5"), 100, 23, "文学", "")); } + /** + * 测试根据ID删除书籍的方法 + */ @Test public void deleteBookById() { + // 调用deleteBookById方法,删除ID为25的书籍,并打印受影响的行数 System.out.println(bookDao.deleteBookById(25)); } + /** + * 测试根据ID查询书籍的方法 + */ @Test public void queryBookById() { + // 调用queryBookById方法,查询ID为23的书籍,并打印结果 System.out.println(bookDao.queryBookById(23)); } + /** + * 测试查询所有书籍的方法 + */ @Test public void queryBooks() { + // 调用queryBooks方法,查询所有书籍,并打印结果 System.out.println(bookDao.queryBooks()); } + /** + * 测试分页查询书籍总记录数的方法 + */ @Test public void page() { + // 调用queryForPageTotalCount方法,查询所有书籍的总记录数,并打印结果 System.out.println(bookDao.queryForPageTotalCount()); } + /** + * 测试查询所有书籍的总金额的方法 + */ @Test public void queryTotalMoney() { + // 调用queryTotalMoney方法,查询所有书籍的总金额,并打印结果 System.out.println(bookDao.queryTotalMoney()); } } \ No newline at end of file diff --git a/src/com/yj/web/BaseServlet.java b/src/com/yj/web/BaseServlet.java index 39a2021..1c5e289 100644 --- a/src/com/yj/web/BaseServlet.java +++ b/src/com/yj/web/BaseServlet.java @@ -10,26 +10,54 @@ import java.lang.reflect.Method; /** * @author yj * @create 2020-08-23 16:51 + * + * BaseServlet类是一个抽象的Servlet基类,用于简化Servlet的开发。 + * 它通过反射机制动态调用子类中的方法,避免了在每个Servlet中重复编写doGet和doPost方法。 */ public abstract class BaseServlet extends HttpServlet { + /** + * 处理GET请求,直接调用doPost方法 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - doPost(req,resp); + doPost(req, resp); } + /** + * 处理POST请求,通过反射机制动态调用子类中的方法 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - //解决post请求中文乱码 + // 解决POST请求中文乱码问题 req.setCharacterEncoding("utf-8"); - //解决相应的中文乱码 + + // 解决响应的中文乱码问题 resp.setContentType("text/html;charset=UTF-8"); + + // 获取请求参数action,该参数用于指定要调用的方法名 String action = req.getParameter("action"); + try { - Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,HttpServletResponse.class); - method.invoke(this,req,resp); + // 通过反射获取当前类中指定名称的方法 + Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); + + // 调用方法,传入请求和响应对象 + method.invoke(this, req, resp); } catch (Exception e) { + // 捕获异常并打印堆栈信息 e.printStackTrace(); + + // 将异常包装为运行时异常抛出,便于上层处理 throw new RuntimeException(e); } } -} +} \ No newline at end of file diff --git a/src/com/yj/web/BookServlet.java b/src/com/yj/web/BookServlet.java index 0688f86..b498d62 100644 --- a/src/com/yj/web/BookServlet.java +++ b/src/com/yj/web/BookServlet.java @@ -15,72 +15,137 @@ import java.util.List; /** * @author yj * @create 2020-08-24 15:25 + * + * BookServlet类继承自BaseServlet,用于处理与书籍相关的请求。 + * 通过调用BookService接口的实现类BookServiceImpl,完成书籍的增删改查、分页查询等操作。 */ public class BookServlet extends BaseServlet { + // 创建BookService接口的实现类BookServiceImpl对象 private BookService bookService = new BookServiceImpl(); + /** + * 处理添加书籍的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),0); - pageNo+=1; - Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(),new Book()); + // 获取当前页码,默认从0开始 + int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 0); + // 页码加1,表示添加书籍后跳转到下一页 + pageNo += 1; + + // 将请求参数封装到Book对象中 + Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(), new Book()); + + // 调用BookService的addBook方法添加书籍 bookService.addBook(book); - //req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp); - resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+pageNo); - } + // 重定向到书籍管理页面,并跳转到添加书籍后的页码 + resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + pageNo); + } + /** + * 处理删除书籍的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String id = req.getParameter("id"); - int i = Integer.parseInt(id); - bookService.deleteBookById(i); - resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo")); - } + // 获取要删除的书籍ID + String id = req.getParameter("id"); + int i = Integer.parseInt(id); + // 调用BookService的deleteBookById方法删除书籍 + bookService.deleteBookById(i); + // 重定向到书籍管理页面,并保持当前页码 + resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + req.getParameter("pageNo")); + } + + /** + * 处理更新书籍的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(),new Book()); + // 将请求参数封装到Book对象中 + Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(), new Book()); + + // 调用BookService的updateBook方法更新书籍 bookService.updateBook(book); - resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo")); + + // 重定向到书籍管理页面,并保持当前页码 + resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + req.getParameter("pageNo")); } /** - * - * @param req - * @param resp + * 处理获取单个书籍信息的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 * @throws ServletException * @throws IOException */ protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // 获取要查询的书籍ID String id = req.getParameter("id"); int i = Integer.parseInt(id); + + // 调用BookService的queryBookById方法查询书籍 Book book = bookService.queryBookById(i); - req.setAttribute("book",book); - req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp); - } + // 将查询到的书籍信息保存到request域中 + req.setAttribute("book", book); + // 请求转发到书籍编辑页面 + req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req, resp); + } + + /** + * 处理查询所有书籍的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - //1、通过BookService查询数据 - Listbooks = bookService.queryBooks(); - //2、将数据保存在request域中 - req.setAttribute("books",books); - //3、请求转发到pages/manager/book_manager.jsp - req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp); + // 调用BookService的queryBooks方法查询所有书籍 + List books = bookService.queryBooks(); + + // 将查询到的书籍列表保存到request域中 + req.setAttribute("books", books); + + // 请求转发到书籍管理页面 + req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp); } + /** + * 处理分页查询书籍的请求 + * @param req HttpServletRequest对象 + * @param resp HttpServletResponse对象 + * @throws ServletException + * @throws IOException + */ protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - //1、获取请求的参数pageNo和pageSize - int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),1); + // 获取请求参数pageNo和pageSize + int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 1); int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE); - //2、调用BookService.page(pageNo,pageSize)方法:返回page对象 - Page page = bookService.page(pageNo,pageSize); + // 调用BookService的page方法进行分页查询 + Page page = bookService.page(pageNo, pageSize); + + // 设置分页请求的URL page.setUrl("manager/bookServlet?action=page"); - //3、保存Page对象到request域中 - req.setAttribute("page",page); - //4、请求转发到page/manager/book_manager.jsp页面 - req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp); + // 将分页对象保存到request域中 + req.setAttribute("page", page); + + // 请求转发到书籍管理页面 + req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp); } -} +} \ No newline at end of file diff --git a/web/pages/client/index.jsp b/web/pages/client/index.jsp index 7ecae77..077ce4e 100644 --- a/web/pages/client/index.jsp +++ b/web/pages/client/index.jsp @@ -1,11 +1,6 @@ <%-- - Created by IntelliJ IDEA. - User: jhu - Date: 2020/10/5 - Time: 15:44 - To change this template use File | Settings | File Templates. + 此文件的创建信息注释,表明是由 IntelliJ IDEA 创建,作者是 jhu,创建日期是 2020 年 10 月 5 日,时间是 15 时 44 分,并且提示修改此模板的相关设置路径。 --%> - <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> @@ -13,21 +8,25 @@ 书城首页 + <%-- 包含公共的头部页面(header.jsp),可能包含一些通用的样式、脚本或者页面头部结构相关的内容,方便复用。 --%> <%@include file="/pages/common/header.jsp"%> @@ -35,35 +34,40 @@ Bookstore
+ - + 登录 | 注册    热榜 - + 欢迎${sessionScope.user.username}光临书城 我的订单 个人信息 注销   - + 购物车 后台管理
+
+ 图书搜索
+
+ 价格: 元 - 元 @@ -71,6 +75,7 @@
+
@@ -78,13 +83,16 @@
+ 您的购物车中有${sessionScope.cart.totalCount}件商品
+ 您刚刚将${sessionScope.lastName}加入到了购物车中
+
@@ -112,6 +120,7 @@ ${book.stock}
+
@@ -120,10 +129,12 @@
+ <%@include file="/pages/common/page_nav.jsp"%>
+ <%@include file="/pages/common/footer.jsp"%> - + \ No newline at end of file diff --git a/web/pages/client/top.jsp b/web/pages/client/top.jsp index 1c7b058..f4c1017 100644 --- a/web/pages/client/top.jsp +++ b/web/pages/client/top.jsp @@ -1,9 +1,5 @@ <%-- - Created by IntelliJ IDEA. - User: jhu - Date: 2020/10/19 - Time: 22:56 - To change this template use File | Settings | File Templates. + 此部分为文件的创建相关注释,表明该文件是通过 IntelliJ IDEA 创建的,创建者是 jhu,创建时间为 2020 年 10 月 19 日 22 时 56 分,同时说明了修改该模板的相关设置操作的路径信息。 --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> @@ -12,11 +8,10 @@ 图书热销榜单 + <%-- 包含公共的头部页面(header.jsp),这里面通常会放置页面通用的样式表引入、脚本引入或者一些页面头部布局相关的内容,以实现代码复用。 --%> <%@include file="/pages/common/header.jsp"%> - -