springboot学习(5)springboot使用spring-data-jpa完成数据持久化

在之前我们一直使用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完成对数据库的增删改查,我们会发现确实方便了很多,减少了不少代码量,挺好的。


猜你喜欢

转载自blog.csdn.net/weixin_36380516/article/details/78695444