SpringBoot+Mybatis 实现简单的学生书籍管理系统

本文将介绍如何使用Spring Boot框架来构建一个简单的学生书籍管理系统,其中包括用户的注册和登录验证,并通过分层设计来实现系统的模块化和可维护性。

一、准备工作

1.使用Navicat创建数据库表

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第1张图片

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第2张图片

2.导入依赖包和对应的数据库驱动

在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

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第3张图片

(一)用户表的操作

1.model层

Model层对象通常是实体类,实体类的属性通常对应数据库表的字段。

  • @Data:这是Lombok库提供的一个注解,它为类提供了getter和setter方法,以及toString、equals和hashCode方法。使用这个注解可以减少模板代码的编写。
@Data
public class User {
    private int id;
    private String username;
    private String password;
}

2.dao层 

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})
    


    

    

    

3.service层

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;
        }
        }
    }

4.controller层

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";

    }

(二)书籍表的操作

1.model层

@Data
public class Book {
    private int id;
    private String title;
    private String author;
    private String isbn;
    private String publisher;
    private Date published_date;
}

2.dao层 

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})
    






3.service层

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);
    }
}

4.controller层

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
    


添加书籍页面

添加书名:
添加作者:
添加ISBN号:
添加出版社:
添加出版日期:

返回书籍列表




    
    Title
    



登录页面



注册



    
    主页面
    



登录成功

添加用户
编号 书名 作者 ISBN号 出版社 出版日期 删除操作 更新操作




  
  Title
  


注册页面






    
    Title
    


更新书籍页面


修改书名:
修改作者:
修改ISBN号:
修改出版社:
修改出版日期:

返回书籍列表

 (四)界面展示

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第4张图片

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第5张图片

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第6张图片

三、遇到的问题 

(一)日期格式的界面显示

由于设置的日期类型为date,所以更新页面展示的时候,日期显示格式如下:

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第7张图片

解决方法:使用日期格式转换,将其转换为如下格式日期:

修改出版日期:

SpringBoot+Mybatis 实现简单的学生书籍管理系统_第8张图片

由于更新界面的日期更改了格式,所以在接受用户输入提交请求之后,需要把日期转换为原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

希望这篇文章能对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

你可能感兴趣的:(spring,boot,mybatis,数据库)