JPA技术实践(包含分页的代码实现)

成果显示

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配置:在控制台显示Hibernatesql(可选)
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>&nbsp&nbsp&nbsp&nbsp</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>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值