本文以单表数据的增删改查业务为背景,介绍 Spring Boot 整合视图层Bootstrap框架、Thymeleaf 模板以及 Spring Data JPA等框架的实际应用。
1、技术选型:
Spring BootThymeleafBootstrapSpring Data JPAMySQL
2、需求描述:实现图书信息单表数据的增删改查任务。
3、项目演示效果如下图所示:
1. 项目初始化
第一步:在 IDEA 中新建空白的 SpringBoot 工程,勾选如下几项:
注:这些勾选的依赖都会在生成空白项目时,自动导入到 pom.xml 文件中。
第二步:在 pom.xml 文件中手动添加整合 Bootstrap 的相关依赖
org.webjars bootstrap 3.3.7 org.webjars jquery 3.1.1 net.sourceforge.nekohtml nekohtml
第三步:在 MySQL 数据库中创建一张书籍数据表(book),并录入若干条测试数据。
DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `price` decimal(10, 2) NULL DEFAULT NULL, `publishDate` date NULL DEFAULT NULL, `publishName` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `authorInfo` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
创建数据表对应的实体类 Student
package com.trainingl.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity(name = "book") //实体类映射数据表
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Column
private Double price;
@Column
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date publishDate;
@Column
private String publishName;
@Column
private String authorInfo;
}
2. 业务代码 2.1 Spring Boot 配置文件
在全局配置文件 resources/application.yml 中配置数据源信息、视图解析器以及端口号等相关配置等
server:
port: 8080
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: HTML5
encoding: UTF-8
datasource:
url: jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
说明:最后一行表示 Spring Data JPA 的命名策略,这里取消了字段驼峰式命名时,字段转化为下划线连接的方式。
2.2.1 数据持化层在路径 com > trainingl > repository 下创建接口 BookRepository;
Spring Data JPA 不是对 JPA 规范的具体实现,本身是一个抽象层,底层也是通过 Hibernate 实现的。开发者使用 Spring Data JPA 持久化框架时,并不需要自己编写 SQL 语句去实现,而是将数据表和实体类映射起来后,直接继承 JpaRepository 即可,该类内置了与增删改查业务相关的一些方法可供调用。
package com.trainingl.repository; import com.trainingl.entity.Book; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository //第一个泛型表示实体类的类型,第二个泛型表示主键类型 public interface BookRepository extends JpaRepository{ public Book getById(Long id); }
说明:第一个泛型表示实体类的类型,第二个泛型表示主键类型。
2.2.2 业务层创建业务层接口 BookService
package com.trainingl.service;
import com.trainingl.entity.Book;
import java.util.List;
public interface BookService {
public List findAll();
public Book findById(Long id);
public void save(Book book);
public void update(Book book);
public void deleteById(Long id);
}
业务层实现 BookServiceImpl
package com.trainingl.service.Impl;
import com.trainingl.entity.Book;
import com.trainingl.repository.BookRepository;
import com.trainingl.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookRepository bookRepository;
@Override
public List findAll() {
return bookRepository.findAll();
}
@Override
public Book findById(Long id) {
return bookRepository.getById(id);
}
@Override
public void save(Book book) {
bookRepository.save(book);
}
@Override
public void update(Book book) {
bookRepository.save(book);
}
@Override
public void deleteById(Long id) {
bookRepository.deleteById(id);
}
}
2.2.3 控制层
创建 BookController 控制器,主要负责接收客户端浏览器的请求与响应。这里接受的请求都是 POST 表单和 ... 标签触发的 GET 请求,至于 Ajax 异步请求在后面的实例学习中会进一步介绍。
package com.trainingl.controller;
import com.trainingl.entity.Book;
import com.trainingl.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping("/list")
public ModelAndView booklist(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("books",bookService.findAll());
return modelAndView;
}
//根据id查找数据库的记录
@GetMapping("/findById/{id}")
public ModelAndView findById(@PathVariable Long id){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("editor");
Book book = bookService.findById(id);
modelAndView.addObject("book",book);
return modelAndView;
}
@PostMapping("/save")
public String save(Book book){
bookService.save(book);
return "redirect:/book/list";
}
//根据id删除数据库的记录
@GetMapping("/delete/{id}")
public String deleteById(@PathVariable Long id){
bookService.deleteById(id);
return "redirect:/book/list";
}
//根据id修改数据记录
@PostMapping("/update")
public String updateById(Book book){
bookService.update(book);
return "redirect:/book/list";
}
}
2.2.4 视图层
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,⽤于开发响应式布局、移动设备优先的WEB 项⽬。简洁、直观、强悍的前端开发框架,html、css、javascript ⼯具集,让 web 开发更速、简单。这里我使用 Bootstrap + Thymeleaf 模板完成视图层网页的搭建与数据渲染操作。
1、数据列表首页 resources > templates > index.html
数据列表
2、更新信息页面 resources > templates > editor.html
修改图书信息
总结:本文使用 Spring Boot 可以非常方便地集成视图层、持久化层的相关框架,本实例基于常见的单表 CRUD 业务,采用了 Bootstrap 前端框架搭建页面结构,并通过 Thymeleaf 模板渲染数据,后端的数据库交互采用了 Spring 体系中的 Spring Data JPA,完成了对单表增删改查的场景实现。尽管还存在很多细节部分需要完善,但初步具备了基本的项目架构。



