书籍管理系统
来源:互联网 发布:火星哥在美国地位 知乎 编辑:程序博客网 时间:2024/05/16 14:05
书籍管理系统
项目描述
实现对数据库中的书籍进行增、删、改、查操作。其中涉及到MVC,jsp,servlet等。
项目代码
项目中是在web下开发,所使用的IDE为eclipse,Tomcat和jdk版本均为8.0
1.由于要连接数据库,所以新建工具类包即基本数据库连接类,切记导入数据库驱动连接包并放置在工程目录WebContent/WEB-INF/lib下。 温馨提示:类编写完成后可以进行本地数据库连接测试,确保数据库连接成功。
package cn.mxf.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;//数据库连接类public class BaseDao { //声明Connection连接类 private Connection conn; //创建PreparedStatement对象,用来执行SQL语句 private PreparedStatement ps; //用来存放数据的结果集 private ResultSet rs; // 连接数据库 public void getConnection() { // 加载驱动程序 try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/booksys?characterEncoding=utf-8"; //通过getConnection方法连接数据库 conn = DriverManager.getConnection(url, "root", ""); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } // 关闭数据库 从后往前依次关闭 public void close() { try { if (ps != null) { ps.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } // 实现对数据的更新--增加,删除,修改操作;其中Object...为可变参数 public int executeUpdate(String sql, Object... objects) { try { this.getConnection(); ps = conn.prepareStatement(sql); if (objects != null) { for (int i = 0; i < objects.length; i++) { ps.setObject(i + 1, objects[i]); } return ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } finally { this.close(); } return -1; } // 实现对数据的查询操作 public ResultSet executeQuery(String sql, Object... objects) { try { this.getConnection(); ps = conn.prepareStatement(sql); if (objects != null) { for (int i = 0; i < objects.length; i++) { ps.setObject(i + 1, objects[i]); } return rs = ps.executeQuery(); } } catch (SQLException e) { e.printStackTrace(); } return null; }}
2.由于我们需要做的是对书籍的增删改查等操作,所以新建书籍实体类包里面包含数据实体类和书籍分类类;同时在mysql数据库中新建book(书籍信息)和category(书籍分类)表。注意:其中book表的id设置为自动递增
书籍类
package cn.mxf.entity;import java.util.Date;//书籍类public class Book { // 对所有的属性生成get和set方法 private int id;// 书籍编号 private String name;// 书籍名称 private double price;// 价格 private String author;// 作者 private Date pubDate;// 出版日期 private int categoryId;// 书籍分类 // 无参构造方法 public Book() { } // 不带id的有参构造方法 public Book(String name, double price, String author, Date pubDate, int categoryId) { super(); this.name = name; this.price = price; this.author = author; this.pubDate = pubDate; this.categoryId = categoryId; } // 带id的有参构造方法 public Book(int id, String name, double price, String author, Date pubDate, int categoryId) { super(); this.id = id; this.name = name; this.price = price; this.author = author; this.pubDate = pubDate; this.categoryId = categoryId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } 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 Date getPubDate() { return pubDate; } public void setPubDate(Date pubDate) { this.pubDate = pubDate; } public int getCategoryId() { return categoryId; } public void setCategoryId(int categoryId) { this.categoryId = categoryId; }}
书籍分类类
package cn.mxf.entity;public class Category { // 书籍分类编号 private int id; // 书籍对应分类名 private String name; // 生成带参构造方法 public Category(int id, String name) { super(); this.id = id; this.name = name; } public Category(String name) { super(); this.name = name; } // 生成无参构造方法 public Category() { } // 并对属性进行设置set和get方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
3.接着实现基于BaseDao的书籍数据库连接类和书籍分类数据库连接类。
书籍数据库连接类
package cn.mxf.dao;import java.sql.ResultSet;import java.sql.SQLException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import cn.mxf.entity.Book;import cn.mxf.utils.BaseDao;//本类为继承于BaseDaopublic class BookDao extends BaseDao { // 实现查询所有书籍的功能 public List<Book> getAll() { List<Book> list = new ArrayList<Book>(); // 查询的SQL语句 String sql = "select * from book"; // 调用查询数据的方法对书籍进行查询操作 ResultSet rs = this.executeQuery(sql); try { // 将查询的结果存放于List<Book>中 while (rs.next()) { list.add(new Book(rs.getInt(1), rs.getString(2), rs.getDouble(3), rs.getString(4), rs.getDate(5), rs.getInt(6))); } } catch (SQLException e) { e.printStackTrace(); } finally { // 最后别忘记关闭 this.close(); } return list; } // 实现增加书籍的功能 public int addBook(Book book) { String sql = "insert into book(name,price,author,pubDate,categoryId) values(?,?,?,?,?)"; return this.executeUpdate(sql, book.getName(), book.getPrice(), book.getAuthor(), new SimpleDateFormat("yyyy-MM-dd").format(book.getPubDate()), book.getCategoryId()); } // 实现通过ID找到对应书籍的功能--在此之后才能进行修改操作 public Book selectBookById(int id) { // 通过id值查询对应书籍的SQL语句 String sql = "select * from book where id=" + id; // 执行查询操作 ResultSet rs = this.executeQuery(sql); try { if (rs.next()) { return new Book(rs.getInt(1), rs.getString(2), rs.getDouble(3), rs.getString(4), rs.getDate(5), rs.getInt(6)); } } catch (SQLException e) { e.printStackTrace(); } finally { // 最后别忘记关闭 this.close(); } return null; } // 实现修改书籍的功能--在此之前需要找到要修改的书籍信息 public int modifyBook(Book book) { // 更新书籍信息的SQL语句 String sql = "update book set name=?,price=?,author=?,pubDate=?,categoryId=? where id=?"; return this.executeUpdate(sql, book.getName(), book.getPrice(), book.getAuthor(), new SimpleDateFormat("yyyy-MM-dd").format(book.getPubDate()), book.getCategoryId(), book.getId()); } // 实现删除书籍的功能--直接通过id找到对应书籍然后删除 public int deleteBook(int id) { // 删除书籍的SQL语句 String sql = "delete from book where id=?"; return this.executeUpdate(sql, id); }}
书籍分类数据库连接类
package cn.mxf.dao;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import cn.mxf.entity.Category;import cn.mxf.utils.BaseDao;//本类为继承于BaseDaopublic class CategoryDao extends BaseDao { // 实现查询所有书籍分类的功能 public List<Category> getAll() { List<Category> list = new ArrayList<Category>(); // 查询所有分类的SQL语句 String sql = "select * from category"; // 根据SQL语句执行查询操作 ResultSet rs = this.executeQuery(sql); try { while (rs.next()) { // 将查询的结果存放于List<Category>中 list.add(new Category(rs.getInt(1), rs.getString(2))); } } catch (SQLException e) { e.printStackTrace(); } finally { // 最后别忘记关闭连接 this.close(); } return list.size() > 0 ? list : null; }}
4.准备工作完成后,现在才是真正的开始:新建BookServlet类(所有的操作在这里完成),在其中完成对书籍的增删改查操作。
package cn.mxf.servlet;import java.io.IOException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;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 cn.mxf.dao.BookDao;import cn.mxf.dao.CategoryDao;import cn.mxf.entity.Book;import cn.mxf.entity.Category;// 通过注解的方式配置Servlet@WebServlet("/book")public class BookServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 获取BookDao对象 private BookDao bookDao = new BookDao(); // 获取CategoryDao对象 private CategoryDao categoryDao = new CategoryDao(); public BookServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决乱码 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); /** * 获取操作的参数,确定好下一步该做什么 * op = list :查询所有的书籍信息 * op = toAdd :跳转到添加书籍的页面 * op = add :添加书籍 * op = delete :删除书籍 * op = getById :根据id值找到需要更改的书籍信息 * op = modify :修改书籍信息 */ // 根据传入的op判断执行那一个操作 String op = request.getParameter("op"); if (op == null || "list".equals(op)) { // 封装为方法 list(request, response); } else if ("toadd".equals(op)) { toadd(request, response); } else if ("add".equals(op)) { add(request, response); } else if ("getById".equals(op)) { getById(request, response); } else if ("modify".equals(op)) { modify(request, response); } else if ("delete".equals(op)) { delete(request, response); } } private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取所有书籍 List<Book> list = bookDao.getAll(); // 获取所有书籍分类 List<Category> clist = categoryDao.getAll(); // 用来在同一个request周期中保存list变量使用 request.setAttribute("list", list); // 用来在同一个request周期中保存clist变量使用 request.setAttribute("clist", clist); // response.sendRedirect()方法是通过浏览器对象重定向的,在两个不同的页面间传值会生成两个不同的request对象。 // 由于是在不同页面间传值,所以有使用RequestDispatcher接口的forward()方法。 request.getRequestDispatcher("list.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
5.在WebContent目录下新建list.jsp用来获取书籍列表并进行显示。
<!-- 显示数据库中所有书籍的JSP页面 ,其中涉及到了JSTL,EL表达式; 所以需要自己导入jstl.jar和standard.jar包到WebContent/WEB-INF/lib下;--><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!-- eclipse下使用JSTL需要导入java.sun.com/jsp/jstl/core,才能使用JSTL表达式 --><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>书籍信息页面</title></head><body> <h1>书籍信息列表</h1> <hr> <table width="80%" align="center"> <tr> <td>编号</td> <td>名称</td> <td>分类</td> <td>价格</td> <td>作者</td> <td>出版日期</td> <td>操作</td> </tr> <!-- 通过EL表达式获取传递过来的list,并且通过JSTL中的循环获取对应的属性值 --> <c:forEach items="${list }" var="bean" varStatus="status"> <!-- 1.隔行变色 2.分别取得对应的书籍属性值并且显示出来 3.当书籍中的分类编号和分类表中的编号相同时,显示分类表中的分类名 --> <tr <c:if test="${status.index%2==0 }">style="background:#0f0"</c:if>> <td>${bean.id }</td> <td>${bean.name }</td> <td><c:forEach items="${clist }" var="category"> <c:if test="${category.id == bean.categoryId }"> ${category.name } </c:if> </c:forEach></td> <td>${bean.price }</td> <td>${bean.author }</td> <td>${bean.pubDate }</td> <!-- 1.这里以浏览器的URL方式直接将书籍的对应id传递过去,可以对书籍进行查询操作和删除操作 --> <td><a href="book?op=getById&id=${bean.id }">修改</a> <a href="book?op=delete&id=${bean.id }">删除</a></td> </tr> </c:forEach> </table></body></html>
到这里的话你就可以执行你的代码来查询所有书籍了
6.然后就是给数据库中进行添加书籍的操作了。
private void add(HttpServletRequest request, HttpServletResponse response) throws IOException { String bookName = request.getParameter("name");// 书名 double price = Double.parseDouble(request.getParameter("price"));// 价格 String author = request.getParameter("author");// 作者 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date pubDate = null;// 出版日期 try { pubDate = sdf.parse(request.getParameter("pubDate")); } catch (ParseException e) { e.printStackTrace(); } int categoryId = Integer.parseInt(request.getParameter("categoryId"));// 书籍分类 // 根据获取到的书籍属性新创建一个书籍对象并调用BookDao中的addBook方法进行书籍的添加 Book b = new Book(bookName, price, author, pubDate, categoryId); if (bookDao.addBook(b) > 0) { response.sendRedirect("book?op=list"); } else { response.getWriter().print("添加失败!!"); } } private void toadd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取所有的书籍分类名称 List<Category> clist = categoryDao.getAll(); request.setAttribute("clist", clist); request.getRequestDispatcher("add.jsp").forward(request, response); }
7.在WebContent目录下新建add.jsp用来获取书籍列表并进行显示。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>添加书籍</title></head><body> <h1>添加书籍</h1> <hr> <!-- 这里需要注意:提交的时候需要交给当op=add时BookServlet中的add方法执行 --> <form action="book?op=add" method="post"> <table width="60%" align="center"> <tr> <td>书名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>分类:</td> <!-- 添加书籍的时候需要将书籍分类通过下拉框的形式显示出来 --> <td><select name="categoryId"> <c:forEach items="${clist }" var="bean"> <option value="${bean.id }">${bean.name }</option> </c:forEach> </select></td> </tr> <tr> <td>价格:</td> <td><input type="text" name="price"></td> </tr> <tr> <td>作者:</td> <td><input type="text" name="author"></td> </tr> <tr> <td>出版日期:</td> <td><input type="text" name="pubDate"></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交"> </td> </tr> </table> </form></body></html>
到这里的话你就可以执行你的代码来查询所有书籍和添加书籍了
8.接着就是修改获取到的书籍信息的操作了。
private void modify(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 获取id int id = 0; if (request.getParameter("id") != null) { id = Integer.parseInt(request.getParameter("id")); } String name = request.getParameter("name");// 书名 double price = Double.parseDouble(request.getParameter("price"));// 价格 String author = request.getParameter("author");// 作者 Date pubDate = null;// 出版日期 try { pubDate = new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("pubDate")); } catch (ParseException e) { e.printStackTrace(); } int categoryId = Integer.parseInt(request.getParameter("categoryId"));// 书籍分类 // 根据获取到的书籍属性新创建一个书籍对象并调用BookDao中的modifyBook方法进行书籍的更新 Book b = new Book(id, name, price, author, pubDate, categoryId); if (bookDao.modifyBook(b) > 0) { response.sendRedirect("book?op=list"); } else { response.getWriter().print("修改失败!!"); } } private void getById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取id int id = 0; if (request.getParameter("id") != null) { id = Integer.parseInt(request.getParameter("id")); } // 根据id查询对应记录 Book book = bookDao.selectBookById(id); List<Category> clist = categoryDao.getAll(); request.setAttribute("clist", clist); request.setAttribute("book", book); request.getRequestDispatcher("modify.jsp").forward(request, response); }
9.在WebContent目录下新建modify.jsp用来更新书籍并进行显示。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>修改书籍</title></head><body> <h1>修改书籍</h1> <hr> <form action="book?op=modify" method="post"> <table width="60%" align="center"> <tr> <!-- 这里需要将id传递过去 --> <td>书名: <input type="hidden" name="id" value="${book.id }" /> </td> <td><input type="text" name="name" value="${book.name}" /></td> </tr> <tr> <td>分类:</td> <!-- 修改书籍的时候需要将书籍分类通过下拉框的形式显示出来 --> <td><select name="categoryId"> <c:forEach items="${clist }" var="bean"> <option value="${bean.id }" <c:if test="${bean.id == book.categoryId }">selected</c:if>>${bean.name }</option> </c:forEach> </select></td> </tr> <tr> <td>价格:</td> <td><input type="text" name="price" value="${book.price}" /> </td> </tr> <tr> <td>作者:</td> <td><input type="text" name="author" value="${book.author}" /> </td> </tr> <tr> <td>出版日期:</td> <td><input type="text" name="pubDate" value="${book.pubDate}" /> </td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交"> </td> </tr> </table> </form></body></html>
到这里的话你就可以执行你的代码来查询所有书籍、添加书籍和修改书籍了
10.剩下的就只有删除了,其实删除是这里面最简单的了,只需要获取到id值之后就可以进行删除操作。
private void delete(HttpServletRequest request, HttpServletResponse response) throws IOException { // 获取id int id = 0; if (request.getParameter("id") != null) { id = Integer.parseInt(request.getParameter("id")); } // 根据获取到的书籍id调用BookDao中的deleteBook(id)方法进行书籍的删除 if (bookDao.deleteBook(id) > 0) { response.sendRedirect("book?op=list"); } }
总结:
- 通过这几天的学习也对之前的JDBC进行了复习与回顾;
- 新使用的MVC(Model View Control)模式使得界面与逻辑处理分离开来,很大程度上使得我们的修改变得简单;
- 通过EL、JSTL表达式的方式大大简化了编程代码的冗余。
- 最后附上整个项目的源代码
0 0
- 书籍管理系统
- 书籍管理
- 10_书籍管理系统_修改_删除
- 项目管理书籍
- extjs书籍管理
- 项目管理书籍推荐
- 项目管理书籍推荐
- 项目管理书籍推荐 .
- 图书馆管理书籍
- 项目管理经典书籍
- 项目管理书籍推荐
- 书籍管理 JAVA
- c#书籍管理
- 项目管理书籍推荐
- proGit git管理书籍
- 为开发新的零售管理系统选购的书籍清单
- Sqlite的使用和一个简单的书籍管理系统(上)
- Sqlite的使用和一个简单的书籍管理系统(下)
- struts2简介
- java8 LinkedList源码阅读【2】- 总结
- 沟通的法宝!"三季人法则"
- 【Java】多线程系列(一)之共享数据修改
- 2.基本语法
- 书籍管理系统
- Day2:实战作业
- 2017-4-17
- 3.数据类型
- 127.App显示的ListView的item点击事件,弹出泡泡窗
- 活动安排问题
- php中使用mysqli_fetch_array跟mysqli_fetch_row的区别
- SpringMVC 对象传递
- SpringMVC 集合传递