分析实体
1.1 实体类:图书,单词为 Book 实体的名称就定义下来了
|— 属性:
图书编号 bookId(用于确定的唯一性);
图书名称 bookName;
图书作者 author ;
图书单价 price ; 类型是 double
出版社 publish ;
图书封面 bookPic ;
库存 count 类型是 int
类目 category{ 类型: Category}
1, 定义属性变量
2,使用快捷键Alt+Insert 生成getter和setter方法
3, 使用快捷键Alt+Insert 生成toString方法,便于打印查看具体数据
4,使用快捷键Alt+Insert 生成构造方法
4.1, 有参数的构造方法
4.2, 无参数的构造方法
package cn.javabs.entity;
public class Book {
private int bookId;
private String bookName;
private String publish;// 出版社
private double price; // 为什么不用float类型,因为默认就是double 、其次 使用float类型定义, 小数后需要添加f
// 如float f1 = 6.5f
private String author;
private int count ;
private String bookPic ;
private Category category;
public Book(int bookId, String bookName, String publish, double price, String author, int count, String bookPic, Category category) {
this.bookId = bookId;
this.bookName = bookName;
this.publish = publish;
this.price = price;
this.author = author;
this.count = count;
this.bookPic = bookPic;
this.category = category;
}
public Book(String bookName, String publish, double price, String author, int count, String bookPic, Category category) {
this.bookName = bookName;
this.publish = publish;
this.price = price;
this.author = author;
this.count = count;
this.bookPic = bookPic;
this.category = category;
}
public Book() {
super();
}
@Override
public String toString() {
return "Book{" +
"bookId=" + bookId +
", bookName='" + bookName + ''' +
", publish='" + publish + ''' +
", price=" + price +
", author='" + author + ''' +
", count=" + count +
", bookPic='" + bookPic + ''' +
", category=" + category +
'}';
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getBookPic() {
return bookPic;
}
public void setBookPic(String bookPic) {
this.bookPic = bookPic;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
1.2 编写Service层
Service层有 接口和实现类
(1)先去编写接口,接口的命名规范为 [实体类的名称+ Service],本接口为BookService,实现类为BookServiceImpl
(2)考虑该接口内哪些功能,功能对应的是方法。
功能如下:
①增加图书
②删除图书
③修改图书
④查询所有图书
⑤根据类目查询图书
⑥根据图书名称查询图书详细信息
⑦根据图书编号查询图书
对应的是七个方法:
增加图书方法, 参数列表是:Book book; 返回值类型为int
删除图书方法, 参数列表是:int bookId; 返回值类型为int
修改图书方法, 参数列表是Book book; 返回值类型为int
查询所有图书方法, 无参数 返回值类型为List;
【因为查询的所有类目,不再是单一的一个类目,需要有容器存储所有类目对象,该容器合适的是集合,便于查询的是ArrayList集合。{ArrayList特性是 查询快、增删慢 | linkedList特性是 查询慢、增删快}】
根据类目查询图书, 参数列表是Category category; 返回值类型为List;
根据图书名称查询图书, 参数列表是String bookName; 返回值类型为List;
根据图书编号查询图书,参数列表是:int bookId; 返回值类型为Book;
【因为查询的是一个类目,所有就是对象存储。】
代码如下:
package cn.javabs.service;
import cn.javabs.entity.Book;
import cn.javabs.entity.Category;
import java.util.List;
public interface BookService {
int addBook(Book book);
int delBook(int bookId);
int editBook(Book book);
List findAllBooks();
List findBookByCategory(Category category);
List findBookByBookName(String bookName);
Book findBookById(int bookId);
}
BookServiceImpl实现类具体操作与上篇雷同,不再截图展示具体过程。
package cn.javabs.service.impl;
import cn.javabs.dao.BookDao;
import cn.javabs.dao.impl.BookDaoImpl;
import cn.javabs.entity.Book;
import cn.javabs.entity.Category;
import cn.javabs.service.BookService;
import java.util.List;
public class BookServiceImpl implements BookService {
BookDao bookDao = new BookDaoImpl();
@Override
public int addBook(Book book) {
return bookDao.add(book);
}
@Override
public int delBook(int bookId) {
return bookDao.del(bookId);
}
@Override
public int editBook(Book book) {
return bookDao.edit(book);
}
@Override
public List findAllBooks() {
return bookDao.getAllBooks();
}
@Override
public List findBookByCategory(Category category) {
return bookDao.getBookByCategory(category);
}
@Override
public List findBookByBookName(String bookName) {
return bookDao.getBookByBookName(bookName);
}
@Override
public Book findBookById(int bookId) {
return bookDao.getBookById(bookId);
}
}
1.2 编写Dao层
Dao层有 接口和实现类
package cn.javabs.dao;
import cn.javabs.entity.Book;
import cn.javabs.entity.Category;
import java.util.List;
public interface BookDao {
int add(Book book);
int del(int bookId);
int edit(Book book);
List getAllBooks();
List getBookByCategory(Category category);
List getBookByBookName(String bookName);
Book getBookById(int bookId);
}
package cn.javabs.dao.impl;
import cn.javabs.dao.BookDao;
import cn.javabs.entity.Book;
import cn.javabs.entity.Category;
import cn.javabs.util.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class BookDaoImpl implements BookDao {
QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());
@Override
public int add(Book book) {
try {
return qr.update("insert into book(bookName,publish,price,author,count,bookPic,categoryId)",
book.getBookName(),book.getPublish(),book.getPrice(),book.getAuthor(),book.getCount(),book.getBookPic(),book.getCategory().getCategoryId());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public int del(int bookId) {
try {
return qr.update("delete from book where bookId = ?",bookId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public int edit(Book book) {
try {
return qr.update("update book set bookName = ?,publish =?,price =? ,author =?,count = ?,bookPic = ?,categoryId =? where bookId = ? ",
book.getBookName(),
book.getPublish(),
book.getPrice(),
book.getAuthor(),
book.getCount(),
book.getBookPic(),
book.getCategory().getCategoryId(),
book.getBookId()
);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public List getAllBooks() {
try {
return qr.query("select * from book",new BeanListHandler(Book.class));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public List getBookByCategory(Category category) {
try {
return qr.query("select * from book,category where book.categoryId = category.categoryId and categoryName = ? ",
new BeanListHandler(Book.class),category.getCategoryName());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public List getBookByBookName(String bookName) {
try {
return qr.query("select * from book where bookName = ?",new BeanListHandler(Book.class),bookName);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Book getBookById(int bookId) {
try {
return qr.query("select * from book where bookId = ?",new BeanHandler(Book.class),bookId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
难点来了?
- 图书添加页面的上传功能
- 图书添加页面的类目回显功能
<%--
Created by IntelliJ IDEA.
User: Mryang
Date: 2021/10/11
Time: 14:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--不要遗忘我咯,否则c标签无法使用啦--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
添加图书
初步编写BookServlet
package cn.javabs.web.servlet;
import cn.javabs.entity.Category;
import cn.javabs.service.CategoryService;
import cn.javabs.service.impl.CategoryServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/bookServlet")
public class BookServlet extends HttpServlet {
CategoryService cs = new CategoryServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String op = request.getParameter("op");
switch (op){
case "toAddBook":
toAddBook(request,response);
break;
case "addBook" :
addBook(request, response);
break;
case "delBook" :
delBook(request, response);
break;
case "editBook" :
editBook(request, response);
break;
case "updateBook" :
updateBook(request, response);
break;
case "bookList" :
bookList(request, response);
break;
default:
System.out.println("前台传递的参数有误,请查正");
break;
}
}
// 去添加图书页面的跳转
private void toAddBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List categoryList = cs.findAllCategory();
request.setAttribute("list",categoryList);
request.getRequestDispatcher("addBook.jsp").forward(request,response);
}
private void addBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
String bookName = request.getParameter("bookName");
String publish = request.getParameter("publish");
String sprice = request.getParameter("price");// 类型不对、需转化为Double
double price = Double.parseDouble(sprice);
String author = request.getParameter("author");
String scount = request.getParameter("count");// 类型不对、需转化为int
int count = Integer.parseInt(scount);
// String bookPic = request.getParameter("bookPic");
String categoryName = request.getParameter("categoryName");
//TODO 没写完,稍后继续
}
private void delBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
private void editBook(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
}
private void updateBook(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
}
private void bookList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
}
提示页面进行‘改造’ message.jsp
<%--
Created by IntelliJ IDEA.
User: Mryang
Date: 2021/10/11
Time: 14:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${msg}
还有 秒跳转



