成果显示
list界面
add界面
edit界面
delete界面
同时还包含了上一页,下一页,跳转页面,显示页面数,记录数,页面数等等。
实验步骤
首先要添加依赖在pom.xml中
<!-- Spring Data JPA 依赖(重要) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL 驱动(重要) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
然后进行配置在application.properities
#自动生成数据库表(关键)
spring.jpa.hibernate.ddl-auto=update
#mysql数据库连接配置(非常重要)
spring.datasource.url = jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai
spring.datasource.username = root
spring.datasource.password = root
#mysql数据库驱动程序(重要)
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#jpa配置:在控制台显示Hibernate的sql(可选)
spring.jpa.show-sql = true
#其他配置:关闭Thymeleaf 的缓存
spring.thymeleaf.cache = false
创建实体类
package com.example.demo.entity;
import com.example.demo.page.PageSelect;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity //声明类为实体类,不能掉!
@Data
public class User extends PageSelect implements Serializable {
@Id //表示该属性作为表的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //设定主键生成策略:IDENTITY表示由数据库自动生成
private Long id; // Long 对应MySQL数据库 bigint 类型
@Column(nullable = false, unique = true, length = 20) //列字段,非空且唯一,字符最大长度20
private String username;
@Column(nullable = false, length = 20) //列字段,非空,字符最大长度20
private String password;
@Column(nullable = false)
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date regdate; // Date 对应MySQL数据库 datetime 类型
@Column(nullable = false) //状态:0离线,1在线等
private int status;
// getter/setter 略
public void setStatus(int status) {
this.status = status;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
}
创建用来分页的类
package com.example.demo.page;
public class PageSelect {
//当前页
private int pageIndex = 1;
//总记录数
private int totalRecordSum;
//每页记录数
private int pageSize;
//总页数
private int totalPageSum;
//每页多少数量
private int recordNum;
public int getRecordNum() {
return recordNum;
}
public void setRecordNum(int recordNum) {
this.recordNum = recordNum;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public int getTotalRecordSum() {
return totalRecordSum;
}
public void setTotalRecordSum(int totalRecordSum) {
this.totalRecordSum = totalRecordSum;
}
public int getPageSize() {
this.pageSize = 5;
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPageSum() {
//获得总页数
this.totalPageSum = (getPageSize() + getTotalRecordSum() - 1) / getPageSize();
return totalPageSum;
}
public void setTotalPageSum(int totalPageSum) {
this.totalPageSum = totalPageSum;
}
//得到起始页面数
public int getStartNum(){
return (getPageIndex() - 1) * getPageSize();
}
}
创建控制器
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.page.PageSelect;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Controller
public class UserController {
@Autowired // 自动注入( 无需自己new对象:UserService userService=new UserServiceImp(); )
private UserService userService;
PageSelect page = new PageSelect();
@RequestMapping("/")
public String index() {
return "redirect:/list"; //请求转发到 /list
}
@RequestMapping("/list")
public String list(Model model) {
List<User> users = new ArrayList<>();
List<User> users1 = userService.getUserList();
page.setTotalRecordSum(userService.totalCount());
int endPageNum = page.getStartNum() + page.getPageSize() - 1;
if (endPageNum + 1 <= page.getTotalRecordSum()) {
for (int i = page.getStartNum(); i <= endPageNum; i++) {
User user = users1.get(i);
users.add(user);
page.setRecordNum(page.getPageSize());
}
} else {
for (int i = page.getStartNum(); i < page.getTotalRecordSum(); i++) {
User user = users1.get(i);
users.add(user);
page.setRecordNum(page.getTotalRecordSum() - page.getStartNum());
}
}
model.addAttribute("users", users);
model.addAttribute("page",page);
return "user/list";
}
@PostMapping("/next")
public String change() {
if (page.getPageIndex() + 1 > page.getTotalPageSum()) return "redirect:/list";
page.setPageIndex(page.getPageIndex() + 1);
return "redirect:/list";
}
@PostMapping("/last")
public String last() {
if (page.getPageIndex() - 1 <= 0) return "redirect:/list";
page.setPageIndex(page.getPageIndex() - 1);
return "redirect:/list";
}
@PostMapping("/select")
public String select(@RequestParam("pageIndex") int pageIndex) {
page.setPageIndex(pageIndex);
return "redirect:/list";
}
@RequestMapping("/add")
public String add() {
return "user/add"; //打开创建user界面
}
@PostMapping("/add")
public String add(User user) { //保存新创建的user
user.setRegdate(new Date());
user.setStatus(0);
userService.save(user);
return "redirect:/list";
}
@RequestMapping("/edit/{id}")
public String edit(Model model, @PathVariable Long id) {
User user = userService.findUserById(id);
model.addAttribute("user", user);
return "user/edit"; //打开编辑user界面
}
@PostMapping("/edit")
public String edit(User user) { //保存编辑好的user
userService.edit(user);
return "redirect:/list";
}
@RequestMapping("/delete/{id}")
public String delete(Model model, @PathVariable Long id) {
User user = userService.findUserById(id);
model.addAttribute("user", user);
return "user/delete"; //删除之前道个别(看看数据)
}
@PostMapping("/delete/{id}")
public String delete(@PathVariable Long id) { //确认删除
userService.delete(id);
return "redirect:/list";
}
}
创建DAO层
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import javax.transaction.Transactional;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// JpaRepository 自动实现了很多内置的CURD方法
// 这些方法以后可直接调用,例如:
// List<T> findAll();
// Optional<T> findById(id);
// User save(user);
// void delete(user);
// void deleteById(id);
// long count();
// boolean existsById(id);
List<User> findByusername(String username);
@Transactional
long deleteByusername(String username);
@Query(value="select * from user where id = (select max(id) from user)", nativeQuery = true)
User getMaxIduser();
@Query(value = "select * from user", nativeQuery = true)
List<User> selectAll();
@Query(value = "select * from user where username like: name", nativeQuery = true)
List<User> selectUserByParam(@Param("name") String name);
@Query(value = "select count(*) from user" , nativeQuery = true)
int totalCount();
}
创建服务层的接口
package com.example.demo.service;
import com.example.demo.entity.User;
import java.util.List;
public interface UserService {
public List<User> getUserList();
public User findUserById(Long id);
public void save(User user);
public void edit(User user);
public void delete(Long id);
public int totalCount();
}
实现接口
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.page.PageSelect;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.jws.soap.SOAPBinding;
import java.util.List;
@Service //声明类为服务实现类
public class UserServiceImp implements UserService{
@Autowired // 自动注入(不需要自己new对象)
private UserRepository userRepository;
@Override
public List<User> getUserList() {
return userRepository.findAll(); //直接调用Repository内置的CURD方法
}
@Override
public User findUserById(Long id) {
return userRepository.findById(id).get(); //直接调用Repository内置的CURD方法
//findById(id)返回的是Optional类(一个可以为null的容器对象)
//如果Optional容器中存在对象,则调用get()方法返回该对象
}
@Override
public void save(User user) {
userRepository.save(user); //直接调用Repository内置的CURD方法
}
@Override
public void edit(User user) { //保存修改的对象
userRepository.save(user); //直接调用Repository内置的CURD方法
}
@Override
public void delete(Long id) {
userRepository.deleteById(id); //直接调用Repository内置的CURD方法
}
@Override
public int totalCount() {
return userRepository.totalCount();
}
}
显示层
add.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>新建用户</title>
<script th:src="@{/webjars/jquery/jquery.min.js}"></script>
<script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container">
<h3 class="col-sm-offset-1">添加用户</h3>
<div>
<form class="form-horizontal" th:action="@{/add}" method="post">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-6">
<input type="text" class="form-control" name="username" id="username" placeholder="用户名"/>
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-6">
<input type="password" class="form-control" name="password" id="password" placeholder="密码"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-6">
<input type="submit" value="保存" class="btn btn-info"/>
<input type="reset" value="重填" class="btn btn-info col-sm-offset-1"/>
<a th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
delete.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>删除用户</title>
<script th:src="@{/webjars/jquery/jquery.min.js}"></script>
<script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container">
<h3 class="col-sm-offset-1">确认删除用户</h3>
<div>
<form class="form-horizontal" th:action="@{/delete/{id}(id=${user.id})}" th:object="${user}" method="post">
<input type="hidden" name="id" th:value="*{id}"/> <!--id值隐藏不修改-->
<div class="form-group">
<label class="col-sm-2 control-label">编号</label>
<div class="col-sm-6">
<label class="control-label" th:text="*{id}">id</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">用户名</label>
<div class="col-sm-6">
<label class="control-label" th:text="*{username}">username</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-6">
<label class="control-label" th:text="*{password}">password</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">注册日期</label>
<div class="col-sm-6">
<label class="control-label" th:text="*{#dates.format(regdate,'yyyy-MM-dd HH:mm:ss')}">regdate</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">状态</label>
<div class="col-sm-6">
<label class="control-label" th:text="*{status}">status</label>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-6">
<input type="submit" value="确认删除" class="btn btn-info"/>
<a href="/list" th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
edit.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>user</title>
<script th:src="@{/webjars/jquery/jquery.min.js}"></script>
<script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
<script th:src="@{/webjars/momentjs/min/moment-with-locales.js}"></script>
<link th:href="@{/webjars/Eonasdan-bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css}" rel="stylesheet">
<script th:src="@{/webjars/Eonasdan-bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js}"></script>
</head>
<body class="container">
<br/>
<h1>修改用户</h1>
<br/><br/>
<div class="with:80%">
<form class="form-horizontal" th:action="@{/edit}" th:object="${user}" method="post">
<input type="hidden" name="id" th:value="*{id}"/> <!--id值隐藏不修改,编辑时必须带上id值-->
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-6">
<input type="text" class="form-control" name="username" id="username" th:value="*{username}"
placeholder="用户名"/>
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-6">
<input type="text" class="form-control" name="password" id="password" th:value="*{password}"
placeholder="密码"/>
</div>
</div>
<!--日历时间框-->
<div class="form-group">
<label for="regdate" class="col-sm-2 control-label">注册日期</label>
<div class="col-sm-6">
<div class="input-group" id='datetimepicker'>
<input type='text' class="form-control" id="regdate" name="regdate"/>
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
</div>
</div>
<div class="form-group">
<label for="status" class="col-sm-2 control-label">用户状态</label>
<div class="col-sm-6">
<input type="text" class="form-control" name="status" id="status" th:value="*{status}"
placeholder="用户状态"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-6">
<input type="submit" value="保存" class="btn btn-info"/>
<a href="/list" th:href="@{/list}" class="btn btn-info col-sm-offset-1">返回</a>
</div>
</div>
</form>
</div>
<script th:inline="javascript">
$(function () {
$('#datetimepicker').datetimepicker({
format: 'YYYY-MM-DD HH:mm:ss', //HH是24小时制,hh是12小时制
locale: moment.locale('zh-cn'), //中文日历
defaultDate: /*[[${user.regdate}]]*/"1990-1-1"
});
});
</script>
</body>
</html>
list.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<script th:src="@{/webjars/jquery/jquery.min.js}"></script>
<script th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}" rel="stylesheet">
</head>
<body>
<div class="container">
<h2>用户列表</h2>
<div class="with:80%">
<div style="margin: 20px;">
<a href="/add" th:href="@{/add}" class="btn btn-info">添加用户</a>
</div>
<table class="table table-hover">
<tr>
<th>用户id</th> <th>用户名</th> <th>密码</th> <th>创建时间</th>
<th>用户状态</th> <th>操作</th> <th>操作</th>
</tr>
<tr th:each="user : ${users}">
<th scope="row" th:text="${user.id}">1</th>
<td th:text="${user.username}">neo</td>
<td th:text="${user.password}">123456</td>
<td th:text="${#dates.format(user.regdate,'yyyy/MM/dd HH:mm:ss')}">2020/11/11</td>
<td th:text="${user.status}">0</td>
<td><a th:href="@{/edit/{id}(id=${user.id})}">编辑</a></td>
<td><a th:href="@{/delete/{id}(id=${user.id})}">删除</a></td>
</tr>
</table>
<table>
<tr>
<td>
<form th:action="@{/last}" method="post">
<button>上一页</button>
</form>
</td>
<td>    </td>
<td>
<form class="form-horizontal" th:action="@{/next}" method="post">
<button>下一页</button>
</form>
</td>
</tr>
</table>
<br>
<form class="form-horizontal" th:action="@{/select}" method="post">
<div class="form-group">
<label for="pageIndex">页数</label>
<div class="col-sm-1">
<input type="text" class="form-control" name="pageIndex" id="pageIndex" th:value="${page.pageIndex}" placeholder="页数"/>
<input type="submit" value="传送" class="btn btn-info"/>
<br>
</div>
</div>
</form>
<div>
<h3>该页记录数为:<h4 th:text="${page.recordNum}"></h4></h3>
</div>
<div>
<h3>总页数为:<h4 th:text="${page.totalPageSum}"></h4></h3>
</div>
<div>
<h3>总记录数为:<h4 th:text="${page.totalRecordSum}"></h4></h3>
</div>
</div>
</div>
</body>
</html>