JPA

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

  JPA是sun官方提出的java持久化规范,它为java开发人员提供了一种对象/关系映射工具来管理java应用中的关系数据。

    持久化:把数据(内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要作用是将内存中的对象存储在数据库中,或磁盘文件中,xml文件中等。jdbc,io都是持久化机制。

    规范:所谓的规范就是明文规定或约定俗成的标准,如道德规范,技术规范等。

    持久化规范就是sun针对持久化这一层操作指定的规范。

Hibernate

  hibernate是一个开源的对象关系映射框架,它对jdbc进行了封装,将pojo与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成sql语句,自动执行,使java程序员可以像操作对象一样操作数据库。

Spring Data

  spring data 是一个用于简化数据库访问,并支持云服务的开源框架,主要目标是使数据库的访问变的方便快捷,并支持map-reduce框架和云计算数据服务,此外,他还支持基于关系型数据库的数据服务,如Oracle RAC等。对于拥有海量数据的项目,可以使用Spring Data 来简化项目的开发,就如spring framework 对jdbc 、orm的支持一样,spring data会让数据的访问变的更加方便。

Spring Data JPA

  可以极大简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了增删改查外,还包括分页、排序等一些常用功能。

  spring data 是一个开源框架,在这个框架中spring data jpa 只是这个框架中的一个模块,所以名称才叫 spring data jpa。如果单独使用jpa开发,你会发现这个代码量和jdbc开发一样有点烦人,所以spring data jpa的出现就是为了简化jpa的写法,让你只需要编写一个接口继承一个类就可以实现增删改查操作了。

JPA/Hibernate关系

  JPA是一种规范,而hibernate是它的一种实现。所以使用JPA的一个好处是,可以更换实现而不必改动太多代码。

使用Spring Data JPA进行数据库持久化操作:

首先在pom.xml中添加依赖

       <!--mysql数据驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--spring data jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

在application.properties中配置连接

# mysql连接
spring.datasource.url=jdbc:mysql://localhost:3306/david2018_db?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10 # jpa配置
spring.jpa.database = MYSQL
# 显示sql语句
spring.jpa.show-sql = true
# Hibernate 语句策略 (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# 创建表结构
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

编写实体类

package com.david.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; //当JPA检测到我们的实体类当中有@Entity时,会在数据库中生成对应的表结构信息
@Entity
public class Cat {
//使用@Id指定主键 @GeneratedValue指定主键的生成策略(mysql中自增)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String catName;
private Integer catAge; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getCatName() {
return catName;
} public void setCatName(String catName) {
this.catName = catName;
} public Integer getCatAge() {
return catAge;
} public void setCatAge(Integer catAge) {
this.catAge = catAge;
}
}

运行启动类,会自动在数据库中生成cat表,根据驼峰命名catName 会转换为cat_name

编写CatRepository.java 接口

package com.david.repository;

import com.david.bean.Cat;
import org.springframework.data.repository.CrudRepository; //继承CrudRepository类 第二个参数id的类型 即可继承常用方法save update findAll等
public interface CatRepository extends CrudRepository<Cat,Integer> { }

编写CatService.java

package com.david.service;

import com.david.bean.Cat;
import com.david.repository.CatRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @Service
public class CatService {
@Resource
private CatRepository catRepository; @Transactional
public void save(Cat c){
catRepository.save(c);
} @Transactional
public void delete(int id){
catRepository.delete(id);
} public Iterable<Cat> getAll(){
return catRepository.findAll();
}
}

编写CatController.java

package com.david.controller;

import com.david.bean.Cat;
import com.david.service.CatService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController
@RequestMapping("/cat")
public class CatController { @Resource
private CatService catService; @RequestMapping("/save")
public String save(){
Cat cat = new Cat();
cat.setCatName("tom");
cat.setCatAge(3);
catService.save(cat);
return "save";
} @RequestMapping("/delete")
public String delete(){
catService.delete(1);
return "delete";
} @RequestMapping("/getall")
public Iterable<Cat> getAll(){
return catService.getAll();
}
}

完整框架

浏览器访问 localhost:8088/cat/save delete getall方法进行测试

Repository

我们的CatRepository.java接口继承了CrudRepository接口,CrudRepository接口又继承了Repository接口,Repository是一个空接口,如果我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,今儿可以在该接口中定义满足一定规范的方法,实际上也可以通过@RepositoryDefinition注解来替代继承Repository接口。

查询方法以find | read | get开头,设计查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写,使用@Query注解可以自定义JPQL语句实现更灵活的查询。

CrudRepository

  该接口提供了最基本的对实体类的增删改查操作

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package org.springframework.data.repository; import java.io.Serializable; @NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1); //保存单个实体 <S extends T> Iterable<S> save(Iterable<S> var1); //保存集合 T findOne(ID var1); //根据id查找一个 boolean exists(ID var1); //根据id判断是否存在 Iterable<T> findAll(); //查找所有 Iterable<T> findAll(Iterable<ID> var1); //查询所有 根据条件 long count(); //查询实体数量 void delete(ID var1); //根据id删除实体 void delete(T var1); //删除一个实体 void delete(Iterable<? extends T> var1); //删除一个实体集合 void deleteAll(); //删除所有实体
}

PagingAndSortingRepository

  该接口提供了分页与排序功能

  Iterable<T> findAll(Sort sort); //排序

  Page<T> findAll(Pageable pageable) //分页查询(包含排序)

其他接口

  JpaRepository:查找所有实体、排序、查找所有实体,执行缓存与数据库同步

  JpaSpecificationExecutor:不属于Repository体系,实现一组JPA Criteria 查询相关的方法,封装JPA Criteria 查询条件,通常使用匿名内部类的方式来创建该接口的对象。

  自定义Repository:可以自定义一个MyRepository接口。

Spring Boot (6) Spring Data JPA的更多相关文章

  1. spring boot系列(五)spring boot 配置spring data jpa (查询方法)

    接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...

  2. Spring Boot 整合Spring Data JPA

    Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...

  3. Spring Boot 之Spring data JPA简介

    文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...

  4. Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)

    本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...

  5. Spring Boot中Spring data注解的使用

    文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...

  6. Spring Boot集成Spring Data Reids和Spring Session实现Session共享

    首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...

  7. spring boot 集成 Mybatis,JPA

    相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框 ...

  8. 一:Spring Boot、Spring Cloud

    上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...

  9. spring boot 与 spring cloud 关系

    公司使用spring cloud,所以稍微了解一下 看了一下spring官网对 spring boot 以及 spring cloud 的解释 Spring Boot Spring Boot make ...

  10. spring boot与spring mvc的区别是什么?

    Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等.但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面 ...

随机推荐

  1. windows和linux下 Python2,Python3 的环境及安装

    目录 windows和linux下 Python2,Python3 的环境及安装 window下安装 一. 手动安装 二. pip安装 linux下 安装 更新Python 笔者有话 windows和 ...

  2. 【Codeforces 1114D】Flood Fill

    [链接] 我是链接,点我呀:) [题意] 你选择一个point作为start_position 然后每次你可以将包含该start_position的所有联通块变成任意颜色 问你最少要多少次变换才能将所 ...

  3. Hadoop2.2.0 注意事项

    1.启动前必须把防火墙关了,要不然会导致nodemanager启动不了. 关闭防火墙:service iptables stop 永久关闭(重启后默认关闭):chkconfig iptables of ...

  4. nyoj_478_月老的烦恼(1)_201312101248

    月老的烦恼(1) 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边又人手不足 ...

  5. ACdream区域赛指导赛之专题赛系列(1)の数学专场

    Contest : ACdream区域赛指导赛之专题赛系列(1)の数学专场 A:EOF女神的相反数 题意:n(<=10^18)的数转化成2进制.翻转后(去掉前导零)输出十进制 思路:water ...

  6. 深入理解Java和MySQL乱码问题

    近期我们使用tomcat和MySQL搭建了一个Java Webserver,并将游戏的server逻辑部署在该server上. 游戏上线后不久,我们发现数据库中出现了大量的乱码.这是个很严重的问题,因 ...

  7. oracle中使用impdp数据泵导入数据提示“ORA-31684:对象类型已经存在”错误的解决

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47448751 本文出自[我是干勾鱼的博客] oracle中使用impdp数据泵导 ...

  8. 二分查找(c &amp; c++)

    typedef int ElemType; C版本号 [递归版本号] int binSearch2(ElemType List[] ,int x,int head,int tail){ //递归版本号 ...

  9. 将byte[]转为各种进制的字符串

    /**      * 将byte[]转为各种进制的字符串      * @param bytes byte[]      * @param radix 基数可以转换进制的范围(2-36),从Chara ...

  10. extjs的formpanel横向滚动条的解决办法

    关于formpanel设置autoscroll:true同时出现横向和纵向滚动条的解决办法: 不要设置autoscroll属性,或者autoscroll:false,然后设置bodyStyle : ' ...