Java书城项目第四阶段:图书模块

  • 5.2.2 思路

  • 5.2.3 代码实现

  • 5.3 添加图书功能的实现

    • 5.3.1 需求
  • 5.3.2 思路

  • 5.3.3 请求转发与重定向

  • 5.3.4 代码实现

  • 5.4 删除图书功能的实现

    • 5.4.1 需求
  • 5.4.2 思路

  • 5.4.3 代码实现

  • 5.5 修改图书功能的实现

    • 5.5.1 需求
  • 5.5.2 思路

  • 5.5.3 代码实现

  • 6 演示

1 需求

=======================================================================

这一阶段的内容是第二阶段用户登录模块的拓展,进一步学习了项目中最常用的遍历、增、删、改、查

1.1 具体需求


需要的界面如下图所示,通过点击页面上的修改、删除或者添加图书,可以实现我们功能。

在这里插入图片描述

2 数据库

========================================================================

2.1 创建图书模块所需要的数据库表


#下面就是为了创建图书模块的数据库

create table book(

id int primary key auto_increment,

name varchar(100),

price decimal(11,2),

author varchar(100),

sales int,

stock int,

img_path varchar(200)

);

插入初始化测试数据

insert into book(id , name , author , price , sales , stock , img_path)

values(null , ‘java从入门到放弃’ , ‘sharm’ , 80 , 9999 , 9 , ‘static/img/default.jpg’);

insert into book(id , name , author , price , sales , stock , img_path)

values(null , ‘数据结构与算法’ , ‘sharm’ , 78.5 , 6 , 13 , ‘static/img/default.jpg’);

insert into book(id , name , author , price , sales , stock , img_path)

values(null , ‘Java编程思想’ , ‘sharm’ , 99.5 , 47 , 36 , ‘static/img/default.jpg’);

insert into book(id , name , author , price , sales , stock , img_path)

values(null , ‘操作系统原理’ , ‘sharm’ , 133.05 , 122 , 188 , ‘static/img/default.jpg’);

insert into book(id , name , author , price , sales , stock , img_path)

values(null , ‘大话设计模式’ , ‘sharm’ , 89.15 , 20 , 10 , ‘static/img/default.jpg’);

查看表内容

select id,name,author,price,sales,stock,img_path from book;

2.2 创建表对应的JavaBean对象


pojo包下新建Book.java作为上表所对应的JavaBean对象。

import java.math.BigDecimal;

public class Book {

//1 首先是定义变量

//Integer可以为null,而int不能为null

private Integer id;

private String name;

private String author;

private BigDecimal price;

private Integer sales;

private Integer stock;

private String imgPath = “static/img/default.jpg”;

//2 接下来是无参构造函数

public Book(){

}

//3 接下来是有参构造函数

public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String imgPath) {

this.id = id;

this.name = name;

this.author = author;

this.price = price;

this.sales = sales;

this.stock = stock;

// 要求给定的图书封面图书路径不能为空

if (imgPath != null && !“”.equals(imgPath)) {

this.imgPath = imgPath;

}

}

//4 然后是getter与setter方法

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public BigDecimal getPrice() {

return price;

}

public void setPrice(BigDecimal price) {

this.price = price;

}

public Integer getSales() {

return sales;

}

public void setSales(Integer sales) {

this.sales = sales;

}

public Integer getStock() {

return stock;

}

public void setStock(Integer stock) {

this.stock = stock;

}

public String getImgPath() {

return imgPath;

}

public void setImgPath(String imgPath) {

// 要求给定的图书封面图书路径不能为空

if (imgPath != null && !“”.equals(imgPath)) {

this.imgPath = imgPath;

}

}

//5 最后是重写同toString方法

@Override

public String toString() {

return “Book{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, author='” + author + ‘’’ +

“, price=” + price +

“, sales=” + sales +

“, stock=” + stock +

“, imgPath='” + imgPath + ‘’’ +

‘}’;

}

}

3 编写Dao持久层

=============================================================================

BaseDao这一父类的基础上通过实现BookDao接口所约束的方法来进行BookDaoImp类的编写。

3.1 编写BookDao接口


import sharm.pojo.Book;

import java.util.List;

/**

  • 这个接口约束了图书管理中的遍历、增、删、改功能

*/

public interface BookDao {

public List queryBooks();

public int addBook(Book book);

public int deleteBookById(Integer id);

public int updateBook(Book book);

public Book queryBookById(Integer id);

}

3.2 编写BookDaoImp实现类


import sharm.dao.BookDao;

import sharm.pojo.Book;

import java.util.List;

public class BookDaoImp extends BaseDao implements BookDao {

@Override

public List queryBooks() {

String sql = “select id , name , author , price , sales , stock , img_path imgPath from book”;

return queryForList(Book.class, sql);

}

@Override

public int addBook(Book book) {

String sql = “insert into book(name,author,price,sales,stock,img_path) values(?,?,?,?,?,?)”;

return update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getImgPath());

}

@Override

public int deleteBookById(Integer id) {

String sql = “delete from book where id = ?”;

return update(sql, id);

}

@Override

public int updateBook(Book book) {

String sql = “update book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id = ?”;

return update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getImgPath(), book.getId());

}

@Override

public Book queryBookById(Integer id) {

String sql = “select id , name , author , price , sales , stock , img_path imgPath from book where id = ?”;

return queryForOne(Book.class, sql, id);

}

}

3.3 编写BookDaoImpTest测试类


IDEA中,在对应的接口上点击ctrl+shift+t,可以直接生成测试类。

import sharm.dao.BookDao;

import sharm.dao.impl.BookDaoImp;

import sharm.pojo.Book;

import java.math.BigDecimal;

import static org.junit.Assert.*;

public class BookDaoTest {

//多态 左边是接口,右边是实现类

private BookDao bookDao = new BookDaoImp();

@Test

public void queryBooks() {

for (Book queryBook : bookDao.queryBooks()) {

System.out.println(queryBook);

}

}

@Test

public void addBook() {

bookDao.addBook(new Book(null,“坚持”, “sharm”, new BigDecimal(13),13,0,null));

}

@Test

public void deleteBookById() {

bookDao.deleteBookById(3);

}

@Test

public void updateBook() {

bookDao.updateBook(new Book(4,“人生”, “sharm”, new BigDecimal(9999),1100000,0,null));

}

@Test

public void queryBookById() {

System.out.println( bookDao.queryBookById(4));

}

}

4 编写Service服务层

=================================================================================

4.1 编写BookService接口


import sharm.pojo.Book;

import java.util.List;

/**

  • 此时Service的业务层的具体业务刚好与Dao层相同

*/

public interface BookService {

public List queryBooks();

public void addBook(Book book);

public void deleteBookById(Integer id);

public void updateBook(Book book);

public Book queryBookById(Integer id);

}

4.2 编写BookServiceImp实现类


import sharm.dao.BookDao;

import sharm.dao.impl.BookDaoImp;

import sharm.pojo.Book;

import sharm.service.BookService;

import java.util.List;

public class BookServiceImp implements BookService {

//依旧多态

private BookDao bookdao=new BookDaoImp();

@Override

public List queryBooks() {

return bookdao.queryBooks();

}

@Override

public void addBook(Book book) {

bookdao.addBook(book);

}

@Override

public void deleteBookById(Integer id) {

bookdao.deleteBookById(id);

}

@Override

public void updateBook(Book book) {

bookdao.updateBook(book);

}

@Override

public Book queryBookById(Integer id) {

return bookdao.queryBookById(id);

}

}

4.3 编写BookServiceImpTest测试类


import sharm.pojo.Book;

import sharm.service.BookService;

import sharm.service.impl.BookServiceImpl;

import org.junit.Test;

import java.math.BigDecimal;

import static org.junit.Assert.*;

public class BookServiceTest {

private BookService bookService = new BookServiceImpl();

@Test

public void addBook() {

bookService.addBook(new Book(null,“人生”, “1125”, new BigDecimal(1000000), 100000000, 0, null));

}

@Test

public void deleteBookById() {

bookService.deleteBookById(3);

}

@Test

public void updateBook() {

bookService.updateBook(new Book(2,“生活”, “1125”, new BigDecimal(999999), 10, 111110, null));

}

@Test

public void queryBookById() {

System.out.println(bookService.queryBookById(2));

}

@Test

public void queryBooks() {

for (Book queryBook : bookService.queryBooks()) {

System.out.println(queryBook);

}

}

}

5 编写Web层

===========================================================================

5.1 MVC概念


MVC 全称为Model 模型、View 视图、Controller 控制器。MVC 最早出现在JavaEE 三层中的Web 层,它可以有效的指导Web 层的代码如何有效分离,单独工作。

  • View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作——JSP/HTML。

  • Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面(转到某个页面或者是重定向到某个页面),是一个“调度者”的角色——Servlet。

  • Model 模型:将与业务逻辑相关的数据封装为具体的JavaBean 类,其中不掺杂任何与数据处理相关的代码——JavaBean/domain/entity/pojo。

MVC 的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。在这里插入图片描述

5.2 遍历图书功能的实现


5.2.1 需求

当我们点击主页上的后台管理-图书管理时,网页上需要出现目前书城所有书的列表。

5.2.2 思路

当点击图书管理时,我们不能直接将其链接到展示列表网页的manager.jsp中,因为该jsp是没有图书信息的,图书信息在我们的后端数据库中,正确的方法应该是当点击图书管理时,将其链接到Web层的BookServlet程序中,让Web层从数据库中拿到数据,然后将数据保存到Request域中,并将其转发到展示列表网页的manager.jsp。完整步骤如下所示:

在这里插入图片描述

介绍一下实际工程中的前台与后台。

在这里插入图片描述

5.2.3 代码实现

1)在web层新建BookServlet,同时在web.xml加入前端与后台Servlet程序的映射文件

BookServlet

sharm.web.BookServlet

BookServlet

/manager/bookServlet

2)修改【图书管理】请求地址

打开common包的manager_menu.jsp文件,修改图书管理的href为:

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

在这里插入图片描述

5.2.3 代码实现

1)在web层新建BookServlet,同时在web.xml加入前端与后台Servlet程序的映射文件

BookServlet

sharm.web.BookServlet

BookServlet

/manager/bookServlet

2)修改【图书管理】请求地址

打开common包的manager_menu.jsp文件,修改图书管理的href为:

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-stcPwn0e-1714339395295)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值