1.环境准备

  • JDK1.8
  • Maven3.6.0
  • SQLServer 2008R2
  • IDEA2020.1

2.数据库准备

-- 建库
CREATE DATABASE school;
-- 使用库
USE school;
-- 建表
create table student
(sno varchar(9) not null,sage int,sdept varchar(20),sname varchar(20) not null,ssex varchar(2),primary key (sno));-- 插入数据
INSERT INTO student VALUES('032020460',20,'CS','killer','男'),('032020441',19,'CS','武松','男'),('032020451',21,'CS','李逵','男'),('032020450',23,'CS','宋江','男'),('032020420',20,'CS','晁盖','男'),('032020461',22,'CS','王子鸣','男'),('032020432',21,'CS','张一鸣','男'),('032020430',19,'CS','曹操','男'),('032020431',18,'CS','张红','女'),('032020428',22,'CS','王佳','女'),('032020421',18,'CS','李俊杰','男'),('032020422',19,'CS','王小辉','男'),('032020434',18,'CS','赵一','男'),('032020443',21,'CS','张慧','女'),('032020455',24,'CS','陈佳','女'),('032020456',23,'CS','李惠','女'),('032020458',22,'CS','周涛','男'),('032020459',21,'CS','张明','男'),('032020465',20,'CS','张蓓','女'),('032020464',21,'CS','王光娜','女'),('021830463',20,'MA','刘晓宇','男'),('021830420',20,'MA','张家辉','男'),('021830461',22,'MA','王小宇','男'),('021830432',21,'MA','周泰','男'),('021830430',19,'MA','宋义进','男'),('021830431',18,'MA','张嘉雯','女'),('021830428',22,'MA','陈小文','女'),('021830421',18,'MA','刘涛','男'),('021830422',19,'MA','王家辉','男'),('021830434',18,'MA','江涛','男'),('021830443',21,'MA','刘晓晓','女'),('021830455',24,'MA','周惠','女'),('021830456',23,'MA','李婷婷','女'),('021830453',22,'MA','王嘉尔','男'),('021830469',21,'MA','张角','男'),('021830411',20,'MA','秦娇','女'),('021830412',21,'MA','王玉','女'),('021830466',20,'MA','张明杰','男'),('021830436',18,'MA','江涛','男'),('021830468',21,'MA','刘晓晓','女'),('021830457',24,'MA','周惠','女'),('021830439',23,'MA','李婷婷','女'),('021830458',22,'MA','王嘉尔','男'),('021830459',21,'MA','张角','男'),('021830465',20,'MA','秦娇','女'),('021830464',21,'MA','王玉','女'),('021830445',20,'MA','张明杰','男'),('011920434',18,'ME','王杰','男'),('011920443',21,'ME','李晓','女'),('011920455',24,'ME','张娇娇','女'),('011920456',23,'ME','田婷婷','女'),('011920458',22,'ME','尔东升','男'),('011920459',21,'ME','周角','男'),('011920465',20,'ME','倪妮','女'),('011920464',21,'ME','李胜男','女'),('011920463',20,'ME','张杰','男')

3.创建SpringBoot项目

创建项目比较简单,这里只给出maven,pom文件依赖。

<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> </parent><groupId>cn.yu</groupId><artifactId>sm</artifactId><version>0.0.1-SNAPSHOT</version><name>sm</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- mssql-jdbc --><dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>6.1.0.jre8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

项目结构如下图:

图中的static中的error为存放的错误页面,css、js、fonts内容为bootstrap的源码文件。
项目配置文件为application.yuml,内容如下

server:port: 8080servlet:context-path: /sm
spring:datasource:url: jdbc:sqlserver://localhost:1433;databaseName=schoolusername: sapassword: 1234driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriverthymeleaf:prefix: classpath:/templates/suffix: .htmlmode: HTMLencoding: UTF-8cache: falsejpa:hibernate:ddl-auto: updateshow-sql: true

使用的数据库为SQLServer

4.启动类

SmApplication.java

package cn.yu.sm;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@SpringBootApplication
public class SmApplication {public static void main(String[] args) {SpringApplication.run(SmApplication.class, args);}
}

5.实体类

实体类Student.java

package cn.yu.sm.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;/*** 学生实体类*/
@Table(name = "student")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Student {// 学号@Id@Column(name = "sno",length = 9)private String sno;// 姓名@Column(name = "sname",length = 20)private String sname;// 年龄@Column(name = "sage",length = 11)private Integer sage;// 性别@Column(name = "ssex",length = 2)private String ssex;// 系别@Column(name = "sdept",length = 20)private String sdept;
}

6.dao层

StudentRepository.java

package cn.yu.sm.dao;import cn.yu.sm.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface StudentRepository extends JpaRepository<Student,String> {}

7.service层

package cn.yu.sm.service;import cn.yu.sm.entity.Student;
import org.springframework.data.domain.Page;/*** student 相关操作接口*/
public interface StudentService {// 分页查询学生信息Page<Student> getStudentPage(int pageNum,int pageSize);// 根据学生学号查询学生信息Student findStudentBySno(String sno);// 保存学生信息void save(Student student);// 更新学生信息void update(Student student);// 根据学号删除学生void delete(String sno);// 统计学生数量long count();
}

StudentServiceImpl.java

package cn.yu.sm.service.impl;import cn.yu.sm.dao.StudentRepository;
import cn.yu.sm.entity.Student;
import cn.yu.sm.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;@Service
public class StudentServiceImpl implements StudentService {@AutowiredStudentRepository studentRepository;// 分页查询学生信息实现@Overridepublic Page<Student> getStudentPage(int pageNum, int pageSize) {// 创建一个排序对象 根据学生年龄升序Sort sort = Sort.by(Sort.Direction.ASC,"sage");// 创建分页对象PageRequest pageable = PageRequest.of(pageNum, pageSize, sort);// 调用dao 分页查询Page<Student> students = studentRepository.findAll(pageable);return students;}// 根据学号查询学生信息实现@Overridepublic Student findStudentBySno(String sno) {return studentRepository.findById(sno).get();}// 保存学生信息实现@Overridepublic void save(Student student) {studentRepository.save(student);}// 更新学生信息实现@Overridepublic void update(Student student) {studentRepository.save(student);}// 根据学号删除学生信息实现@Overridepublic void delete(String sno) {studentRepository.deleteById(sno);}// 统计学生总数@Overridepublic long count() {return studentRepository.count();}
}

8.controller层

StudentController.java

package cn.yu.sm.controller;import cn.yu.sm.entity.Student;
import cn.yu.sm.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Iterator;@Controller
public class StudentController {@AutowiredStudentService studentService;// 处理 / 请求@RequestMapping("/")public String index(){return "redirect:/list";}// 处理分页请求@RequestMapping("/list")public String list(Model model,@RequestParam(value = "pageNum", defaultValue = "0") int pageNum,@RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {System.out.println("======分页查询========");Page<Student> students = studentService.getStudentPage(pageNum, pageSize);System.out.println("总页数:" + students.getTotalPages());System.out.println("当前页:" + pageNum);// 打印数据System.out.println("分页数据如下");Iterator<Student> iterator = students.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}// 统计学生数量long count = studentService.count();// 将数据组装到模型中model.addAttribute("students",students);model.addAttribute("cnt",count);return "student/list";}// 处理删除请求@RequestMapping("/delete")public String delete(String sno){studentService.delete(sno);return "redirect:/";}// 处理添加请求@RequestMapping("/toAdd")public String toAdd(Model model){model.addAttribute("isUpdate",false);return "student/update";}// 处理修改请求@RequestMapping("/toEdit")public String toEdit(Model model,String sno){// 查询学生信息Student student = studentService.findStudentBySno(sno);// 封装数据model.addAttribute("student",student);model.addAttribute("isUpdate",true);return "student/update";}// 添加学生@RequestMapping("/add")public String add(Student student){studentService.save(student);return "redirect:/";}
}

9.utils工具类

package cn.yu.sm.utils;import java.util.HashMap;
import java.util.Map;/*** 根据系简写 获取系的中文名称*/
public class DeptUtils {private static Map<String,String> depts = new HashMap<>();static {depts.put("CS","计算机系");depts.put("PHY","物理系");depts.put("MA","数学系");depts.put("ME","医学系");depts.put("CH","中文系");depts.put("JD","法学系");depts.put("ART","艺术系");}public static String getName(String dept){return depts.get(dept);}
}

10.前端

在resource目录下的templates目录下创建一个student目录,然后创建list.html用于展示学生信息,update.list为修改和添加学生信息。

bootstrap的相关文件可以到bootstrap官网下载。

list.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"/><title>学生列表</title><link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link><style>th {text-align: center;}</style>
</head>
<body class="container">
<br/>
<div style="text-align: center;color: #4cae4c;"><h1>学生列表</h1>
</div>
<br/>
<hr/>
<div>学生总数:<span th:text="${cnt}"></span><a style="float: right;" href="/sm/toAdd" th:href="@{/toAdd}" class="btn btn-success btn-sm">添加</a>
</div>
<div class="with:80%" style="text-align: center;"><table class="table table-bordered"><thead><tr><th>#</th><th>学号</th><th>姓名</th><th>年龄</th><th>性别</th><th>系别</th><th>操作</th></tr></thead><tbody><tr th:each="student : ${students}"><th scope="row" th:text="${studentStat.index + 1}">1</th><td th:text="${student.sno}"></td><td th:text="${student.sname}"></td><td th:text="${student.sage}"></td><td th:text="${student.ssex}"></td><td th:text="${T(cn.yu.sm.utils.DeptUtils).getName(student.sdept)}"></td><td><a class="btn btn-sm btn-warning" th:href="@{/toEdit(sno=${student.sno})}">修改</a><a class="btn btn-sm btn-danger" th:href="@{/delete(sno=${student.sno})}">删除</a></td></tr></tbody></table>
</div><div class="modal-footer"><ul class="pagination pagination-sm"><!--<li><select><a th:href="'/sm/list?pageNum=0&pageSize=5'"><option>5</option></a><a th:href="'/sm/list?pageNum=0&pageSize=10'"><option>10</option></a><a th:href="'/sm/list?pageNum=0&pageSize=15'"><option>15</option></a><a th:href="'/sm/list?pageNum=0&pageSize=20'"><option>20</option></a><a th:href="'/sm/list?pageNum=0&pageSize=30'"><option>30</option></a><a th:href="'/sm/list?pageNum=0&pageSize=40'"><option>40</option></a><a th:href="'/sm/list?pageNum=0&pageSize=50'"><option>50</option></a></select></li>--><!-- 首页 --><li><a th:href="'/sm/list?pageNum=0'">首页</a></li><!-- 上一页 --><li th:if="${students.hasPrevious()}"><a th:href="'/sm/list?pageNum=' + ${students.previousPageable().getPageNumber()}" th:text="上一页"></a></li><!-- 中间页 --><li th:each="pageNum:${#numbers.sequence(0, students.getTotalPages() - 1)}"><a th:href="'/sm/list?pageNum=' + ${pageNum}" th:text="${pageNum + 1}"th:if="${pageNum ne students.pageable.getPageNumber()}"></a><a th:href="'/sm/list?pageNum=' + ${pageNum}" th:text="${pageNum + 1}"th:if="${pageNum eq students.pageable.getPageNumber()}"th:style="'font-weight:bold;background: #6faed9;'"></a></li><!-- 下一页 --><li th:if="${students.hasNext()}"><a th:href="'/sm/list?pageNum=' + ${students.nextPageable().getPageNumber()}" th:text="下一页"></a></li><!-- 尾页 --><li><a th:href="'/sm/list?pageNum=' + ${students.getTotalPages() - 1}">尾页</a></li></ul>
</div>
</body>
</html>

update.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><link rel="stylesheet" th:href="@{/css/bootstrap.css}"><title th:text="${isUpdate?'修改学生信息':'添加学生'}"></title>
</head>
<body><div style="text-align: center;color: #4cae4c;" class="top"><h1 th:text="${isUpdate?'修改学生信息':'添加学生'}"></h1></div><hr><div style="margin: 0 auto;width: 30%;"><form th:action="@{/add}" method="post"><div class="form-group"><label for="sno">学号</label><input type="text" th:value="${student!=null?student.sno:''}" class="form-control" id="sno" name="sno" placeholder="032020..."></div><div class="form-group"><label for="sname">姓名</label><input type="text" th:value="${student!=null?student.sname:''}" class="form-control" id="sname" name="sname" placeholder="姓名"></div><div class="form-group"><label for="sage">年龄</label><input type="text" th:value="${student!=null?student.sage:''}" class="form-control" id="sage" name="sage" placeholder="18"></div><div class="form-group"><label>性别</label><br><label class="radio-inline"><input type="radio" th:checked="${student!=null?#strings.equals(student.ssex,'男'):false}" id="inlineRadio1" name="ssex" value="男"> 男</label><label class="radio-inline"><input type="radio" th:checked="${student!=null?#strings.equals(student.ssex,'女'):false}" id="inlineRadio2" name="ssex" value="女"> 女</label></div><div class="form-group"><label>系别</label><br><select name="sdept" class="form-control"><option value="CS"  th:selected="${student!=null?#strings.equals(student.sdept,'CS'):''}">计算机系</option><option value="PHY" th:selected="${student!=null?#strings.equals(student.sdept,'PHY'):''}">物理系</option><option value="MA"  th:selected="${student!=null?#strings.equals(student.sdept,'MA'):''}">数学系</option><option value="ME"  th:selected="${student!=null?#strings.equals(student.sdept,'ME'):''}">医学系</option><option value="CH"  th:selected="${student!=null?#strings.equals(student.sdept,'CH'):''}">中文系</option><option value="JD"  th:selected="${student!=null?#strings.equals(student.sdept,'JD'):''}">法学系</option><option value="ART" th:selected="${student!=null?#strings.equals(student.sdept,'ART'):''}">艺术系</option></select></div><div style="text-align: center;"><button th:text="${isUpdate?'修改':'添加'}" type="submit" class="btn btn-default btn-success">添加</button>&nbsp;&nbsp;&nbsp;<button th:if="${!isUpdate}" type="reset" class="btn btn-default btn-warning">重置</button></div></form></div>
</body>
</html>

10.运行效果

列表页http://localhost:8080/sm/list

添加学生http://localhost:8080/sm/toAdd

修改学生http://localhost:8080/sm/toEdit?sno=021830421

项目源码已经上传码云,地址为:https://gitee.com/wang_yu666/springboot-curd
注意码云上的项目使用的数据库为MySQL5.7,在建表的时候需要设置字符集为utf8,不然插入中文时会出现无法插入的问题。

SpringBoot+SpringBootJPA+Thymeleaf实现基本CURD+分页相关推荐

  1. 【Springboot学习笔记】SpringBoot+Mybatis+Thymeleaf+Layui数据表单从零开始实现按条件模糊分页查询的方法

    [Springboot学习笔记]SpringBoot+Mybatis+Thymeleaf+Layui数据表单从零开始实现按条件模糊分页查询的方法 目录 1.搭建环境 1.1直接从网上下载SpringB ...

  2. springboot 、thymeleaf、pagehelper 、springsecurity实现 登录,用户认证,分页的前端使用妹子UI

    springboot  .thymeleaf.pagehelper .springsecurity 实现 登录,用户认证,分页的前端使用妹子UIhttp://tpl.amazeui.org/. 项目下 ...

  3. 基于springboot的生鲜门店配送管理系统(idea+springboot+html+thymeleaf)

    一.系统简介 本项目采用idea工具开发,html+springboot+mybatis+jquery+thymeleaf技术编写,数据库采用的是mysql,navicat开发工具. 系统一共分为5个 ...

  4. SpringBoot+Mybatis+thymeleaf实现增删改查

    一.今天用SpringBoot整合thymeleaf做一套增删改查 1.导入依赖 <dependency><groupId>org.mybatis.spring.boot< ...

  5. spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构

    原文作者:弥诺R 原文地址:http://www.minuor.com/147852147/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 写前说明 根据个人在各篇博文中看到的信息 ...

  6. thymeleaf 使用页面报错_异常处理-SpringBoot中thymeleaf对应前台页面大于号\小于号使用问题...

    浏览器报错信息: There was an unexpected error (type=Internal Server Error, status=500). Exception parsing d ...

  7. thymeleaf依赖_玩转SpringBoot集成 Thymeleaf 模版引擎

    随着互联网技术的发展,在前后端分离开发模式已经逐渐成为主流的今天,前后端技术的划分也越来越清晰,社会分工进一步细化,职业岗位也更加细分,慢慢开始就有了前端攻城狮和后端攻城狮,技术也进一步细分,出现了以 ...

  8. 玩转springboot:thymeleaf模板引擎入门程序

    一.前言 常用的模板引擎有:JSP.Velocity.Freemarker.Thymeleaf 但是,Springboot默认是不支持JSP的,默认使用thymeleaf模板引擎.而且,语法更简单,功 ...

  9. 九、SpringBoot集成Thymeleaf模板引擎

    Thymeleaf咋读!??? 呵呵,是不是一脸懵逼...哥用我的大学四级英文知识告诉你吧:[θaimlif]. 啥玩意?不会音标?...那你就这样叫它吧:"赛母李府",大部分中国 ...

  10. Springboot整合thymeleaf模板

    Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...

最新文章

  1. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
  2. sql的nvl()函数
  3. 2018java最新面试题
  4. MVC表示层框架——Velocity技术
  5. 字符串处理的基本方法
  6. c函数sscanf的高级技巧(二)
  7. 吴昊品命令行解释程序 Round 2 —— 一个带括号的四则运算表达式的解释器(逆波兰式RPN)...
  8. Atitit 跨语言跨平台ui界面 与界面分类 目录 1. 按照业务分类 1 1.1. 媒体类新闻类展示界面 1 1.2. 表单提交类 2 1.3. 查询类列表类(纯文列表,图文列表等 2 1.4.
  9. eplan步进电机_数控床子里电机用步进电机好还是伺服电机好?-工业支持中心-西门子中国...
  10. C语言经典面试题100道(附完整答案)
  11. 7教程统计意义_SPSS进行中介效应检验的实战操作与分析结果详解 ——【杏花开生物医药统计】...
  12. 幂级数 | 函数项级数、函数展开成幂级数(泰勒展开+麦克劳林展开)
  13. 云原生架构下的 API 网关实践: Kong (三)
  14. ds18b20程序c语言,单片机中使用DS18B20温度传感器C语言程序(参考6)
  15. 推荐一款美观的开源社区系统
  16. 蚂蚁区块链第8课 如何创建新的账户,获取私钥和identity标识?
  17. 只需三步!使用3DCG软件Blender制作时尚图片
  18. 年会邀请函如何制作?教你一分钟快速制作年会邀请函
  19. 局域网,广域网,城域网
  20. linux 操作系统root账号被锁定的两种解决方法

热门文章

  1. 【华为 OJ 】等差数列
  2. PHP没有工作经验简历怎么写,没有工作经验应届生如何写简历呢?
  3. 磁卡、条码卡、IC卡、ID卡基本知识
  4. 高速PCB设计系列基础知识67 | 尺寸与公差标注内容与通用知识
  5. 【话题:工作生活】2021年工作总结--这些人,那些事。
  6. ROS源代码之Publish底层实现(一)
  7. 台式计算机能不能安装蓝牙驱动,几个方法教你台式电脑怎么安装蓝牙
  8. Python with as用法详解
  9. Unity3d将资源打包成AssetBundle 读取后材质球丢失的问题
  10. 关于transition过渡的详解