一、什么是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. Python爬虫入门二之爬虫基础了解

    1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...

  2. Use formatter to format your JAVA code

    In order to make the codes looks unified and make it easy to understand, it's better to use the same ...

  3. Windows环境下搭建MosQuitto服务器

    Windows环境下搭建MosQuitto服务器 2018年04月16日 22:00:01 wistronpj 阅读数:1185  摘自:https://blog.csdn.net/pjlxm/art ...

  4. STL中 map 和 multimap

    1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...

  5. maven 引用本地jar

    1.添加lib文件夹在src文件夹中.2.拷贝所需要的test.jar包到lib文件夹.3.在pom文件加入如下依赖 <!--添加本地私有包--><dependency> &l ...

  6. vim command

    问题:对多行缩进 简述:向左缩是<,向右缩是> 详述:在命令状态,按v进入visual状态,选中多行,再按>,相当于一个TAB键:再选中多行,按<试试 ------------ ...

  7. Android-获取网络图片设置壁纸

    下载图片,设置壁纸 的代码: package liudeli.async; import android.app.Activity; import android.app.ProgressDialog ...

  8. 201621123012《Java程序设计》第13次学习总结

    作业 - 13 网络 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系 ...

  9. 一、SecureCRT 8.0 客户端连接服务器

    1.通过远程连接服务器linux,连接的是ssh服务: 如图:ssh2协议是ssh的升级版. 连接模式: 2. Ctrl+d 快速退出==exit/quit/logout 3.SecureCRT 改变 ...

  10. 修改cmd默认启动路径

    1.打开注册表编辑器(WIN+R打开运行.输入regedit,或者直接找到路径,双击打开C:\Windows\regedit.exe): 2.定位到“HKEY_CURRENT_USER\Softwar ...