一、什么是JPA

  JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。

二、Mysql数据库示例

  1、在application.yml文件中增加数据库访问的配置

  

  ddl-auto:可选属性有以下几种。

  

  create   每次创建一个新表,那么之前表中的数据都会丢掉

  update  表不存在的时候才会建立新表,如果存在则不会新建,所以原有数据不会丢

  create-drop  每次新建一个表,而且服务停掉,那么所建立的表会随之删除

  none   见名知意,就是什么都不做,不会给帮你建表,只能使用现有的表

  validate  会将实体类和表进行一个验证,如果不一致会报错

  2、新建实体类

  

package com.zmfx.jpa;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Dog {
/*
如果这些注解所在的包,javax.persistence不能导入。可能是缺少依赖
可以在pom中加入Javax Persistence API 的依赖
*/
@Id
@GeneratedValue
private Integer id;//编号
private Integer age;//年龄
private String name;//名字 public Dog() {
} public Dog(Integer id, Integer age, String name) {
this.id = id;
this.age = age;
this.name = name;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

  3、编写Repository接口类

    这里需要继承JpaRepository这个类,这样我们就可以使用底层帮我们实现好的一些代码

    相当于我们之前了解到的持久层(数据访问层),用于获取数据库中的数据。

  4、编写Serivce层

    按照策略模式,我们应当一个接口,然后对应实现类。由于这里业务比较简单,我们就不那么费事了。可能这层我在下面都不写。

  5、编写Controller层

    根据访问信息,进行相应的业务处理,页面展示。

三、RestFul API

  1、查询所有,findAll()方法的使用。GET请求

    Repository接口类

package com.zmfx.jpa;

import org.springframework.data.jpa.repository.JpaRepository;

/**
* 这个接口需要继承一个接口JpaRepository
* 这样就可以使用底层为我们编写好的一些通用方法
*/
public interface DogRepository extends JpaRepository<Dog,Integer> {
}

    Controller层

package com.zmfx.jpa;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; /**
* 控制层
*/
@RestController
public class DogController {
//因为业务太简单,所有我们省略service层,直接调用数据访问层的代码
@Autowired
private DogRepository dogRepository;
/**
* 查询所有女生列表
* @return
*/
@GetMapping(value="/dogs")
public List<Dog> dogList(){
return dogRepository.findAll();//findAll()方法是底层帮我没实现好的
}
}

  这里推荐一个软件PostMan,可以模拟前端的http访问,可以不用编写页面

 2、根据id查询一条记录,findById()的使用,GET请求

   在controller中新加以下代码

 /**
* 根据id查询指定的Dog
* @param id
* @return
*/
@GetMapping(value = "/dog/{id}")
public Optional<Dog> findDogById(@PathVariable("id") Integer id){
return dogRepository.findById(id);//注意这个方法的返回值
}

然后,使用PostMan进行访问,展示如下:

  

 3、添加一个Dog,save()方法的使用,POST请求

  controller层中新加以下代码

 /**
* 添加一个Dog
* @param age
* @param name
* @return
*/
@PostMapping(value = "/addDog")
public Dog addDog(@RequestParam("age") Integer age,
@RequestParam("name") String name){
Dog dog=new Dog();
dog.setAge(age);
dog.setName(name);
return dogRepository.save(dog);
}

然后用PostMan进行访问,展示效果如下:

 4、更新dog的信息,save()方法的使用,Put请求

  在controller增加下面代码

/**
* 更新Dog信息
* @param id
* @param age
* @param name
* @return
*/
@PutMapping(value = "updateDog/{id}")
public Dog updateDog(@PathVariable("id") Integer id,
@RequestParam("age") Integer age,
@RequestParam("name") String name){
Dog dog=new Dog();
dog.setId(id);
dog.setName(name);
dog.setAge(age);
System.out.println(dog);
return dogRepository.save(dog);//注意这里使用save()方法,根据主键,所以主键不能更改
}

  这里使用PostMan的PUT请求,注意使用x-www-form-urlencoded进行传参

  访问后的效果应当如下:

 5、删除一条记录,deleteById()方法,DELETE请求

  controller中加入以下代码:

/**
* 删除一条记录
* @param id
*/
@DeleteMapping(value = "/del/{id}")
public void delDogById(@PathVariable("id") Integer id){
dogRepository.deleteById(id);
}

  PostMan中使用DELETTE请求,因为没有返回值,所以需要到数据库中查看效果

 6、根据年龄来查询,自己在Repository中定义

  DogRepository中变为

package com.zmfx.jpa;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
* 这个接口需要继承一个接口JpaRepository
* 这样就可以使用底层为我们编写好的一些通用方法
*/
public interface DogRepository extends JpaRepository<Dog,Integer> {
//通过年龄来查询
List<Dog> findByAge(Integer age);//注意方法名的格式,findBy+属性名。 }

  Controller中新增代码

/**
* 根据年龄来查询
*/
@GetMapping(value = "/dogs/{age}")
public List<Dog> dogList(@PathVariable("age")Integer age){
return dogRepository.findByAge(age);
}

  然后使用PostMan进行访问,展示如下:

  

四、事务管理

  1、加入事务之前

  controller层加入代码

//这里涉及到事务,所以我们加入service的依赖
@Autowired
private DogService dogService;
/**
* 事务测试的方法
*/
@GetMapping(value = "/dogs/tx")
public void txTest(){
System.out.println("进入了controller");
dogService.addTwoDog();
}

  service层代码,这里用到了事务,所以要新建一个DogService类

package com.zmfx.jpa;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class DogService {
@Autowired
private DogRepository dogRepository;
/**
* 同时添加两条记录
*/
public void addTwoDog(){
//模拟两条数据
Dog dog1=new Dog();
dog1.setAge(2);
dog1.setName("小黑1");
//模拟第二条数据
Dog dog2=new Dog();
dog2.setAge(2);
dog2.setName("小黑2");
System.out.println("进入了service");
//将数据插入到数据库
dogRepository.save(dog1);
System.out.println(5/0);//模拟异常
dogRepository.save(dog2);
}
}

  然后使用 http://127.0.0.1:8083/dev/dogs/tx 进行访问,我们发现后台抛出异常,但是数据库还是添加了第一条的记录。

  

 2、加入事务之后

  我们就能够让小黑1 和 小黑2 同生共死了。

  其它的都不变,然后再需要添加事务的方法上,添加一个@Transactional注解。也就是service的 public void addTwoDog()上加入注解

  

package com.zmfx.jpa;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; @Service
public class DogService {
@Autowired
private DogRepository dogRepository;
/**
* 同时添加两条记录
*/
@Transactional //加入事务控制
public void addTwoDog(){
//模拟两条数据
Dog dog1=new Dog();
dog1.setAge(2);
dog1.setName("小黑1");
//模拟第二条数据
Dog dog2=new Dog();
dog2.setAge(2);
dog2.setName("小黑2");
System.out.println("进入了service");
//将数据插入到数据库
dogRepository.save(dog1);
System.out.println(5/0);//模拟异常
dogRepository.save(dog2);
}
}

  然后删除数据库中,小黑1这条记录,重启springboot服务,再次访问 http://127.0.0.1:8083/dev/dogs/tx 。

  还是那个异常,然后去看数据库,发现两条记录都没有添加进来。事务控制添加成功。

   

SpringBoot入门(IDEA篇)(三)的更多相关文章

  1. SpringBoot 入门实战篇

    SpringBoot入门 使用SpringBoot + mysql + Jpa 快速搭建一个spring项目 Spring Boot 2 + Spring Data JPA + MySQL 8 簡單範 ...

  2. SpringBoot入门学习(三)

    基于第二讲,这一讲我们主要讲解包含以下内容 springBoot添加对freemarker的支持 使用@RestController处理ajax请求 使用@PathVariable注解获取url参数 ...

  3. ①SpringBoot入门教学篇

    一.什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  4. springboot入门系列(三):SpringBoot教程之RabbitMQ示例

    SpringBoot教程之RabbitMQ示例 SpringBoot框架已经提供了RabbitMQ的使用jar包,开发人员在使用RabbitMQ的时候只需要引用jar包简单的配置一下就可以使用Rabb ...

  5. SpringBoot入门系列(三)资源文件属性配置

    前面介绍了Spring的@Controller和@RestController控制器, 他们是如何响应客户端请求,如何返回json数据.不清楚的朋友可以看看之前的文章:https://www.cnbl ...

  6. SpringBoot入门-JPA(三)

    什么是JPA JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. pom.xml <par ...

  7. SpringBoot入门(三)——入口类解析

    本文来自网易云社区 上一篇介绍了起步依赖,这篇我们先来看下SpringBoot项目是如何启动的. 入口类 再次观察工程的Maven配置文件,可以看到工程的默认打包方式是jar格式的. <pack ...

  8. 【SSRS】入门篇(三) -- 为报表定义数据集

    原文:[SSRS]入门篇(三) -- 为报表定义数据集 通过前两篇文件 [SSRS]入门篇(一) -- 创建SSRS项目 和 [SSRS]入门篇(二) -- 建立数据源 后, 我们建立了一个SSRS项 ...

  9. SpringBoot入门学习看这一篇就够了

    1.SpringBoot是什么? SpringBoot是一套基于Spring框架的微服务框架. 2.为什么需要SpringBoot 由于Spring是一个轻量级的企业开发框架,主要的功能就是用于整合和 ...

  10. SpringBoot入门基础

    目录 SpringBoot入门 (一) HelloWorld. 2 一 什么是springboot 1 二 入门实例... 1 SpringBoot入门 (二) 属性文件读取... 16 一 自定义属 ...

随机推荐

  1. 后台注册js代码的方法

    Page.ClientScript.RegisterClientScriptBlock(JSUtil.CurrentPage.GetType(), Util.NewGuid(), @"< ...

  2. 向对象(OO)程序设计

    http://www.uml.org.cn/mxdx/201208232.asp 前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented ...

  3. 在IIS和Nginx上通过代理部署基于ant-design-pro前端框架开发的应用

    一.本文解决的主要问题 通过对前端静态资源站点进行代理服务设置,实现对后端API接口的代理,从而实现前端的独立部署,即通过代理的设置实现对http://IP0:Port0/api/xxx的请求转发至h ...

  4. Win10安装Mongodb,并配置成服务

    好吧,今天突然发现新买的surface上没有安装mongodb,然后想着安装一下,顺便记录一下,虽说安装过程很简单 一:下载安装,然后拷贝到C盘根目录,这个就不多说了,比QQ都简单. 二:把bin文件 ...

  5. [GO]面向对象和面对过程的方式

    package main import ( "fmt" ) //这里为面向过程的方式 func Add(a, b int) int { return a + b } //面向对象, ...

  6. Fiddldr 教程之:HTTP协议详解(转)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

  7. Exception (3) Java exception handling best practices

    List Never swallow the exception in catch block Declare the specific checked exceptions that your me ...

  8. 编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限

    建议121:为应用程序设定运行权限 在某些情况下,可能存在这样的需求:只有系统管理员才能访问某应用程序的若干功能.这个时候,可以结合.NET中提供的代码访问安全性(Code Access Securi ...

  9. spring mvc 入门程序

    入门程序 1.环境准备 myeclipse Spring jar 2.前端控制器设置 (web.xml) 所有的*.action请求通过org.springframework.web.servlet. ...

  10. 【微服务架构】SpringCloud之Feign(五)

    Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...