本文将介绍如何使用Spring Boot框架来构建一个简单的学生书籍管理系统,其中包括用户的注册和登录验证,并通过分层设计来实现系统的模块化和可维护性。
在resources/application.properties pom.xml下导入依赖包
org.mybatis.spring.boot
mybatis-spring-boot-starter
3.0.3
mysql
mysql-connector-java
8.0.25
在resources/application.properties写数据库连接配置
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://106.53.194.250:63306/spring?serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=ccc
spring.datasource.password=@hnucm1254
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mapper/*.xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.example.springmybatis.pojo
#打印日志
logging.level.com.example.springmybatis = debug
注意根据需求对应修改数据库连接地址等内容
Spring Boot 应用程序通常采用分层架构,在包下新建对应的分层Package
Model层对象通常是实体类,实体类的属性通常对应数据库表的字段。
@Data
public class User {
private int id;
private String username;
private String password;
}
DAO层(Data Access Object)负责与数据库进行交互,执行CRUD(Create, Read, Update, Delete)操作。在Spring Boot中,通常使用MyBatis作为ORM(Object-Relational Mapping)框架来实现DAO层。
MyBatis是一个流行的Java持久层框架,它让数据库操作更加方便。它使用XML或注解来映射SQL语句到Java对象。
@Mapper
注解:在Spring Boot项目中标记DAO层的接口,让Spring Boot知道这些接口需要被注册为Bean,并且由MyBatis来处理数据库操作。这样,你就可以通过注入这些Mapper接口来执行数据库操作,而不需要关心底层的实现细节。
@Mapper
public interface UserMapper {
public int addUser(User user);
public User findUser(String username,String password);
public User findUserByName(String userName);
}
insert into users202201020243(username,password) values(#{username},#{password})
Service层是业务逻辑层,它调用DAO层的方法来实现业务需求。Service层通常定义为接口和实现类。
public interface UserService {
public int addUser(User user);
public User findUser(String username,String password);
public boolean findUserByName(String userName);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public int addUser(User user) {
return userMapper.addUser(user);
}
@Override
public User findUser(String username, String password) {
return userMapper.findUser(username,password);
}
@Override
public boolean findUserByName(String userName) {
User user=userMapper.findUserByName(userName);
if(user!=null){
return true;
}else{
return false;
}
}
}
Controller层负责处理用户的HTTP请求,并调用Service层的方法来处理业务逻辑,然后将结果返回给用户。
@Controller
public class UserController {
public String loginName;
@Autowired
private UserService userService;
@Autowired
BookService bookService;
@RequestMapping("/login")
public String login(){
return "login.html";
}
@RequestMapping("/main")
public String main(Model model) {
model.addAttribute("username",loginName);
model.addAttribute("bookList", bookService.getAllBooks());
return "main.html";
}
@RequestMapping("/logincommit")
public String logincommit(String username, String password, Model model){
User user=userService.findUser(username,password);
boolean isExist=userService.findUserByName(username);
if(user!=null && user.getUsername().equals(username) && user.getPassword().equals(password)){
loginName=username;
model.addAttribute("username",username);
model.addAttribute("bookList",bookService.getAllBooks());
return "main.html";
}
if(isExist){
model.addAttribute("loginError", "密码错误,请重新输入!");
return "login";
}
if(!isExist){
model.addAttribute("loginError", "该用户名尚未进行注册!");
return "login";
}
return "fail.html";
}
@RequestMapping("/register")
public String register(){
return "register.html";
}
@RequestMapping("/registercommit")
public String registercommit(User user,Model model){
userService.addUser(user);
model.addAttribute("registersuccess", "注册成功,请登录!");
return "/login";
}
@Data
public class Book {
private int id;
private String title;
private String author;
private String isbn;
private String publisher;
private Date published_date;
}
public interface BookMapper {
public List getAllBooks();
public int deleteBook(int id);
public int putBook(Book book);
public int addBook(Book book);
}
delete from books202201020243 where id=#{id}
update books202201020243 set title=#{title},author=#{author},isbn=#{isbn},publisher=#{publisher}, published_date=#{published_date} where id=#{id}
insert into books202201020243(title,author,isbn,publisher,published_date) values(#{title},#{author},#{isbn},#{publisher},#{published_date})
Service层是业务逻辑层,它调用DAO层的方法来实现业务需求。Service层通常定义为接口和实现类。
public interface BookService {
public List getAllBooks();
public int deleteBook(int id);
public int putBook(Book book);
public int addBook(Book book);
}
@Service
public class BookServiceImpl implements BookService {
@Autowired
BookMapper bookMapper;
@Override
public List getAllBooks() {
return bookMapper.getAllBooks();
}
@Override
public int deleteBook(int id) {
return bookMapper.deleteBook(id);
}
@Override
public int putBook(Book book) {
return bookMapper.putBook(book);
}
@Override
public int addBook(Book book) {
return bookMapper.addBook(book);
}
}
Controller层负责处理用户的HTTP请求,并调用Service层的方法来处理业务逻辑,然后将结果返回给用户。
@Controller
public class BookController {
@Autowired
UserController userController;
@Autowired
BookService bookService;
@RequestMapping("/deletebook")
public String deleteBook(int id){
bookService.deleteBook(id);
return "redirect:/main";
}
@RequestMapping("/updatebook")
public String updatebook(Book book,Model model){
model.addAttribute("book",book);
return "update.html";
}
@RequestMapping("/updatebookcommit")
public String updatebook(int id, String title, String author, String isbn, String publisher,
@RequestParam("published_date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date publishedDate,
Model model) {
Book book = new Book();
book.setId(id);
book.setTitle(title);
book.setAuthor(author);
book.setIsbn(isbn);
book.setPublisher(publisher);
book.setPublished_date(publishedDate);
bookService.putBook(book);
model.addAttribute("username",userController.loginName);
model.addAttribute("bookList",bookService.getAllBooks());
return "main.html";
}
@RequestMapping("/addbook")
public String addBook(){
return "addbook.html";
}
@RequestMapping("/addbookcommit")
public String addBook(String title, String author, String isbn, String publisher,
@RequestParam("published_date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date publishedDate,
Model model) {
Book book = new Book();
book.setTitle(title);
book.setAuthor(author);
book.setIsbn(isbn);
book.setPublisher(publisher);
book.setPublished_date(publishedDate);
bookService.addBook(book);
model.addAttribute("username",userController.loginName);
model.addAttribute("bookList",bookService.getAllBooks());
return "main.html";
}
}
界面代码写到resources/templates文件下
Title
添加书籍页面
Title
登录页面
注册
主页面
登录成功
添加用户
编号
书名
作者
ISBN号
出版社
出版日期
删除操作
更新操作
Title
注册页面
Title
更新书籍页面
由于设置的日期类型为date,所以更新页面展示的时候,日期显示格式如下:
解决方法:使用日期格式转换,将其转换为如下格式日期:
修改出版日期:
由于更新界面的日期更改了格式,所以在接受用户输入提交请求之后,需要把日期转换为原date类型,这里对传入的日期进行注解从而实现转换:
@RequestParam("published_date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date publishedDate
@RequestMapping("/updatebookcommit")
public String updatebook(int id, String title, String author, String isbn, String publisher,
@RequestParam("published_date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date publishedDate,
Model model) {
Book book = new Book();
book.setId(id);
book.setTitle(title);
book.setAuthor(author);
book.setIsbn(isbn);
book.setPublisher(publisher);
book.setPublished_date(publishedDate);
bookService.putBook(book);
model.addAttribute("username",userController.loginName);
model.addAttribute("bookList",bookService.getAllBooks());
return "main.html";
}
当更新对应日期之后,发现更新之后的日期比用户输入的日期少一天的时间。
解决方法:网上查阅资料得知,mysql驱动serverTimezone=UTC的问题,改为上海即可:
# 数据库连接地址
spring.datasource.url=jdbc:mysql://106.53.194.250:63306/spring?serverTimezone=Asia/Shanghai
希望这篇文章能对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。