在之前我们一直使用JdbcTemplate来实现数据的增删改查,这里尝试使用spring-data-jpa,实现上更加简单,因为Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,使用spring-data-jpa对开发者来说连仅剩的实现持久层业务逻辑的工作都省了。声明持久层的接口,然后交给 Spring Data JPA 来帮你完成。
首先引入spring-data-jpa的包依赖(所有的操作都是在上一篇的基础上进行的,并不是只引入一个依赖就可以)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
spring-data-jpa很多根据接口来操作,我们的项目结构又有所变动了,增加了DAO接口以及Service,如下:
首先在application.properties中加上在控制台打印sql语句的配置,方便调试
spring.jpa.properties.hibernate.show_sql=true
实体类修改如下
package org.amuxia.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="items") public class Items implements Serializable{ private static final long serialVersionUID = 7207780155261265206L; @Id() @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String title; private String name; private String detail; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public Items() { super(); // TODO Auto-generated constructor stub } public Items(Integer id, String title, String name, String detail) { super(); this.id = id; this.title = title; this.name = name; this.detail = detail; } @Override public String toString() { return "Items [id=" + id + ", title=" + title + ", name=" + name + ", detail=" + detail + "]"; } }
@GeneratedValue提供了主键的生成策略,它可以为一个实体生成一个唯一标识的主键,因为JPA要求每一个实体Entity,必须有且只有一个主键;提供了四种主键生成策略:
GenerationType.TABLE
使用一个特定的数据库表来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键。
GenerationType.SEQUENCE
按照序列机制生成主键,对于不支持自增长的数据库,可以使用GenerationType.SEQUENCE做主键生成策略,jpa会根据@SequenceGenerator注解指定的创建序列。
GenerationType.IDENTITY
适用于支持主键自增长的数据库,数据库在插入数据时,会自动给主键赋值
GenerationType.AUTO
把主键生成策略交给持久化引擎,持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。不用说,肯定经常用它了。
DAO接口类
package org.amuxia.dao; import java.util.List; import org.amuxia.entity.Items; import org.springframework.data.repository.Repository; public interface ItemsDAO extends Repository<Items,Integer>{ public List<Items> findAll(); public void save(Items items); }
这里ItemsDAO接口继承了Repository<T, Serializable>,内封转了很多常用的方法,findAll()、save()等,所以很多时候不需要我们去写sql语句了。
Service类
package org.amuxia.service; import java.util.List; import org.amuxia.dao.ItemsDAO; import org.amuxia.entity.Items; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ItemsService implements ItemsDAO{ @Autowired private ItemsDAO dao; @Override public List<Items> findAll() { // TODO Auto-generated method stub return dao.findAll(); } @Override public void save(Items items) { // TODO Auto-generated method stub dao.save(items); } }
Controller类
package org.amuxia.controller; import java.util.List; import org.amuxia.entity.Items; import org.amuxia.service.ItemsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; @ComponentScan @RestController @RequestMapping("/items1") public class ItemsController1 { @Autowired private ItemsService service; /** * @return * 查询全部信息 */ @RequestMapping("/list") public ModelAndView itemsList() { List<Items> list = service.findAll(); ModelAndView mav = new ModelAndView("items"); mav.addObject("list", list); return mav; } /** * @return * 跳转到新增接界面 */ @RequestMapping("/toAdd") public ModelAndView toAdd() { ModelAndView mav = new ModelAndView("add"); return mav; } /** * 新增数据 * @param items * @return */ @RequestMapping("/add") public @ResponseBody boolean addItems(Items items) { try { service.save(items); return true; }catch (Exception e) { // TODO: handle exception e.printStackTrace(); return false; } } }
前台的thymeleaf模板不变,启动运行一下
没有问题,新增和查询都是可以的,对比之前的springboot使用JdbcTemplate完成对数据库的增删改查,我们会发现确实方便了很多,减少了不少代码量,挺好的。