• springboot CRUD+分页(基于JPA规范)


    步骤一:JPA概念

      JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库
      真正干活的可能是Hibernate,TopLink等等实现了JPA规范的不同厂商,默认是Hibernate。

    步骤二:创建数据库和表

      创建个分类表,字段很简单,就id和name。

    create database test01;
    use test01;
    CREATE TABLE category_ (
      id int(11) NOT NULL AUTO_INCREMENT,
      name varchar(30),
      PRIMARY KEY (id)
    ) DEFAULT CHARSET=UTF8;

    步骤三:准备数据

    insert into category_ values(null,'家具');
    insert into category_ values(null,'电器');
    insert into category_ values(null,'服装');
    insert into category_ values(null,'化妆品');

    步骤四:基于springboot入门小demo

      基于的springboot入门小demo,已包含了前面文章的知识点(比如:热部署、全局异常处理器)。

    步骤五:修改application.properties配置文件,连接数据库

      新增数据库链接必须的参数:spring.jpa.properties.hibernate.hbm2ddl.auto=update ;表示会自动更新表结构,所以创建表这一步其实是可以不需要的。

    spring.mvc.view.prefix=/WEB-INF/jsp/
    spring.mvc.view.suffix=.jsp
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test01?characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.jpa.properties.hibernate.hbm2ddl.auto=update

    步骤六:修改pom.xml文件

      增加对mysql和jpa的支持。

            <!-- mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.21</version>
            </dependency>
     
            <!-- jpa-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency> 

    步骤七:创建pojo类Category

      JPA通过JDK 注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中

      增加一个包:cn.xdf.springboot.pojo,然后创建实体类Category。
      @Entity 注解表示这是个实体类
      @Table(name = "category_") 表示这个类对应的表名是 category_ ,注意有下划线哦
      @Id 表明主键
      @GeneratedValue(strategy = GenerationType.IDENTITY) 表明自增长方式
      @Column(name = "id") 表明对应的数据库字段名

    package cn.xdf.springboot.pojo;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="category_")
    public class Category {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private int id;
        @Column(name="name")
        private String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    步骤八:创建接口CategoryDao

      增加一个包:cn.xdf.springboot.dao,然后创建dao接口CategoryDao,继承了JpaRepository,并且提供泛型<Category,Integer> 表示这个是针对Category类的Dao,Integer表示主键是Integer类型。
      JpaRepository 这个父接口,就提供了CRUD, 分页等等一系列的查询了,直接拿来用,都不需要二次开发的了。

    package cn.xdf.springboot.dao;
    import org.springframework.data.jpa.repository.JpaRepository;
    import cn.xdf.springboot.pojo.Category;
    
    public interface CategoryDao extends JpaRepository<Category, Integer> {
    
    }

    步骤九:创建CategoryController

      增加一个包:cn.xdf.springboot.controller,然后创建CategoryController 类。
      1. 接受listCategory映射
      2. 然后获取所有的分类数据
      3. 接着放入Model中
      4. 跳转到listCategory.jsp中

    package cn.xdf.springboot.controller;
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import cn.xdf.springboot.dao.CategoryDao;
    import cn.xdf.springboot.pojo.Category;
    
    @Controller
    public class CategoryController {
    
        @Autowired
        CategoryDao categoryDao;
    
    //    @RequestMapping("/listCategory")
    //    public String listCategory(Model m) throws Exception {
    //        List<Category> cs = categoryDao.findAll();
    //        m.addAttribute("cs", cs);
    //        return "listCategory";
    //    }
        @RequestMapping("/listCategory")   //查询所有分类
        public String listCategory(Model m,@RequestParam(value="start",defaultValue="0")int start,@RequestParam(value = "size", defaultValue = "5") int size) throws Exception {
            start = start < 0 ? 0:start;
            Sort sort = new Sort(Sort.Direction.DESC,"id"); //设置根据id倒序排列
            Pageable pageable = new PageRequest(start, size,sort); //根据start、size、sort创建分页对象
            Page<Category> page = categoryDao.findAll(pageable);    //根据这个分页对象获取分页对象
            
            System.out.println(page.getNumber());  //当前页start
            System.out.println(page.getNumberOfElements());  //当前页start
            System.out.println(page.getSize());   //每页数量size
            System.out.println(page.getTotalElements());  //总数量
            System.out.println(page.getTotalPages());    //总页数
            
            m.addAttribute("page", page);
            return "listCategory";
        }
        
        @RequestMapping("/addCategory")   //添加分类
        public String addCategory(Category c)throws Exception{
            categoryDao.save(c);
            return "redirect:listCategory";  //添加成功,重定向到分类查询页面
        }
        
        @RequestMapping("/deleteCategory")  //删除分类
        public String deleteCategory(Category c)throws Exception{
            categoryDao.delete(c);
            return "redirect:listCategory";  //删除成功,重定向到分类查询页面
        }
        
        @RequestMapping("/updateCategory")   //修改方法
        public String updateCategory(Category c)throws Exception{
            categoryDao.save(c); //CrudRepository:JPA 新增和修改用的都是save. 它根据实体类的id是否为0来判断是进行增加还是修改
            return "redirect:listCategory";  //修改成功,重定向到分类查询页面
        }
        
        @RequestMapping("/editCategory")     //获取方法(先走查询,再走修改)
        public String editCategory(int id ,Model m)throws Exception{
            Category c = categoryDao.findOne(id); //根据id查询
            m.addAttribute("c", c); //查到展示到修改页面
            return "editCategory";      }
        
    }

    步骤十:创建listCategory.jsp

      通过page.getContent遍历当前页面的Category对象。
      在分页的时候通过page.number获取当前页面,page.totalPages获取总页面数。
      注:page.getContent会返回一个泛型是Category的集合。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>分类展示列表</title>
    </head>
    <body>
    <!--     <table align="center" border="1" > -->
    <!--         <tr> -->
    <!--             <td>id</td> -->
    <!--             <td>name</td> -->
    <!--         </tr> -->
    <%--         <c:forEach items="${cs}" var="c" varStatus="st"> --%>
    <!--             <tr> -->
    <%--                 <td>${c.id}</td> --%>
    <%--                 <td>${c.name}</td> --%>
    <!--             </tr> -->
    <%--         </c:forEach> --%>
    <!--     </table> -->
    
    
    <div style="500px;margin:20px auto;text-align: center">
        <table align='center' border='1' cellspacing='0'>
            <tr>
                <td>id</td>
                <td>name</td>
                <td>编辑</td>
                <td>删除</td>
            </tr>
            <c:forEach items="${page.content}" var="c" varStatus="st">
                <tr>
                    <td>${c.id}</td>
                    <td>${c.name}</td>
                    <td><a href="editCategory?id=${c.id}">编辑</a></td>
                    <td><a href="deleteCategory?id=${c.id}">删除</a></td>
                </tr>
            </c:forEach>
             
        </table>
        <br>
        <div>
                    <a href="?start=0">[首  页]</a>  <!-- 这是相对路径的写法。 前面没有斜线就是相对当前路径加上这个地址。-->
                <c:if test="${page.number-1>-1}">
                    <a href="?start=${page.number-1}">[上一页]</a>
                </c:if>
                <c:if test="${page.number+1<page.totalPages}">
                    <a href="?start=${page.number+1}">[下一页]</a>
                </c:if>
                    <a href="?start=${page.totalPages-1}">[末  页]</a>
        </div>
        <br>
        <form action="addCategory" method="post">
            添加分类:
            name: <input name="name"> <br>
        <button type="submit">提交</button>
         
        </form>
    </div>
    </body>
    </html>

    步骤十一:创建editCategory.jsp

      修改分类的页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>修改分类的页面</title>
    </head>
    <body>
        <div style="margin:0px auto; 500px">
         
        <form action="updateCategory" method="post"> 
            name: <input name="name" value="${c.name}"> <br>
            <input name="id" type="hidden" value="${c.id}">
            <button type="submit">提交</button>
        </form>

      </div> </body> </html>

    步骤十二:测试

      访问测试地址:http://127.0.0.1:8080/listCategory

      效果图:

  • 相关阅读:
    AcWing
    The Preliminary Contest for ICPC Asia Nanjing 2019
    2004-2005 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2004)
    自考新教材-p352_1
    自考新教材-p351_4
    自考新教材-p350_3
    自考新教材-p350_2
    自考新教材-p349_3(1)
    自考新教材-p347
    自考新教材-p346
  • 原文地址:https://www.cnblogs.com/zs-notes/p/9370378.html
Copyright © 2020-2023  润新知