Book-Management-SSM
1
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>BookManagement</artifactId>
<version>1.0-SNAPSHOT</version>
<name>BookManagement</name>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<junit.version>5.9.2</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.10</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring6</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.34</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension-spring6</artifactId>
<version>2.0.34</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.33</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
MainConfiguration.java
:
package com.study.cofig;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@ComponentScans({
@ComponentScan("com.study.service"),
})
@MapperScan("com.study.mapper")
public class MainConfiguration {
@Bean
public DataSource dataSource(){
return new PooledDataSource("com.mysql.cj.jdbc.Driver",
"jdbc:mysql://localhost:3306/book_management3",
"root",
"Eve123456");
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean;
}
}
MvcConfiguration.java
package com.study.cofig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
@Configuration
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer {
@Bean
public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setOrder(1); // it can exist multiple view resolvers and we can set the parsing order for them
resolver.setCharacterEncoding("UTF-8"); // set the encoding format
resolver.setTemplateEngine(springTemplateEngine);
// as we are using Thymeleaf, we need to set the prefix and suffix for the HTML pages
return resolver;
}
// configure the template resolver
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setSuffix(".html"); // set the suffix of the HTML pages
resolver.setPrefix("classpath:/templates/");
resolver.setCharacterEncoding("UTF-8");
// set the template mode to HTML and the encoding format
return resolver;
}
// configure the template engine bean
@Bean
public SpringTemplateEngine springTemplateEngine(ITemplateResolver resolver){
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(resolver); // set the template resolver
return engine;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
SecurityConfiguration.java
:
package com.study.cofig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@EnableWebSecurity
@Configuration
public class SecurityConfiguration {
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public PersistentTokenRepository tokenRepository(DataSource dataSource){
JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
repository.setCreateTableOnStartup(true);
repository.setDataSource(dataSource);
return repository;
}
}
MvcInitializer.java
:
package com.study.initialize;
import com.study.cofig.MvcConfiguration;
import com.study.cofig.SecurityConfiguration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{MvcConfiguration.class, SecurityConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SecurityInitializer.java
:
UserMapper.java
:
UserServiceImpl.java
:
package com.study.service.Impl;
import com.study.service.UserService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}
UserService.java
:
package com.study.service;
import org.springframework.security.core.userdetails.UserDetailsService;
public interface UserService extends UserDetailsService {
}
2
MvcInitializer.java
:
package com.study.initialize;
import com.study.cofig.MainConfiguration;
import com.study.cofig.MvcConfiguration;
import com.study.cofig.SecurityConfiguration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{MvcConfiguration.class, SecurityConfiguration.class, MainConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SercurityConfiguration.java
:
package com.study.cofig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@EnableWebSecurity
@Configuration
public class SecurityConfiguration {
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public PersistentTokenRepository tokenRepository(DataSource dataSource){
JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
// repository.setCreateTableOnStartup(true);
repository.setDataSource(dataSource);
return repository;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,
PersistentTokenRepository repository) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/static/**").permitAll();
auth.anyRequest().authenticated();
})
.formLogin(conf -> {
conf.loginPage("/login");
conf.loginProcessingUrl("/doLogin");
conf.defaultSuccessUrl("/");
conf.permitAll();
conf.usernameParameter("username");
conf.passwordParameter("password");
})
.logout(conf -> {
conf.logoutUrl("/doLogout");
conf.logoutSuccessUrl("/login");
conf.permitAll();
})
.csrf(AbstractHttpConfigurer::disable)
.rememberMe(conf -> {
conf.tokenRepository(repository);
conf.tokenValiditySeconds(86400);
})
.build();
}
}
indexController.java
:
package com.study.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@GetMapping("/login")
public String login(){
return "login";
}
@GetMapping("/")
public String index(){
return "index";
}
}
UserMapper.java
:
package com.study.mapper;
import com.study.entity.Account;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from user where username = #{username}")
Account findByUsername(String username);
}
UserServiceImpl.java
:
package com.study.service.Impl;
import com.study.entity.Account;
import com.study.mapper.UserMapper;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Resource
UserMapper mapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = mapper.findByUsername(username);
if (account == null){
throw new UsernameNotFoundException("User not found");
}
return User
.withUsername(account.getUsername())
.password(account.getPassword())
.roles(account.getRole())
.build();
}
}
3
BorrowController.java
:
package com.study.controller;
import com.study.service.BookService;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class BorrowController {
@Resource
BookService service;
@Resource
UserService userService;
@GetMapping({"/borrow", "/"})
public String borrow(Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
model.addAttribute("nickname", user.getUsername());
model.addAttribute("borrow_list", service.getBorrowList());
model.addAttribute("book_count", service.getBookList().size());
model.addAttribute("student_count", userService.getStudentList().size());
return "borrow";
}
}
IndexController.java
:
package com.study.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@GetMapping("/login")
public String login(){
return "login";
}
}
Book.java
:
package com.study.entity;
import lombok.Data;
@Data
public class Book {
int id;
String title;
String desc;
double price;
}
Borrow.java
:
package com.study.entity;
import lombok.Data;
import java.util.Date;
@Data
public class Borrow {
int id;
int sid;
int bid;
Date time;
String bookName;
String studentName;
}
Student.java
:
package com.study.entity;
import lombok.Data;
@Data
public class Student {
int id;
String name;
int age;
int grade;
}
BookMapper.java
:
package com.study.mapper;
import com.study.entity.Book;
import com.study.entity.Borrow;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface BookMapper {
@Results({
@Result(column = "id", property = "id"),
@Result(column = "sid", property = "sid"),
@Result(column = "bid", property = "bid"),
@Result(column = "time", property = "time"),
@Result(column = "nane", property = "studentName"),
@Result(column = "title", property = "bookName")
})
@Select("""
select * from borrow left join student on borrow.sid = student.id
left join book on book.id = borrow.bid
""")
List<Borrow> getBorrowList();
@Insert("insert into borrow (sid, bid, time) values (#{sid}, #{bid}, NOW())")
void borrowBook(@Param("sid") int sid, @Param("bid") int bid);
@Delete("delete from borrow where id = #{id}")
void deleteBorrow(int id);
@Select("select * from book")
List<Book> getBookList();
@Delete("delete from book where id = #{id}")
void deleteBook(int id);
@Insert("insert into book (title, desc, price) values (#{title}, #{desc}, #{price})")
void addBook(@Param("title") String title, @Param("desc") String desc, @Param("price") double price);
}
userMapper.java
:
package com.study.mapper;
import com.study.entity.Account;
import com.study.entity.Student;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
@Select("select * from user where username = #{username}")
Account findByUsername(String username);
@Select("select * from student")
List<Student> getStudentList();
}
BookServiceImpl.java
:
package com.study.service.Impl;
import com.study.entity.Book;
import com.study.entity.Borrow;
import com.study.mapper.BookMapper;
import com.study.service.BookService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService {
@Resource
BookMapper mapper;
@Override
public List<Borrow> getBorrowList() {
return mapper.getBorrowList();
}
@Override
public List<Book> getBookList() {
return mapper.getBookList();
}
}
UserServiceImpl.java
:
package com.study.service.Impl;
import com.study.entity.Account;
import com.study.entity.Student;
import com.study.mapper.UserMapper;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Resource
UserMapper mapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = mapper.findByUsername(username);
if (account == null){
throw new UsernameNotFoundException("User not found");
}
return User
.withUsername(account.getUsername())
.password(account.getPassword())
.roles(account.getRole())
.build();
}
@Override
public List<Student> getStudentList() {
return mapper.getStudentList();
}
}
BookService.java
:
package com.study.service;
import com.study.entity.Book;
import com.study.entity.Borrow;
import java.util.List;
public interface BookService {
List<Borrow> getBorrowList();
List<Book> getBookList();
}
UserService.java
:
package com.study.service;
import com.study.entity.Student;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.List;
public interface UserService extends UserDetailsService {
List<Student> getStudentList();
}
4
header.html
:
...
</div>
<div class="header-controls">
<div class="user-info-wrapper header-links">
<a href="javascript:void(0);" class="user-info">
<img src="static/picture/user.jpg" alt="" class="user-img">
<div class="blink-animation">
<span class="blink-circle"></span>
<span class="main-circle"></span>
</div>
</a>
<div class="user-info-box">
<div class="drop-down-header">
<h4 th:text="${nickname}"></h4>
<p>Welcome</p>
</div>
<ul>
<li>
<a href="/doLogout">
<i class="fas fa-sign-out-alt"></i> Logout
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</header>
SecurityConfiguration.java
:
package com.study.cofig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@EnableWebSecurity
@Configuration
public class SecurityConfiguration {
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public PersistentTokenRepository tokenRepository(DataSource dataSource){
JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
// repository.setCreateTableOnStartup(true);
repository.setDataSource(dataSource);
return repository;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,
PersistentTokenRepository repository) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/static/**").permitAll();
auth.anyRequest().authenticated();
})
.formLogin(conf -> {
conf.loginPage("/login");
conf.loginProcessingUrl("/doLogin");
conf.defaultSuccessUrl("/");
conf.permitAll();
})
.logout(conf -> {
conf.logoutUrl("/doLogout");
conf.logoutSuccessUrl("/login");
conf.permitAll();
})
.csrf(AbstractHttpConfigurer::disable)
.rememberMe(conf -> {
conf.tokenRepository(repository);
conf.tokenValiditySeconds(86400);
})
.build();
}
}
BookController.java
:
package com.study.controller;
import com.study.service.BookService;
import jakarta.annotation.Resource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.ArrayList;
@Controller
public class BookController {
@Resource
BookService service;
@GetMapping("/books")
public String books(Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
model.addAttribute("nickname", user.getUsername());
model.addAttribute("book_list", service.getBookList().keySet());
model.addAttribute("book_list_status", new ArrayList<>(service.getBookList().values()));
return "books";
}
@GetMapping("/add-book")
public String addBook() {
return "add-book";
}
@PostMapping("/add-book")
public String addBook(String title, String desc, double price) {
service.addBook(title, desc, price);
return "redirect:/books";
}
}
BorrowController.java
:
package com.study.controller;
import com.study.service.BookService;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class BorrowController {
@Resource
BookService service;
@Resource
UserService userService;
@GetMapping({"/borrow", "/"})
public String borrow(Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
model.addAttribute("nickname", user.getUsername());
model.addAttribute("borrow_list", service.getBorrowList());
model.addAttribute("book_count", service.getBookList().size());
model.addAttribute("student_count", userService.getStudentList().size());
return "borrow";
}
@GetMapping("/add-borrow")
public String addBorrow(Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
model.addAttribute("nickname", user.getUsername());
model.addAttribute("book_list", service.getAvailableBooks());
model.addAttribute("student_list", userService.getStudentList());
return "add-borrow";
}
@PostMapping("/add-borrow")
public String addBorrow(int student, int book) {
service.addBorrow(student, book);
return "redirect:/borrow";
}
@GetMapping("/return-book")
public String returnBook(int id) {
service.returnBook(id);
return "redirect:/borrow";
}
}
BookMapper.java
:
package com.study.mapper;
import com.study.entity.Book;
import com.study.entity.Borrow;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface BookMapper {
@Results({
@Result(column = "id", property = "id"),
@Result(column = "sid", property = "sid"),
@Result(column = "bid", property = "bid"),
@Result(column = "time", property = "time"),
@Result(column = "name", property = "studentName"),
@Result(column = "title", property = "bookName")
})
@Select("""
select * from borrow left join student on borrow.sid = student.id
left join book on book.id = borrow.bid
""")
List<Borrow> getBorrowList();
@Insert("insert into borrow (sid, bid, time) values (#{sid}, #{bid}, NOW())")
void borrowBook(@Param("sid") int sid, @Param("bid") int bid);
@Delete("delete from borrow where id = #{id}")
void deleteBorrow(int id);
@Select("select * from book")
List<Book> getBookList();
@Delete("delete from book where id = #{id}")
void deleteBook(int id);
@Insert("insert into book (title, desc, price) values (#{title}, #{desc}, #{price})")
void addBook(@Param("title") String title, @Param("desc") String desc, @Param("price") double price);
}
UserMapper.java
:
package com.study.mapper;
import com.study.entity.Account;
import com.study.entity.Student;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper {
@Select("select * from user where username = #{username}")
Account findByUsername(String username);
@Select("select * from student")
List<Student> getStudentList();
}
BookServiceImpl.java
:
package com.study.service.Impl;
import com.study.entity.Book;
import com.study.entity.Borrow;
import com.study.mapper.BookMapper;
import com.study.service.BookService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class BookServiceImpl implements BookService {
@Resource
BookMapper mapper;
@Override
public List<Borrow> getBorrowList() {
return mapper.getBorrowList();
}
@Override
public Map<Book, Boolean> getBookList() {
Set<Integer> set = new HashSet<>();
this.getBorrowList().forEach(borrow -> set.add(borrow.getBid()));
Map<Book, Boolean> map = new LinkedHashMap<>();
mapper.getBookList().forEach(book -> map.put(book, set.contains(book.getId())));
return map;
}
@Override
public void addBorrow(int sid, int bid) {
mapper.borrowBook(sid, bid);
}
@Override
public void returnBook(int id) {
mapper.deleteBorrow(id);
}
@Override
public List<Book> getAvailableBooks() {
Set<Integer> set = new HashSet<>();
this.getBorrowList().forEach(borrow -> set.add(borrow.getBid()));
return mapper.getBookList()
.stream()
.filter(book -> !set.contains(book.getId()))
.toList();
}
@Override
public void addBook(String title, String desc, double price) {
mapper.addBook(title, desc, price);
}
}
UserServiceImpl.java
:
package com.study.service.Impl;
import com.study.entity.Account;
import com.study.entity.Student;
import com.study.mapper.UserMapper;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Resource
UserMapper mapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Account account = mapper.findByUsername(username);
if (account == null){
throw new UsernameNotFoundException("User not found");
}
return User
.withUsername(account.getUsername())
.password(account.getPassword())
.roles(account.getRole())
.build();
}
@Override
public List<Student> getStudentList() {
return mapper.getStudentList();
}
}
BookService.java
:
package com.study.service;
import com.study.entity.Book;
import com.study.entity.Borrow;
import java.util.List;
import java.util.Map;
public interface BookService {
List<Borrow> getBorrowList();
List<Book> getAvailableBooks();
Map<Book, Boolean> getBookList();
void addBorrow(int sid, int bid);
void returnBook(int id);
void addBook(String title, String desc, double price);
}
UserService.java
:
package com.study.service;
import com.study.entity.Student;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.List;
public interface UserService extends UserDetailsService {
List<Student> getStudentList();
}
5
StudentController.java
:
package com.study.controller;
import com.study.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class StudentController {
@Resource
UserService service;
@GetMapping("/student")
public String student(Model model) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
model.addAttribute("nickname", user.getUsername());
model.addAttribute("student_list", service.getStudentList());
return "student";
}
}
Student.java
:
package com.study.entity;
import lombok.Data;
@Data
public class Student {
int id;
String name;
String sex;
int grade;
}
6
MysqlListener.java
:
package com.study.listener;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
public class MysqlListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
try{
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()){
DriverManager.deregisterDriver(drivers.nextElement());
}
} catch (SQLException e){
e.printStackTrace();
}
}
}