spring-data-jpa的使用

Spring Data JPA(含自定义Repository) 工具:sts Spring Boot Version:2.1.3.RELEASE 数据库:mysql 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/XML... 阅读详情

 

首先了解JPA是什么?

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。

注意:JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。

spring data jpa

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!

spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现

 

 了解了JPA以及Spring data JPA相关的依赖,详见pom文件如下

        <!-- Spring-data-jpa依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- Mysql支持 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

 

yml属性配置文件需要配置数据库的链接属性,我采用的是mysql数据库

server:
  port: 8080
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///库名?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。
create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

 

 创建一个简单的entity,代码如下,值得注意的地方是这里必须要有一个无参构造方法,否则JPA启动会报错

 


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class User{

    @Id
    @Column(name="id",nullable = false)
    @GeneratedValue
    private Integer id;

    @Column
    private String username;

    @Column
    private String name;

    @Column
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User(String username,String name,String password){
        super();
        this.username=username;
        this.name=name;
        this.password=password;
    }

    //必须有一个无参构造方法,否则会报错
    public User(){

    }

    @Override
    public String toString() {
        return getId()+","+getUsername()+","+getName();
    }
}

 

创建简单的查询

创建一个自己的Repository,官网上介绍的是其需要集成Repository或者CurdRepository,而此处采用的是继承JpaRepository

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {



}

使用默认方法

 @Autowired
private UserRepository userRepository;

@Test
public void testBaseQuery() throws Exception {
    User user=new User();
    userRepository.findAll();
    userRepository.findOne(1l);
    userRepository.save(user);
    userRepository.delete(user);
    userRepository.count();
    userRepository.exists(1l);
    // ...
}

 

简单的自定义查询

所谓简单的自定义查询就是根据方法名自动生成SQL,当然方法名是有命令规则的,主要语法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟属性名称,以及可以使用一些And、Or等关键字,还可以加上OrderBy进行排序,详见如下表格:

关键字方法命名sql where字句
AndfindByNameAndPwdwhere name= ? and pwd =?
OrfindByNameOrSexwhere name= ? or sex=?
Is,EqualsfindById,findByIdEqualswhere id= ?
BetweenfindByIdBetweenwhere id between ? and ?
LessThanfindByIdLessThanwhere id < ?
LessThanEqualfindByIdLessThanEqualswhere id <= ?
GreaterThanfindByIdGreaterThanwhere id > ?
GreaterThanEqualfindByIdGreaterThanEqualswhere id > = ?
AfterfindByIdAfterwhere id > ?
BeforefindByIdBeforewhere id < ?
IsNullfindByNameIsNullwhere name is null
isNotNull,NotNullfindByNameNotNullwhere name is not null
LikefindByNameLikewhere name like ?
NotLikefindByNameNotLikewhere name not like ?
StartingWithfindByNameStartingWithwhere name like '?%'
EndingWithfindByNameEndingWithwhere name like '%?'
ContainingfindByNameContainingwhere name like '%?%'
OrderByfindByIdOrderByXDescwhere id=? order by x desc
NotfindByNameNotwhere name <> ?
InfindByIdIn(Collection<?> c)where id in (?)
NotInfindByIdNotIn(Collection<?> c)where id not in (?)
TruefindByAaaTuewhere aaa = true
FalsefindByAaaFalsewhere aaa = false
IgnoreCasefindByNameIgnoreCasewhere UPPER(name)=UPPER(?)

使用情况的代码如下:

import com.zxl.examples.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
 
import java.util.List;
 
/**
 * Created by Administrator on 2017/7/21.
 */
public interface UserRepository extends JpaRepository {
 
    //方法名要规则,sql会根据方法名自动生成sql进行操作
    public List findByUsername(String username);
 
 
    List findByNameAndPassword(String name,String password);
 
    List findByNameOrPassword(String name,String password);
 
 
    List findByPasswordLessThan(String password);
 
    List findByNameAndPasswordLessThan(String name,String password);
 
    List findByIdLessThanAndPasswordLessThan(Integer id,String password);
 
    List findByIdLessThanAndPasswordLessThanEqual(Integer id,String password);
 
    List findByIdLessThanEqual(Integer id);
 
    List findByPasswordBetween(String password1,String password2);
 
    List findByUsernameIn(List usernames);
 
    List findByNameLike(String name);
 
    List findByNameContaining(String name);
 
 
}

 

2.  带有分页的自定义查询

在实际的开发中是免不了遇到有分页的情况的,而Spring data jpa已经帮我们实现了分页的功能,我们只需要在方法中传入Pageable参数即可,如要实现自定排序在方法中还可传入Sort参数,具体使用情况见如下代码,UserRepository类中的代码如下:


import com.zxl.examples.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
 
import java.util.List;
 
/**
 * Created by Administrator on 2017/7/21.
 */
public interface UserRepository extends JpaRepository {
 
    //方法名要规则,sql会根据方法名自动生成sql进行操作
    public Slice findByNameOrderByIdDesc(String name, Pageable pageable);
 
 
    public Page findByNameOrderByPasswordAscIdDesc(String name, Pageable pageable);
 
    List findByNameOrderByIdDesc(String name,Sort sort);
 
    List findByNameOrPassword(String name,String password, Pageable pageable);
 
   
}

Pageable 是spring封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则

@Test
public void testPageQuery() throws Exception {
    int page=1,size=10;
    Sort sort = new Sort(Direction.DESC, "id");
    Pageable pageable = new PageRequest(page, size, sort);
    userRepository.findALL(pageable);
    userRepository.findByUserName("testName", pageable);
}

 

3自定义sql查询

其实Spring data 觉大部分的SQL都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的SQL来查询,spring data也是完美支持的;在SQL的

查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional 对事物的支持,查询超时的设置等

代码详见如下:

import com.zxl.examples.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
 
import java.util.List;
 
/**
 * Created by Administrator on 2017/7/21.
 */
public interface UserRepository extends JpaRepository {
 
 
    //SpEL (Spring Expression Language)
    @Query("select u from User u where u.username = :#{#user.username}")
    List findByUsername(@Param("user") User user);
 
    @Query("select u from User u where u.username = :username")
    List findByUsername2(@Param("username") String username);
 
    @Query("select u from User u where u.username=?2 AND u.id=?1")
    List findByIdAndUsername(Integer id,String username);
 
    @Query("select u from User u")
    List findAll2(Pageable pageable);
 
    @Query(value="select * from user limit 0,6",nativeQuery = true)//使用原生的sql,此处连的是mysql
    List findAll3();
 
 
}

 

多表查询

多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里主要第二种方式。

首先需要定义一个结果集的接口类。

public interface HotelSummary {

    City getCity();

    String getName();

    Double getAverageRating();

    default Integer getAverageRatingRounded() {
        return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
    }

}

查询的方法返回类型设置为新创建的接口

@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
        - "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page<HotelSummary> findByCity(City city, Pageable pageable);

@Query("select h.name as name, avg(r.rating) as averageRating "
        - "from Hotel h left outer join h.reviews r  group by h")
Page<HotelSummary> findByCity(Pageable pageable);

使用

Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name"));
for(HotelSummary summay:hotels){
        System.out.println("Name" +summay.getName());
    }

在运行中Spring会给接口(HotelSummary)自动生产一个代理类来接收返回的结果,代码汇总使用getXX的形式来获取

 

Spring Data JPA用法详解 Spring Data JPA: JPA(Java Persistence API)即java持久化API,它的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下三方面的技术: ORM映射元数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系 API:操作实体对象来执行CRUD操作 查询语言:通过面向对象而非面向数据库的 阅读详情

相关推荐

JPA & Spring Data JPA详解

JPA & Spring Data JPA 一、JPA 1. JPA是什么 JPA(Java Persistence API)Java持久化 API,是一套基于ORM思想的规范。 ORM(Object Relational Mapping)对象关系映射。实现了实体类对象和数据库中表的一个映射关系。我们可以通过操作实体类对象(JavaBean)来操作数据库表,从而实现数据库的CRUD操作并且不需要去重点关注SQL语句。ORM主要涉及到两个映射关系:1、实体类和表的映射关系;2、实体类中的属性和表中的字

cd546566850的博客 4009

SpringDataJPA中Repository的子接口

1.CrudRepository子接口 (1).EmployeeDao接口类: import org.springframework.data.repository.CrudRepository; import com.kmu.entity.Employee; public interface EmployeeDao extends CrudRepository<Employee, Int...

weixin_46007404的博客 495

SpringDataJpa开发--继承JpaRepository实现简单条件查询

1.Spring Data JPA 是 Spring Data 技术下的子项目,使用Spring Data JPA 访问数据只需要数据访问层接口实现JpaRepository接口即可。 2.JpaRepository接口继承了PagingAndSortingRepository接口,所以也有它的一些功能 3.JpaRepoditory接口提供了很多常用方法:   示例:简单条件查询 ...

BADAO_LIUMANG_QIZHI的博客 9935

spring-boot spring-data-jpa 使用

依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org

weixin_42710740的博客 1273

PDF批量加水印 与 去除水印实践

我们可以给PDF加图片水印或文字水印,要去除图片水印,一般只需要删除最后一个图片对象即可。要去除文字水印,需要保证主体内容和文字水印在/Contents中位于不同的对象内,这样我们只需要删除文字水印对应的对象即可删除水印。而对于主体内容和文字水印已经混合在一个对象时,本文的提供的方法则无能为力,需要进一步深入分析PDF细节。

小小明-代码实体的专栏 2757

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 334

spring data jpa使用详解

使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下。 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data 包含多个子项目: Commons - 提供共享

牛奋lch 5万+

智能车实战——从ADC采集到PWM控制,让电磁车精准循迹

本文详细介绍了电磁循迹智能车的实现原理与实战技巧,涵盖从ADC信号采集、PWM控制到PID算法整定的全流程。通过STM32代码示例解析电感信号处理、差比和偏差计算及电机驱动等关键技术,帮助开发者快速掌握智能车精准循迹的核心方法,提升电磁车竞赛项目的开发效率。

weixin_29192211的博客 301

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring Data 项目中的子项目,旨在简化与 JPA(Java Persistence API)的集成。它在标准 JPA 的基础上提供了更高层次的抽象,开发者可以使用极少的代码实现复杂的数据操作。Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。Spring Data JPA 的强大之处在于其灵活的查询方式,支持方法派生、JPQL 和原生 SQL。

好看资源网的博客 2243

AD9361数字调制入门:从IQ调制原理到动手实现第一个ASK信号(Vivado工程详解)

本文详细介绍了如何使用AD9361射频收发器实现ASK数字调制,从IQ调制原理到Vivado工程实现。通过Verilog代码示例和FPGA架构设计,帮助开发者理解纯逻辑实现数字调制解调的关键技术,特别适合软件无线电(SDR)初学者入门实践。

weixin_29158047的博客 374

ESP32S3开发板玩转多语言AI对话:小智语音机器人粤语/日语/韩语实测

本文基于正点原子ESP32S3开发板,实测了“小智AI”语音机器人的多语言对话能力。项目巧妙整合云端AI与嵌入式硬件,实现了对粤语、日语、韩语等语言的实时识别与合成,为开发者和爱好者提供了一个低成本、可玩性高的跨语言人机交互开发平台。

h9j8k7l6m5n的博客 537

Spring Data JPA详解

Spring Data是持久层通用解决方案,支持关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务等。

JAVA_KX的博客 3289

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

Spring Data JPA

快速入门spring data jpa,并且集成到Springboot

llg3189609554的博客 1431

吊打BEVFormer!GaussianBeV实战:用3D高斯开启BEV分割新范式

GaussianBeV是一种基于3D高斯建模的BEV分割新方法,在自动驾驶感知任务中实现了SOTA性能。其核心创新在于将场景元素表示为3D高斯分布,通过均值、协方差和权重精确描述物体位置、形状和置信度,相比传统BEV方法具有更强的空间建模能力。文章详细介绍了GaussianBeV的原理、环境配置、训练推理流程及其在自动驾驶和城市3D重建中的应用,并讨论了优化方向和未来发展趋势。该方法在nuScenes等数据集上表现出色,为BEV分割任务提供了新的解决方案。

m0_71589036的博客 106

手把手教你学simulink(31.31)--双向DCDC电源场景示例:设计并实现一个基于变频控制的双向降压变换

设计并实现一个基于 Simulink 的双向降压变换器,能够在充电模式(从高压侧向低压侧传输能量)和放电模式(从低压侧向高压侧传输能量)之间切换,确保输出电压稳定,并根据负载变化自动调整工作模式。

MHD0815的博客 343

Spring Boot 整合 Spring Data JPA、strategy 的策略区别、什么是 Spring Data JPA

Spring Boot 整合 Spring Data JPA、strategy 的策略区别、什么是 Spring Data JPA

hutao8896的博客 1113

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

​ Spring Data JPA

​ 创建一个普通的Maven项目。

埃泽漫笔 1341

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring Boot整合Spring Data JPA

Spring Data中按照框架的规范自定义了Repository接口,除了可以使用接口提供的默认方法外,还可以按特定规则来定义查询方法,只要这些查询方法的方法名遵守特定的规则,不需要提供方法实现体,Spring Data就会自动为这些方法生成查询语句。Spring Data对这种特定的查询方法的定义规范如下:以find、read、get、query、count开头。涉及查询条件时,条件的属性使用条件关键字连接,并且条件属性的首字母大写。

daqi1983的博客 1590

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

同时使用Spring Data Jpa与Spring Data MongoDB

Spring Data Jpa 提供了Jpa存储的支持,而Spring data MongoDB则提供了MongoDB的抽象,有时候会有跨结构的存储需要,需要同时使用这两种存储技术。 当同时使用两者的时候,由于其提供的Repository都是基于Spring Data Common的,所以两种存储方案的Repository声明可能很像,都是继承自PagingAndSortingRepository...

扶摇升的IT博客 1387

Spring Data JPA全面指南

摘要: Spring Data JPA作为JPA规范的实现框架,通过简化配置和自动化操作提升开发效率。其核心功能包括: 声明式Repository:通过继承CrudRepository/JpaRepository接口,无需实现即可自动生成CRUD方法; 查询派生:基于方法名(如findByEmail)自动生成SQL查询,支持排序、分页等; 审计与事务:通过注解自动维护创建/修改时间,并集成声明式事务管理; 关联映射:简化实体关系配置(如@OneToMany),支持JSON序列化控制; 扩展性:允许自定义Re

静水深流 1505

JPA和Spring Data JPA的区别

JPA是标准Spring Data JPA是基于标准的增强工具如果你在用Spring Boot项目,基本上都是在用Spring Data JPASpring Data JPA通过方法名派生、@Query注解等机制,极大简化了JPA的使用理解JPA规范有助于更好地使用和调试Spring Data JPA简单记:JPA告诉你应该怎么做,Spring Data JPA帮你轻松做到。

刘皇叔说Java的博客 904

【JAVA】Spring Data JPA

Spring Data JPA

weixin_37559642的博客 1106

Spring Data JPA 介绍和使用

本文参考了Spring Data JPA官方文档,引用了部分文档的代码。Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。下面来逐步介绍它的强大功能。添加依赖我们可以

乐百川 2万+
上一篇: java的多线程
下一篇: 数据库之分库分表
GoldWashing
博客等级 码龄8年 18粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值