1、什么是Spring Data JPA

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的规则进行【方法命名】去写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。
Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使 数据库层操作更加简单,方便解耦 。
SpringData Jpa 极大简化了数据库访问层代码。 如何简化的呢? 使用了SpringDataJpa,我们的dao层中只需要写接口,就自动具有了增删改查、分页查询等方法。


2、Spring Data JPA  CRUD实例

 主结构:

springdatapom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tuling.springdata</groupId><artifactId>springdata</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>01-jpa-hibernate</module><module>02-springdata-jpa</module><module>03-springdata-jpa</module><module>04-springdata-jpa</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!--统一管理SpringData子项目的版本--><dependencyManagement><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-bom</artifactId><version>2021.1.0</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement></project>

02-springdata-jpa→pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springdata</artifactId><groupId>com.tuling.springdata</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>02-springdata-jpa</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><querydsl.version>4.4.0</querydsl.version><apt.version>1.1.3</apt.version></properties><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId></dependency><!-- junit4 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!-- hibernate对jpa的支持包 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.32.Final</version></dependency><!-- Mysql and MariaDB --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.22</version></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><!--spring-test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.10</version><scope>test</scope></dependency><!-- querydsl --><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><version>${querydsl.version}</version></dependency></dependencies><build><plugins><plugin><groupId>com.mysema.maven</groupId><artifactId>apt-maven-plugin</artifactId><version>${apt.version}</version><dependencies><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>${querydsl.version}</version></dependency></dependencies><executions><execution><phase>generate-sources</phase><goals><goal>process</goal></goals><configuration><outputDirectory>target/generated-sources/queries</outputDirectory><processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor><logOnlyOnError>true</logOnlyOnError></configuration></execution></executions></plugin></plugins></build></project>

pojo→Customer实体类:

package com.tuling.pojo;import javax.persistence.*;@Entity     // 作为hibernate 实体类
@Table(name = "tb_customer")       // 映射的表明
public class Customer {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private Long custId; //客户的主键@Column(name = "cust_name")private String custName;//客户名称@Column(name="cust_address")private String custAddress;//客户地址public Long getCustId() {return custId;}public void setCustId(Long custId) {this.custId = custId;}public String getCustName() {return custName;}public void setCustName(String custName) {this.custName = custName;}public String getCustAddress() {return custAddress;}public void setCustAddress(String custAddress) {this.custAddress = custAddress;}@Overridepublic String toString() {return "Customer{" +"custId=" + custId +", custName='" + custName + '\'' +", custAddress='" + custAddress + '\'' +"}\n";}
}

spring.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/data/jpahttps://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--用于整合jpa  @EnableJpaRepositories --><jpa:repositories base-package="com.tuling.repositories"entity-manager-factory-ref="entityManagerFactory"transaction-manager-ref="transactionManager"/><!--EntityManagerFactory--><bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="jpaVendorAdapter"><!--Hibernate实现--><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><!--生成数据库表--><property name="generateDdl" value="true"></property><property name="showSql" value="true"></property></bean></property><!--设置实体类的包--><property name="packagesToScan" value="com.tuling.pojo"></property><property name="dataSource" ref="dataSource" ></property></bean><!--数据源--><bean class="com.alibaba.druid.pool.DruidDataSource" name="dataSource"><property name="username" value="root"/><property name="password" value="123456"/><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/springdata_jpa?characterEncoding=UTF-8"/></bean><!--声明式事务--><bean class="org.springframework.orm.jpa.JpaTransactionManager" name="transactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"></property></bean><!--启动注解方式的声明式事务--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven></beans>

CustomerRepository接口

package com.tuling.repositories;import com.tuling.pojo.Customer;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;//这个接口可以实现分页和排序
import org.springframework.data.repository.query.Param;
import org.springframework.data.repository.query.QueryByExampleExecutor;
import org.springframework.transaction.annotation.Transactional;import java.util.List;//CustomerRepository接口继承这个接口PagingAndSortingRepository,有分页排序等功能
// 这个相应测试类可见:SpringDataJpaPagingAndSortTest
public interface CustomerRepository extends PagingAndSortingRepository<Customer,Long>{// 增删查改// 查询@Query("FROM Customer where custName=:custName ")List<Customer> findCustomerByCustName(@Param("custName") String custName);// 修改@Transactional@Modifying   // 通知springdatajpa 是增删改的操作@Query("UPDATE Customer c set c.custName=:custName where c.custId=:id")int updateCustomer(@Param("custName") String custName,@Param("id")Long id);@Transactional@Modifying   // 通知springdatajpa 是增删改的操作@Query("DELETE FROM Customer c where c.custId=?1")int deleteCustomer(Long id);// 新增  JPQL@Transactional@Modifying   // 通知springdatajpa 是增删改的操作@Query("INSERT INTO Customer (custName) SELECT c.custName FROM Customer c where c.custId=?1")int insertCustomerBySelect(Long id);@Query(value="select * FROM tb_customer where cust_name=:custName ",nativeQuery = true)List<Customer> findCustomerByCustNameBySql(@Param("custName") String custName);}

SpringdataJpaTest测试

package com.tuling;import com.tuling.config.SpringDataJPAConfig;
import com.tuling.pojo.Customer;
import com.tuling.repositories.CustomerRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.Arrays;
import java.util.Optional;// 基于junit4 spring单元测试
@ContextConfiguration("/spring.xml")                            //spring.xml配置文件的方式,二选一
//@ContextConfiguration(classes = SpringDataJPAConfig.class)    //配置类的方式,,二选一
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringdataJpaTest {// jdk动态代理的实例@AutowiredCustomerRepository repository;//查询@Testpublic  void testR(){Optional<Customer> byId = repository.findById(1L);//Optional<Customer>这个是JDK8的新特性,用来防止空指针的System.out.println(byId.orElse(null));System.out.println("========");System.out.println(byId.get());}//增@Testpublic  void testC(){Customer customer = new Customer();customer.setCustName("赵");System.out.println(repository.save(customer));}//更新、删除@Testpublic  void testD(){Customer customer = new Customer();customer.setCustId(7L);customer.setCustName("赵六");//更新插入repository.save(customer);//删除
//        repository.delete(customer);}//查询多个@Testpublic  void testFindAll(){Iterable<Customer> allById = repository.findAllById(Arrays.asList(1L, 4L, 5L));System.out.println(allById);}// 用来插入和修改 有主键就是修改 没有就是新增// 获得插入后自增id, 获得返回值  <S extends T> S save(S entity);// 通过集合保存多个实体  <S extends T> Iterable<S> saveAll(Iterable<S> entities);// 通过主键查询实体  Optional<T> findById(ID id);// 通过主键查询是否存在 返回boolean 11 boolean existsById(ID id);// 查询所有 Iterable<T> findAll();// 通过集合的主键 查询多个实体,, 返回集合 Iterable<T> findAllById(Iterable<ID> ids);// 查询总数量 long count();// 根据id进行删除 void deleteById(ID id);// 根据实体进行删除  void delete(T entity);// 删除多个  void deleteAllById(Iterable<? extends ID> ids);// 删除多个传入集合实体  void deleteAll(Iterable<? extends T> entities);// 删除所有  void deleteAll();
}

Spring data JPA图文教程(一)相关推荐

  1. 使用H2Database+Druid连接池+Spring Data JPA+Ehcache实现CRUD操作

    前言 注:本篇为纯实践篇,主要用于技术整合,介绍如何搭建一个完整全面的Web项目.如果对于技术原理还不了解的童鞋可点击下方链接,学习后在来~ H2数据库教程:H2数据库入门 缓存使用教程:在Sprin ...

  2. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  3. Spring Data JPA 教程(翻译)

    写那些数据挖掘之类的博文 写的比较累了,现在翻译一下关于spring data jpa的文章,觉得轻松多了. 翻译正文: 你有木有注意到,使用Java持久化的API的数据访问代码包含了很多不必要的模式 ...

  4. Spring Data JPA教程

    在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务. DAO层通常包含许多样板代码,应简化这些样板代码,以减少代码行数并使代码可重复使用. 在本教程中,我们将讨论Spring数据的J ...

  5. Spring Data JPA教程:获取所需的依赖关系

    在创建使用Spring Data JPA的应用程序之前,我们需要获取所需的依赖关系. 这篇博客文章标识了必需的组件,并描述了如何使用Maven获得它们. 让我们开始吧. 其他阅读:如果您不熟悉Spri ...

  6. Spring Data JPA教程:简介

    创建使用Java Persistence API的存储库是一个繁琐的过程,需要大量时间,并且需要大量样板代码. 通过执行以下步骤,我们可以消除一些样板代码: 创建一个抽象的基础存储库类,该类为实体提供 ...

  7. Spring Data JPA教程第一部分:配置

    Spring Data JPA是一个旨在简化基于JPA的存储库的创建并减少与数据库通信所需的代码量的项目. 在我的工作和个人爱好项目中,我已经使用了一段时间,确实使事情变得更加简单和整洁. 现在是时候 ...

  8. node在regedit配置哪个位置_Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置

    上一篇我们介绍了在使用JdbcTemplate来做数据访问时候的多数据源配置实现.接下来我们继续学习如何在使用Spring Data JPA的时候,完成多数据源的配置和使用. 添加多数据源的配置 先在 ...

  9. Spring Data JPA教程,第一部分: Configuration(翻译)

    Spring Data JPA项目旨在简化基于仓库的JPA的创建并减少与数据库交互的所需的代码量.本人在自己的工作和个人爱好项目中已经使用一段时间,它却是是事情如此简单和清洗,现在是时候与你分享我的知 ...

  10. Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 上一篇我们介绍了在使用JdbcTemplate来做数据访 ...

最新文章

  1. Kali Linux更新后无法启动解决了
  2. How to Secure Your Smart Contracts: 6 Solidity Vulnerabilities and how to avoid them (Part 2)
  3. lambda在python中的意思_Python中的lambda的简单介绍
  4. Matlab图像处理创新实践-实验3【图像锐化】
  5. Android PermissionUtils:运行时权限工具类及申请权限的正确姿势
  6. 多亏了Google相册,如何一键释放Android手机上的空间
  7. .net core DI 注册 Lazy 类型
  8. windows环境下nginx的入门配置跳转tomcat
  9. java中的命令怎么上移_web系统中上下移动功能的实现
  10. nginx服务无法停止(Windows)
  11. 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
  12. Eclipse设置中文及取消
  13. SpringMVC工作原理(含案例图解)
  14. n的约数(数论+DFS)
  15. iOS 动画之翻页动画实现
  16. 微服务架构系列一:关键技术与原理研究
  17. html标签outclick,vue自定义指令(Directive中的clickoutside.js)的理解
  18. leetcode 最常见的150道前端面试题(简单题下)
  19. CSS最详细的基础教程
  20. java中一些常用的英语

热门文章

  1. qq linux五笔输入法,qq五笔输入法
  2. 偏微分方程数值解法pdf_数值模拟偏微分方程的三种方法:FDM、FEM及FVM
  3. 关于opengl 编程指南中使用几何着色器渲染毛发的分析
  4. Qt+VS2015+番茄助手 个人常用快捷键集锦
  5. 祭十大已经逝去的软件
  6. 搭建webservice服务报错求解
  7. EGE基础入门篇(五):换上我的彩色画笔
  8. 大数据就业前景:大数据分析师是青春饭吗?
  9. java模拟器触屏_jar模拟器触屏版
  10. 95后公务员晒3004元工资引群嘲:安逸过了头,人生也就止步了