一、什么是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. 推荐的学习教程:<python简明教程> 2. 不推荐的学习教程,可以偶尔查查:<Dive into python>,偶尔查查挺好,看多了走火入魔. 3. 推荐一个pyt ...

  2. 关于防SQL注入敏感词过滤问题

    关于对字符的过滤问题sql查询条件过滤掉单引号是否就安全了呢? 在文章最后一段管理员做了敏感字符的过滤,管理员过滤掉了空格,而攻击者通过 /**/ 来代替空格绕过了过滤字符.感觉很有成就感,呵呵呵呵. ...

  3. ECS 游戏架构 实现

    转载自:http://blog.csdn.net/i_dovelemon/article/details/27230719 实现 组件-实体-系统 - 博客频道   这篇文章是在我前面文章,理解组件- ...

  4. OracleBulkCopy 修正帮

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Refle ...

  5. Perl 学习笔记-哈希

    1.Perl中的哈希 高效快捷, 没有大小限制. 大哈希一样很快! 命名: 和Perl其他标识符一样, 同时拥有自己的的名字空间.  $roger{"sex"} 和 $roger没 ...

  6. iOS开发--使用lipo命令制作模拟器与真机通用静态库

    通常在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,因为Mac和iPhone的CPU不同,才造成了这种情况. 为了模拟器与真机之间切换调试的方便,制作通用版本非常有必要. 现在有 ...

  7. 编写高质量代码改善C#程序的157个建议——建议108:将类型标识为sealed

    建议108:将类型标识为sealed sealed能够阻止类型被其他类型继承.代码如下: sealed class SampleClass { } class OtherClass : SampleC ...

  8. Sweetkang 的机器学习实验室 (1)

    前言 近年来,Machine Learning 在许多领域上已然取得了可喜的成就,非常火热.就我个人来讲,有意将业余 Sport Programming 的范围扩展一下,譬如 Topcoder Mar ...

  9. Apache Shiro去掉URL中的JSESSIONID

    如果你的shiro版本在1.3.2版本以上这个BUG已经解决只需要在配置文件如下配置中添加红色部分 <!-- 会话管理器 --> <bean id="sessionMana ...

  10. 用Java实现多线程服务器程序

    一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...