个人主页:欢迎访问Ali.s的首页
⏰ 最近更新:2022年9月20日
⛽ Java框架学习系列:【Spring】【SpringMVC】【Mybatis】
Java项目实战系列:【飞机大战】【图书管理系统】
Java算法21天系列:【查找】【排序】【递归】
⛳ Java基础学习系列:【继承】【封装】【多态】
通信仿真学习系列:【硬件】【通信】【MATLAB】
个人简介:通信工程本硕、Java程序员。目前只会CURD
点赞 收藏 留言 都是我最大的动力
这里是【JAVASE】
项目实战的第六节课,前面完成了登录和注销功能,在未登录的状态下,无法访问数据信息。今天做的是书籍管理功能,使用【Servlet】
、【JSP】
、【MySql】
、【Ajax】
来实现书籍的管理功能。
在前面用户功能实现后,可以清楚的看到用户直接进入了后台的主界面,,通过登录模块来达到数据安全。进入系统后首先看到的是用户管理,接着就是书籍管理,书籍管理其实跟用户管理大同小异,主要也是增删改查的操作,有一点不同的是,书籍管理需要与后面的学生管理做绑定。
在dao
层和service
层中创建接口。这里与用户模块类似,首先完成前端页面的信息,然后进行后端的校验逻辑的判断,到层处理sql
语句,需要准备Book
实体类,便于关系的映射和值的获取与传递。
结合数据库字段信息,完成书籍实体类的创建,也可以使用相关工具创建,但是使用工具创建容易导致字段类型不匹配,刚开始做项目,建议手动写实体类,对每个字段的类型有一个基本的了解,还要注意自己手动添加下toString()
方法。
import java.util.Date;
import java.io.Serializable;
/**
* (TBook)实体类
*
* @author Ali.S
* @since 2022-08-11 21:41:49
*/
public class Book implements Serializable {
private static final long serialVersionUID = 429249063538036947L;
/**
* 书籍id
*/
private Integer id;
/**
* 书籍名称
*/
private String bookName;
/**
* 作者
*/
private String author;
/**
* 出版社
*/
private String publish;
/**
* 书籍编码
*/
private String isbn;
/**
* 书籍介绍
*/
private String introduction;
/**
* 书籍语言
*/
private String language;
/**
* 书籍售价
*/
private Double price;
/**
* 发布日期
*/
private Date pubdate;
/**
* 书架号
*/
private String pressmark;
/**
* 书籍状态 0 空闲 1借阅 2下架 3 其他
*/
private Integer state;
/**
* 删除状态 0 删除 1未删除
*/
private Integer isDeleted;
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Date getPubdate() {
return pubdate;
}
public void setPubdate(Date pubdate) {
this.pubdate = pubdate;
}
public String getPressmark() {
return pressmark;
}
public void setPressmark(String pressmark) {
this.pressmark = pressmark;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public Integer getIsDeleted() {
return isDeleted;
}
public void setIsDeleted(Integer isDeleted) {
this.isDeleted = isDeleted;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", publish='" + publish + '\'' +
", isbn='" + isbn + '\'' +
", introduction='" + introduction + '\'' +
", language='" + language + '\'' +
", price=" + price +
", pubdate=" + pubdate +
", pressmark='" + pressmark + '\'' +
", state=" + state +
", isDeleted=" + isDeleted +
'}';
}
}
创建数据持久层的接口与实现,并完成增删改查的相关方法,为业务逻辑层做准备。
public interface BookDao{
public List<Book> list(Book book);
public Integer saveBook(Book book);
public Integer updateBook(Book book);
public Integer deleteBook(Integer id);
public Book queryBookById(Integer id);
List<Book> queryBookState(int code);
}
在完成接口的时候,在实现接口的类中完成相关的方法,注意添加和更新可以在同一个方法中,在具体的方法中通过Ajax
是否拿到当前的数据的id
作为判断标准,进而将两个功能进行单独的处理,这里是单独完成的,代码显得有些冗余,但是逻辑思路更加清晰。
public class BookDaoImpl implements BookDao {
String sql;
QueryRunner queryRunner;
//查询图书
@Override
public List<Book> list(Book book) {
queryRunner = DBUtils.getQueryRunner();
sql = "select * from t_book where is_deleted=?";
try {
return queryRunner.query(sql, new ResultSetHandler<List<Book>>() {
@Override
public List<Book> handle(ResultSet resultSet) throws SQLException {
List<Book> list = new ArrayList<>();
while (resultSet.next()) {
Book b = new Book();
b.setId(resultSet.getInt("id"));
b.setBookName(resultSet.getString("book_name"));
b.setAuthor(resultSet.getString("author"));
b.setPublish(resultSet.getString("publish"));
b.setIsbn(resultSet.getString("isbn"));
String introduction = resultSet.getString("introduction");
if (introduction != null && !"".equals(introduction) && introduction.length() > 20) {
introduction = resultSet.getString("introduction").substring(0, 20);
b.setIntroduction(introduction + "...");
} else {
b.setIntroduction(introduction);
}
b.setLanguage(resultSet.getString("language"));
b.setPrice(resultSet.getDouble("price"));
b.setPubdate(resultSet.getDate("pubdate"));
b.setPressmark(resultSet.getString("pressmark"));
b.setIsDeleted(resultSet.getInt("is_deleted"));
b.setState(resultSet.getInt("state"));
list.add(b);
}
return list;
}
}, DelFlag.No.code);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//新增图书
@Override
public Integer saveBook(Book book) {
queryRunner = DBUtils.getQueryRunner();
sql = "insert into t_book (book_name,author,publish,isbn,introduction,language,price,pubdate,pressmark,state,is_deleted) values (?,?,?,?,?,?,?,?,?,?,?)";
try {
return submitInfo(book);
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
//更新图书
@Override
public Integer updateBook(Book book) {
queryRunner = DBUtils.getQueryRunner();
if (book.getIsDeleted() == null || "".equals(book.getIsDeleted())) {
book.setIsDeleted(DelFlag.No.code);
}
if (book.getState() == null || "".equals(book.getState())) {
book.setState(0);
}
sql = "update t_book set book_name=?,author=?,publish=?,isbn=?,introduction=?,language=?,price=?,pubdate=?,pressmark=?,state=?,is_deleted=? where id=?";
try {
return updateInfo(book);
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
//删除图书
@Override
public Integer deleteBook(Integer id) {
queryRunner = DBUtils.getQueryRunner();
sql = "update t_book set is_deleted=? where id=?";
try {
return queryRunner.update(sql, DelFlag.YES.code, id);
} catch (SQLException e) {
e.printStackTrace();
}
return -1;
}
//查询单条信息
@Override
public Book queryBookById(Integer id) {
queryRunner = DBUtils.getQueryRunner();
sql = "select * from t_book where is_deleted=? and id=?";
try {
return queryRunner.query(sql, new ResultSetHandler<Book>() {
@Override
public Book handle(ResultSet resultSet) throws SQLException {
if (resultSet.next()) {
Book b = new Book();
b.setId(resultSet.getInt("id"));
b.setBookName(resultSet.getString("book_name"));
b.setAuthor(resultSet.getString("author"));
b.setPublish(resultSet.getString("publish"));
b.setIsbn(resultSet.getString("isbn"));
b.setIntroduction(resultSet.getString("introduction"));
b.setLanguage(resultSet.getString("language"));
b.setPrice(resultSet.getDouble("price"));
b.setPubdate(resultSet.getDate("pubdate"));
b.setPressmark(resultSet.getString("pressmark"));
b.setIsDeleted(resultSet.getInt("is_deleted"));
b.setState(resultSet.getInt("state"));
return b;
}
return null;
}
}, DelFlag.No.code,id);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//查询是否上架
@Override
public List<Book> queryBookState(int code) {
queryRunner = DBUtils.getQueryRunner();
sql = "select * from t_book where is_deleted=? and state=?";
try {
return queryRunner.query(sql, new ResultSetHandler<List<Book>>() {
@Override
public List<Book> handle(ResultSet resultSet) throws SQLException {
List<Book> list = new ArrayList<>();
while (resultSet.next()) {
Book b = new Book();
b.setId(resultSet.getInt("id"));
b.setBookName(resultSet.getString("book_name"));
b.setAuthor(resultSet.getString("author"));
b.setPublish(resultSet.getString("publish"));
b.setIsbn(resultSet.getString("isbn"));
String introduction = resultSet.getString("introduction");
if (introduction != null && !"".equals(introduction) && introduction.length() > 20) {
introduction = resultSet.getString("introduction").substring(0, 20);
b.setIntroduction(introduction + "...");
} else {
b.setIntroduction(introduction);
}
b.setLanguage(resultSet.getString("language"));
b.setPrice(resultSet.getDouble("price"));
b.setPubdate(resultSet.getDate("pubdate"));
b.setPressmark(resultSet.getString("pressmark"));
b.setIsDeleted(resultSet.getInt("is_deleted"));
b.setState(resultSet.getInt("state"));
list.add(b);
}
return list;
}
}, DelFlag.No.code,code);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
与数据持久层类似的操作,创建相应的接口并实现,调用数据持久层的方法获取数据信息。
public interface BookService {
public List<Book> list(Book book);
public Integer saveBook(Book book);
public Integer updateBook(Book book);
public Integer deleteBook(Integer id);
public Book queryBookById(Integer id);
List<Book> queryBooksState(int code);
}
在Servlet
层中创建 BookServlet
通过处理查询所有书籍的方法。同时将处理POST
请求字符编码问题单独放在了过滤器中。
public class BookServlet extends HttpServlet {
private BookService bookService=new BookServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
//获取提交的数据
String type=req.getParameter(Constant.SERVLET_TYPE_SQLTYPE);
if (type != null && !"".equals(type)) {
//对请求进行判断,针对不同的请求进行不同的处理
if (Constant.SERVLET_TYPE_QUERY.equals(type)) {
//进行查询操作
queryBook(req, resp);
}else if (Constant.SERVLET_TYPE_SAVE.equals(type)){
//新增提交操作
saveOrUpdateBook(req, resp);
}else if (Constant.SERVLET_TYPE_QUERYBYID.equals(type)){
//获取单条信息,便于修改
queryBookById(req, resp);
} else if (Constant.SERVLET_TYPE_UPDATE.equals(type)){
//进行更新操作
saveOrUpdateBook(req,resp);
}else if (Constant.SERVLET_TYPE_DELETE.equals(type)){
deleteBook(req, resp);
}else{
queryBook(req, resp);
}
}
}
//删除
private void deleteBook(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String id= req.getParameter("id");
bookService.deleteBook(Integer.parseInt(id));
resp.sendRedirect("/bookServlet?sqltype=query");
}
//更新
private void queryBookById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id= req.getParameter("id");
Book book=bookService.queryBookById(Integer.parseInt(id));
req.setAttribute("book",book);
req.getRequestDispatcher("/book/bookUpdate.jsp").forward(req, resp);
}
//添加
private void saveOrUpdateBook(HttpServletRequest req, HttpServletResponse resp) {
//进行添加
try {
//使用反射机制,快速提取表单中的信息到book对象中
Book book = RequestParameterUntil.getRequestParameterForReflect(req, Book.class);
int count=-1;
if (book.getId()!=null && book.getId()>0){
//表示更新
count= bookService.updateBook(book);
} else{
//表示添加
count = bookService.saveBook(book);
}
if (count>0){
//添加成功,进行重定向
resp.sendRedirect("/bookServlet?sqltype=query");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动服务器,让项目在服务器中运行,进入登录页面,输入账号密码后进行书籍的查询功能的测试:
与数据库对比后可以发现所有的书都可以被查询到,并且可以在前端页面进行渲染。下面进行新增图书的功能测试,在点击添加按钮后,跳转到表单页面,输入需要新增的图书信息:
确认信息无误后,进行表单提交,页面进行重定向,自动完成所有图书的查询,看到新的图书添加成功。
接着对刚才新增的书,进行修改操作,看是否能完成修改功能,将图书的名称和价格都修改一下:
最后对图书的删除功能进行测试,这里是非物理删除,在点击图书删除按钮时,改变图书的状态码,使其前端无法完成显示,但数据信息还是依旧保留在数据库中:
以上就是今天要讲的内容,使用【Servlet】
、【JSP】
、【MySql】
、【Ajax】
来实现书籍的管理功能,为后续学生管理和借阅管理做准备。