步骤一: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
效果图: