JavaWeb实现图书增删改查系统

目录

前言

一、功能要求

二、技术要求

三、图书增删改查系统

四、效果实现

 五、总结



前言

Java是世界上使用最广泛的编程语言之一。Java最初由Sun Microsystems在1990年代开发,用于开发从Web应用程序到移动应用程序到批处理应用程序的所有内容。Java最初是一种纯粹的面向对象的语言,但现在已经发展成为一种多范例语言,可以高度适应任何情况。拥有庞大的开发人员社区和支持库,Java是开发几乎所有类型的应用程序的理想选择。


一、功能要求

设计一个图书馆业务管理系统,主要包括书本名字、编号、价格;管理员可以通过这个系统对图书的状态进行查询,还可以对图书信息进行添加、删除、更新等。

二、技术要求

1.使用Spring Boot来搭建后端应用。

2.使用mysql数据库来储存图书业务信息。

3.使用JPA来实现与数据库的交互。

4.使用Thymeleaf作为前端模板引擎,方便在后端渲染页面并展示银行业务信息,使用Bootstrap框架来提升用户界面的友好性和响应式设计。

三、图书增删改查系统

1.创建图书的业务类型,定义图书业务信息

package com.example.demo.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Table(name = "books")
public class Books {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "书名")
private String name;


@Column(name = "作者")
private String author;



@Column(name = "书籍编号")
private int bookNumber;



@Column(name = "价格")
private float price;

2.创建一个BooksRepository用于访问和操作数据,并写一个接诶扣,用来封装数据的增、删、改、查等操作

package com.example.demo.repository;

import com.example.demo.model.Books;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BooksRepository extends JpaRepository<Books, Long> {

List<Books> findByAuthor(String author);

}

3.BooksService层用来存放业务逻辑和数据访问,在BooksService层写一个接口.BooksService,用于服务测试,里面调用了方法,讲将图书信息存入、新增图书信息和修改图书信息、通过作者查询图书信息。

package com.example.demo.service;

import com.example.demo.model.Books;
import org.springframework.data.domain.Page;

import java.util.List;

public interface BooksService {
List<Books> getAllBook();
void addBook(Books book);
void updateBook(Books book);
Books getBookById(long id);
void deleteBookById(long id);
//分页
Page<Books> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection);
//获取作者
Books findByAuthor(String author);
}

4.测试类BooksService,实现获取所有图书信息、根据作者查询图书信息、新增图书信息和修改图书信息、删除图书信息。

package com.example.demo.service;

import com.example.demo.model.Books;
import com.example.demo.repository.BooksRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class BooksServiceImpl implements BooksService {
@Autowired
private BooksRepository bookRepository;
@Override
public List<Books> getAllBook() {
return bookRepository.findAll();
}
@Override
public void addBook(Books book) {

this.bookRepository.save(book);
}
@Override
public void updateBook(Books book) {
bookRepository.saveAndFlush(book);
}
@Override
public Books getBookById(long id) {
//查找指定id,返回Optional对象
Optional<Books> optional = bookRepository.findById(id);
Books book = null;
if (optional.isPresent()){ //如果id存在
book = optional.get(); //从Optional对象中获取图书
}else {
throw new RuntimeException("找不到图书id :" + id);
}
return book;
}
@Override
public void deleteBookById(long id) {
this.bookRepository.deleteById(id);
}
@Override
public Page<Books> findPaginated(int pageNo, int pageSize, String sortField,
String sortDirection) {
Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name())
? Sort.by(sortField).ascending()
: Sort.by(sortField).descending();
Pageable pageable = PageRequest.of(pageNo - 1,pageSize, sort);
return this.bookRepository.findAll(pageable);
}
@Override
public Books findByAuthor(String author) {
return (Books) bookRepository.findByAuthor(author);
}
}

5.BooksController控制层负责接收用户请求、处理业务逻辑,并返回响应的部分。它作为系统的入口点,将请求转发给相应的BooksService层进行处理。

package com.example.demo.controller;

import com.example.demo.model.Books;
import com.example.demo.repository.BooksRepository;
import com.example.demo.service.BooksService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class BooksController {

@Autowired
private BooksService bookService;
//首页
@GetMapping("/")
public String index(Model model){
return findPaginated(1,"name","asc", model);

}
@GetMapping("/showNewBookForm")
public String showNewBookForm(Model model){
Books book = new Books();
model.addAttribute("book",book);
return "new_book";
}
//新增图书页
@PostMapping("/addBook")
public String addBook(@ModelAttribute("book") Books book){
//将图书保存到数据库
bookService.addBook(book);
return "redirect:/";
}
//更新图书信息页
@GetMapping("/updateBook/{id}")
public String updateBook(@PathVariable(value = "id") long id, Model model){
//获取id
Books book = bookService.getBookById(id);
//填充表单
model.addAttribute("book", book);
return "update_book";
}
//删除指定id
@GetMapping("/deleteBook/{id}")
public String deleteBook(@PathVariable(value = "id") long id){
this.bookService.deleteBookById(id);
return "redirect:/";
}
//分页
@GetMapping("/page/{pageNo}")
public String findPaginated(@PathVariable(value = "pageNo") int pageNo,
@RequestParam("sortField") String sortField,
@RequestParam("sortDir") String sortDir,
Model model){
int pageSize = 4;
Page<Books> page = bookService.findPaginated(pageNo, pageSize, sortField, sortDir);
List<Books> listBook = page.getContent();
model.addAttribute("currentPage", pageNo);
model.addAttribute("totalPages", page.getTotalPages());
model.addAttribute("totalItems", page.getTotalElements());
model.addAttribute("sortField", sortField);
model.addAttribute("sortDir", sortDir);
model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc");
model.addAttribute("listBook",listBook);
return "index";
}
@Autowired
private BooksRepository bookRepository;
//获取所有书
@GetMapping("/books")
public String getBooks(Model model){
List<Books> books = bookRepository.findAll();
model.addAttribute("books",books);
return "search";
}
// //查询作者
@PostMapping("/books/search")
public String searchBook(@RequestParam("author") String author, Model model) {
List<Books> books = bookRepository.findByAuthor(author);
model.addAttribute("books",books);
return "search";
}
}

6.controller的html管理

添加图书信息:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>添加书籍</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

</head>
<body>

<div class="container">
<h1>添加书籍的管理页面</h1>
<hr>
<h2>添加书籍</h2>

<form action="#" th:action="@{/addBook}" th:object="${book}" method="POST">

<input type="text" th:field="*{name}" placeholder="书名" class="form-control mb-4 col-4">


<input type="text" th:field="*{author}" placeholder="作者" class="form-control mb-4 col-4">


<input type="text" th:field="*{bookNumber}" placeholder="书籍编号" class="form-control mb-4 col-4">

<input type="text" th:field="*{price}" placeholder="销售价格" class="form-control mb-4 col-4">

<button type="submit" class="btn btn-info col-2">需要添加的书籍</button>
</form>

<hr>
<a th:href="@{/}">返回列表</a>
</div>
</body>
</html>

查询图书信息:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>查询书籍</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
</head>
<body>
<div class="container my-2">
<table border="1" class="table table-striped table-responsive-md">
<thead>
<tr>
<th><a th:href="@{'/page/' + ${currentPage} + '?sortField=id&sortDir=' + ${reverseSortDir}}">id</a></th>

<th><a th:href="@{'/page/' + ${currentPage} + '?sortField=name&sortDir=' + ${reverseSortDir}}">书名</a></th>
<th><a th:href="@{'/page/' + ${currentPage} + '?sortField=author&sortDir=' + ${reverseSortDir}}">作者</a></th>
<th><a th:href="@{'/page/' + ${currentPage} + '?sortField=bookNumber&sortDir=' + ${reverseSortDir}}">书籍编号</a></th>
<th><a th:href="@{'/page/' + ${currentPage} + '?sortField=price&sortDir=' + ${reverseSortDir}}">价格</a></th>
<th>操作</th>
</tr>

</thead>
<tbody>
<tr th:each="book : ${books}">
<td th:text="${book.id}"></td>
<td th:text="${book.name}"></td>
<td th:text="${book.author}"></td>
<td th:text="${book.bookNumber}"></td>
<td th:text="${book.price}"></td>
<td>
<a th:href="@{/updateBook/{id}(id=${book.id})}" class="btn btn-primary">修改</a>
<a th:href="@{/deleteBook/{id}(id=${book.id})}" class="btn btn-danger">删除</a>
</td>

</tr>

</tbody>

</table>

<div th:if = "${totalPages > 1}">
<div class = "row col-sm-10">
<div class = "col-sm-3">
Total Rows: [[${totalItems}]]
</div>

<div class = "col-sm-5">
<span th:each="i: ${#numbers.sequence(1, totalPages)}">
<a th:if="${currentPage != i}" th:href="@{'/page/' + ${i}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">[[${i}]]</a>
<span th:unless="${currentPage != i}">[[${i}]]</span> &nbsp; &nbsp;
</span>
</div>

<div class = "col-sm-1">
<a th:if="${currentPage < totalPages}" th:href="@{'/page/' + ${currentPage + 1}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">下一页</a>
<span th:unless="${currentPage < totalPages}">下一页</span>
</div>

<div class="col-sm-1">
<a th:if="${currentPage < totalPages}" th:href="@{'/page/' + ${totalPages}+ '?sortField=' + ${sortField} + '&sortDir=' + ${sortDir}}">最后一页</a>
<span th:unless="${currentPage < totalPages}">最后一页</span>
</div>
</div>
</div>

</div>


</body>
</html>

修改图书信息:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>修改书籍</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">


</head>
<body>
<div class="container">
<h1>修改书籍信息</h1>
<hr>
<h2>修改信息</h2>

<form action="#" th:action="@{/addBook}" th:object="${book}" method="POST">

<input type="hidden" th:field="*{id}" />

<input type="text" th:field="*{name}" placeholder="书名" class="form-control mb-4 col-4">
<input type="text" th:field="*{author}" placeholder="作者" class="form-control mb-4 col-4">

<input type="text" th:field="*{bookNumber}" placeholder="书籍编号" class="form-control mb-4 col-4">
<input type="text" th:field="*{price}" placeholder="销售价格" class="form-control mb-4 col-4">

<button type="submit" class="btn btn-info col-2">修改书籍信息</button>
</form>

<a th:href="@{/}">返回首页</a>


</div>
</body>
</html>

四、效果实现

添加图书信息

 根据图书作者查询图书信息

 修改图书信息

 删除图书信息

 五、总结

 对 Java 语言来说,万物皆对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计。最开始三周的Java学习,我逐渐慢慢进入了Java这个缤纷绚烂的世界,学习这门语言的语法,规则,体会感悟其魅力所在。Java 的基本封装单位是类。Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问。从一位架构师老师那学到,他将Java的封装概括为一句话:封装是将对象的 属性 (名词) 和 行为 (动词) 封装成一个类。最开始的三次PTA作业亦是逐步将我们带到面向对象设计的这条道路中,面向对象开发模式更有利于我们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。这三次作业给我印象最深的那便是复用性了。抽象、继承、封装 和 多态 四大特点都围绕这个核心。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaWeb实现数据库的增删改查操作可以通过 JDBC(Java Database Connectivity)来实现。以下是一个简单的示例代码: 1. 导入必要的包: ```java import java.sql``` 2. 建立数据库连接: ```java String url = "jdbc:mysql://localhost:3306/mydatabase"; // 数据库地址 String username = "root"; // 数据库用户名 String password = "password"; // 数据库密码 Connection conn = DriverManager.getConnection(url, username, password); ``` 3. 执行查询操作: ```java String sql = "SELECT * FROM mytable"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { // 处理查询结果 int id = rs.getInt("id"); String name = rs.getString("name"); // ... } // 关闭资源 rs.close(); stmt.close(); ``` 4. 执行插入操作: ```java String sql = "INSERT INTO mytable (name, age) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "John"); pstmt.setInt(2, 25); pstmt.executeUpdate(); // 关闭资源 pstmt.close(); ``` 5. 执行更新操作: ```java String sql = "UPDATE mytable SET age = ? WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 30); pstmt.setInt(2, 1); pstmt.executeUpdate(); // 关闭资源 pstmt.close(); ``` 6. 执行删除操作: ```java String sql = "DELETE FROM mytable WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.executeUpdate(); // 关闭资源 pstmt.close(); ``` 7. 关闭数据库连接: ```java conn.close(); ``` 以上是一个简单的示例,实际开发中可能需要根据具体需求进行修改和完善。另外,为了保证代码的安全性和性能,建议使用连接池来管理数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值