查询、修改、删除数据库中数据。
一. 创建数据库和表
在数据库studyproject下创建一个book表
CREATE TABLE `studyproject`.`book` (
`id` INT NOT NULL AUTO_INCREMENT,
`bookname` VARCHAR(45),
`price` DECIMAL(11,2),
`author` VARCHAR(45),
`sale` INT,
`stock` INT,
`img` VARCHAR(45),
PRIMARY KEY (`id`));
insert into book(id, bookname, author, price, sale, stock, img)
values(null , '数据结构与算法' , '严敏君' , 58.5 , 6 , 13 , 'static/img/default.jpg');
insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'Java从入门到精通' , '清华' , 78.9 , 80 , 20 , 'static/img/default.jpg');
insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'C++编程思想' , 'Bruce' , 45.5 , 14 , 95 , 'static/img/default.jpg');
insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'JavaScript高级程序设计' , '李松峰' , 98.8, 12 , 53 , 'static/img/default.jpg');
insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'python编程' , '袁国忠' , 69.8, 73 , 135 , 'static/img/default.jpg');
二. 编写book表对应的JavaBean对象
在pojo包下创建Book类
package server.pojo;
import java.math.BigDecimal;
public class Book {
private Integer id;
private String bookname;
private BigDecimal price;
private String author;
private Integer sale;
private Integer stock;
private String img = "static/img/default.jpg";
public Book() {
}
public Book(Integer id, String bookname, BigDecimal price, String author, Integer sale, Integer stock, String img) {
this.id = id;
this.bookname = bookname;
this.price = price;
this.author = author;
this.sale = sale;
this.stock = stock;
//要求给定的图书封面图片路径不能为空
if(img != null && !"".equals(img)){
this.img = img;
}
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Integer getSale() {
return sale;
}
public void setSale(Integer sale) {
this.sale = sale;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getImg() {
return img;
}
public void setImg(String img) {
if(img != null && !"".equals(img)){
this.img = img;
}
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookname='" + bookname + '\'' +
", price=" + price +
", author='" + author + '\'' +
", sale=" + sale +
", stock=" + stock +
", img='" + img + '\'' +
'}';
}
}
三. Dao —— 操作数据库
1. 在dao包下编写BookDao接口
package server.dao;
import server.pojo.Book;
import java.util.List;
public interface BookDao {
public int addBook(Book book);
public int deleteBookById(Integer id);
public int updateBook(Book book);
public Book queryBookById(Integer id);
public List<Book> queryBooks();
}
2. 在dao.impl包下编写一个BookDaoImpl类,继承BaseDao类并实现BookDao接口
package server.dao.impl;
import server.dao.BookDao;
import server.pojo.Book;
import java.util.List;
public class BookDaoImpl extends BaseDao implements BookDao {
@Override
public int addBook(Book book) {
String sql = "insert into book(bookname, price, author, sale, stock, img) values(?,?,?,?,?,?)";
return updateData(sql,book.getBookname(),book.getPrice(),book.getAuthor(),book.getSale(),book.getStock(),book.getImg());
}
@Override
public int deleteBookById(Integer id) {
String sql = "delete from book where id = ?";
return updateData(sql,id);
}
@Override
public int updateBook(Book book) {
String sql = "update book set bookname=?, price=?, author=?, sale=?, stock=?, img=? where id=?";
return updateData(sql,book.getBookname(),book.getPrice(),book.getAuthor(),book.getSale(),book.getStock(),book.getImg(),book.getId());
}
@Override
public Book queryBookById(Integer id) {
String sql = "select * from book where id = ?";
return queryOneData(Book.class, sql, id);
}
@Override
public List<Book> queryBooks() {
String sql = "select * from book";
return queryList(Book.class, sql);
}
}
四. Service层
1. 在Service包下编写BookService接口
package server.service;
import server.pojo.Book;
import java.util.List;
public interface BookService {
public void addBook(Book book);
public void deleteBookById(Integer id);
public void updateBook(Book book);
public Book queryBookById(Integer id);
public List<Book> queryBooks();
}
2. 在service.impl包下编写BookServiceImpl类来实现BookService接口。
package server.service.impl;
import server.dao.BookDao;
import server.dao.impl.BookDaoImpl;
import server.pojo.Book;
import server.service.BookService;
import java.util.List;
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
@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);
}
@Override
public List<Book> queryBooks() {
return bookDao.queryBooks();
}
}
五. Web层 —— 实现Servlet程序
实现的功能:①运行web工程,首先进入index.jsp页面,该页面具有进入登录(login.jsp)、注册(regist.jsp)、后台管理(manager.jsp)页面的功能;
②点击后台管理,进入manager.jsp页面,该页面具有进入图书管理页面(book_manager.jsp)的功能;
③点击图书管理准备进入图书管理页面时,首先调用BookServlet程序的list方法,将数据库中的所有图书信息显示在book_manager.jsp页面;
④book_manager.jsp页面会显示所有图书信息,还具有删除、添加、修改图书的功能;
⑤点击book_manager.jsp页面的删除时,会调用BookServlet程序的delete方法删除对应的图书,删除后会显示book_manager.jsp页面,发现已经没有被删除的图书信息了;
⑥点击book_manager.jsp页面的添加和修改图书操作会跳转到book_edit.jsp页面来执行,因此需要在a标签里带有一个method值来告诉book_edit.jsp的隐藏域要执行的是添加还是修改操作;
⑦当点击book_manager.jsp页面的添加操作时,跳转到book_edit.jsp页面,然后在该页面上输入信息,会调用BookServlet程序的add方法添加图书,添加完之后会显示book_manager.jsp页面,发现已经有了添加的图书信息;
⑧当点击book_manager.jsp页面的修改操作时,跳转到book_edit.jsp页面,当进入该页面时,会调用BookServlet程序的getBook()方法将要修改的图书的原始信息显示在该页面,以用于修改;然后在该页面上修改要修改的信息,会调用BookServlet程序的update方法添加图书,添加完之后会显示book_manager.jsp页面,发现已经有了修改后的图书信息;
1. 编写BookServlet程序来实现上述功能
package server.web;
import server.pojo.Book;
import server.service.BookService;
import server.service.impl.BookServiceImpl;
import server.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/manager/bookServlet")
public class BookServlet extends BaseServlet{
private BookService bookService = new BookServiceImpl();
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过BookService查询全部书
List<Book> books = bookService.queryBooks();
//把全部图书保存到Request域中
req.setAttribute("books",books);
//请求转发到/pages/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的id
String id = req.getParameter("id");
//调用BookService类的deleteBookById()方法删除对应的图书
bookService.deleteBookById(Integer.parseInt(id));
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//调用BookService类的addBook()方法保存图书
bookService.addBook(book);
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数(图书id)
String id = req.getParameter("id");
//调用BookService类的queryBookById()方法查询图书
Book book = bookService.queryBookById(Integer.parseInt(id));
//保存图书到Request作用域中
req.setAttribute("book",book);
//请求转发到/pages/manager/book_edit.jsp页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//调用BookService类的updateBook()方法修改图书信息
bookService.updateBook(book);
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
}
2. 编写前端页面
①index.jsp页面:有登录、注册、进入到后台管理页面的功能
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core_1_1" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
<% //获取当前工程的路径
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<base href="<%=basePath%>">
</head>
<body>
<%-- 如果用户还没有登录,显示登录和注册菜单--%>
<c:if test="${empty sessionScope.user}">
<a href="pages/user/login.jsp"><input type = "button" value = "登录"/></a>
<a href="pages/user/regist.jsp"><input type = "button" value = "注册"/></a>
</c:if>
<%-- 如果用户已经登录,显示欢迎用户和注销--%>
<c:if test="${not empty sessionScope.user}">
欢迎${sessionScope.user.username}
<a href="userServlet?action=logout"><input type = "button" value = "注销"/></a>
<a href="pages/manager/manager.jsp"><input type = "button" value = "后台管理"/></a>
</c:if>
</body>
</html>
②manager.jsp页面:进入到图书管理节面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div>
<h1>欢迎管理员进入后台管理系统</h1>
<a href="manager/bookServlet?action=list">图书管理</a>
<a href="index.jsp">返回首页</a>
</div>
</body>
</html>
③book_manager.jsp页面:将list方法中获取的数据库中的图书信息显示在表格中,并且具有删除功能,能够进入到book_edit.jsp页面来对图书信息进行添加和修改
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>图书管理</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div align="center">图书管理系统</div>
<table border = "1" width = "600" height = "300" cellspacing = "0" cellpadding = "10" align="center">
<tr align = "center" >
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${requestScope.books}" var="book">
<tr align = "center">
<td>${book.bookname}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sale}</td>
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a></td>
<td><a href="manager/bookServlet?action=delete&id=${book.id}" onclick="return (confirm('确定删除吗?'));">删除</a></td>
</tr>
</c:forEach>
<tr align = "right">
<td colspan="7"><a href="pages/manager/book_edit.jsp?method=add">添加图书</a></td>
</tr>
</table>
</body>
</html>
④book_edit.jsp页面:用来修改图书信息和添加新的图书
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>编辑图书</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div align="center">编辑图书</div>
<div align="center">
<form action="manager/bookServlet" method="post">
<input type="hidden" name="action" value="${param.method}">
<input type="hidden" name="id" value="${requestScope.book.id}">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input type="text" name="bookname" value="${requestScope.book.bookname}"/></td>
<td><input type="text" name="price" value="${requestScope.book.price}"/></td>
<td><input type="text" name="author" value="${requestScope.book.author}"/></td>
<td><input type="text" name="sale" value="${requestScope.book.sale}"/></td>
<td><input type="text" name="stock" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
</body>
</html>