Spring Boot (6) Spring Data JPA
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的更多相关文章
- spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...
- Spring Boot 整合Spring Data JPA
Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...
- Spring Boot 之Spring data JPA简介
文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...
- Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)
本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...
- Spring Boot中Spring data注解的使用
文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- spring boot 集成 Mybatis,JPA
相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框 ...
- 一:Spring Boot、Spring Cloud
上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...
- spring boot 与 spring cloud 关系
公司使用spring cloud,所以稍微了解一下 看了一下spring官网对 spring boot 以及 spring cloud 的解释 Spring Boot Spring Boot make ...
- spring boot与spring mvc的区别是什么?
Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等.但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面 ...
随机推荐
- [测试工具]----iperf
iperf https://sourceforge.net/projects/iperf/ http://downloads.es.net/pub/iperf/ https://github.com/ ...
- python之urllib库
urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...
- JAVA如何获得数据库的字段及字段类型
Java获取数据库的表中各字段的字段名,代码如下: import java.sql.Connection;import java.sql.DriverManager;import java.sql.R ...
- DP——最长上升子序列(LIS)
DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...
- 我理解的数据结构(二)—— 栈(Stack)
我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构 ...
- 7-19 求链式线性表的倒数第K项
7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...
- Hibernate基于注解annotation的配置
Annotation在框架中是越来越受欢迎了,因为annotation的配置比起XML的配置来说方便了很多,不需要大量的XML来书写,方便简单了很多,只要几个annotation的配置,就可以完成我们 ...
- noip模拟赛 Massacre at Béziers
题目背景 下发压缩包链接: https://pan.baidu.com/s/1geC4ooz 密码: 3vpt 所有的一切———所有的一切都被染成了红与黑. 翻卷的红莲烈焰舔舐着大地,释放出异抽的黑烟 ...
- CODEVS3147 矩阵乘法2
...怎么优化都是90分,最后一个点一直T掉,有谁过了请告诉我. Program CODEVS3147; ; ..maxn,-..maxn] of longint; n,q,i,j,k,k1,k2,k ...
- linux -- 视频尺寸-cif、2cif、dcif、D1、HD1、4D1
1 CIF简介 CIF是常用的标准化图像格式(Common Intermediate Format).在H.323协议簇中,规定了视频采集设备的标准采集分辨率.CIF = 352×288像素 ...