本文以单表数据的增删改查业务为背景,介绍 Spring Boot 整合视图层Bootstrap框架、Thymeleaf 模板以及 Spring Data JPA等框架的实际应用。
1、技术选型:
Spring BootThymeleafBootstrapSpring Data JPAMySQL
2、需求描述:实现图书信息单表数据的增删改查任务。
3、项目演示效果如下图所示:
1. 项目初始化
第一步:在 IDEA 中新建空白的 SpringBoot 工程,勾选如下几项:
注:这些勾选的依赖都会在生成空白项目时,自动导入到 pom.xml 文件中。
第二步:在 pom.xml 文件中手动添加整合 Bootstrap 的相关依赖
org.webjars bootstrap3.3.7 org.webjars jquery3.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 ListfindAll(); 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 List2.2.3 控制层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); } }
创建 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
数据列表
评论列表(0条)