iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Springboot如何使用Spring Data JPA实现数据库操作
  • 126
分享到

Springboot如何使用Spring Data JPA实现数据库操作

2023-06-20 13:06:23 126人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关SpringBoot如何使用spring Data JPA实现数据库操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SpringBoot整合JPA使用数据库是开发基本应用的基

这篇文章将为大家详细讲解有关SpringBoot如何使用spring Data JPA实现数据库操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

SpringBoot整合JPA

使用数据库开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connectivity)或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,这在Springboot中更是如此,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作。

JPA & Spring Data JPA

JPA是Java Persistence api的简称,中文名Java持久层API,是Sun官方提出的Java持久化规范.

其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术

JPA使用XML文件或注解(jdk 5.0或更高版本)来描述对象-关联表的映射关系,能够将运行期的实体对象持久化到数据库,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据。

简单地说,JPA就是为POJO(Plain Ordinary Java Object)提供持久化的标准规范,即将Java的普通对象通过对象关系映射(Object-Relational Mapping,ORM)持久化到数据库中。

由于JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,因而具有易于使用、伸缩性强等优点。

Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,可以在几乎不用写实现的情况下实现对数据库的访问和操作,除了CRUD外,还包括分页和排序等一些常用的功能。

Spring Data JPA 还提供了对分页查询、自定义sql、查询指定N条记录、联表查询等功能的支持

JPA不是一种新的ORM框架,它的出现只是用于规范现有的ORM技术,它不能取代现有的Hibernate、TopLink等框架。相反,在采用JPA开发时,我们将仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

Hibernate & JPA

JPA

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

JPA的出现有两个原因:

其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;

其二,Sun希望整合对ORM技术,实现持久化领域的统一。

JPA提供的技术:

1)ORM映射元数据:JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

3)查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

JPA & Hibernate 关系

JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。

Hibernate VS mybatis

Mybatis:小巧、方便、高效、简单、直接、半自动

Hibernate:强大、方便、高效、复杂、绕弯子、全自动

一、导入依赖

<dependencies>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastJSON</artifactId>            <version>1.2.76</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>            <version>1.1.21</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>Mysql-connector-java</artifactId>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>

二、简单的CRUD

配置文件

spring:  datasource:    username: root    passWord: root    url: jdbc:mysql://localhost:3306/shy    driver-class-name: com.mysql.jdbc.Driver    type: com.alibaba.druid.pool.DruidDataSource  jpa:    hibernate:      #定义数据库表的生成策略 create 创建一个表 update 更新或者创建数据表      ddl-auto: update      #控制台显示sql语句    show-sql: trueserver:  port: 80

其中,spring.jpa.hibernate.ddl-auto 参数用来配置是否开启自动更新数据库表结构,可取create、create-drop、update、validate、none五个值。

  • create 每次加载hibernate时,先删除已存在的数据库表结构再重新生成;

  • create-drop 每次加载hibernate时,先删除已存在的数据库表结构再重新生成,并且当 sessionFactory关闭时自动删除生成的数据库表结构;

  • update 只在第一次加载hibernate时自动生成数据库表结构,以后再次加载hibernate时根据model类自动更新表结构;

  • validate 每次加载hibernate时,验证数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

  • none 关闭自动更新

实体类

Shop:

package com.shy.entity;import lombok.Data;import javax.persistence.*;@Data//使用jpa注解 配置映射关系@Entity//告诉jpa这是一个实体类 和数据表映射的类public class Shop{    @Id//表明这是以一个主键    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增    private Integer shopId;    @Column(length = 20)    private String shopName;    private double price;    private Integer shopClassId;    private Integer num;}

ShopClass,商品类别

package com.shy.entity;import lombok.Data;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Data@Entitypublic class ShopClass {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer shopClassId;    private String shopClassName;}

Dao层

编写dao继承JpaRepository类,泛型传入 要操作的实体类,和主键类型

package com.example.dao;import com.shy.entity.Shop;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic interface ShopRepository extends JpaRepository<Shop,Integer> {    }

JpaRepository:

package org.springframework.data.jpa.repository;import java.util.List;import javax.persistence.EntityManager;import org.springframework.data.domain.Example;import org.springframework.data.domain.Sort;import org.springframework.data.repository.NoRepositoryBean;import org.springframework.data.repository.PagingAndSortingRepository;import org.springframework.data.repository.query.QueryByExampleExecutor;@NoRepositoryBeanpublic interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {@OverrideList<T> findAll();// 查询所有实体@OverrideList<T> findAll(Sort sort);// 查询所有实体并排序@OverrideList<T> findAllById(Iterable<ID> ids);// 根据ID集合查询实体@Override<S extends T> List<S> saveAll(Iterable<S> entities);// 保存并返回(修改后的)实体集合void flush();// 提交事务<S extends T> S saveAndFlush(S entity); // 保存实体并立即提交事务<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);@Deprecateddefault void deleteInBatch(Iterable<T> entities){deleteAllInBatch(entities);}void deleteAllInBatch(Iterable<T> entities); // 批量删除实体集合void deleteAllByIdInBatch(Iterable<ID> ids);void deleteAllInBatch();// 批量删除所有实体@DeprecatedT getOne(ID id);// 根据ID查询实体T getById(ID id);@Override<S extends T> List<S> findAll(Example<S> example);// 查询与指定Example匹配的所有实体@Override<S extends T> List<S> findAll(Example<S> example, Sort sort);// 查询与指定Example匹配的所有实体并排序}

service层

service:

package com.shy.service;import com.shy.entity.Shop;import com.shy.vo.ShopAndShopClassVo;import java.util.List;public interface ShopService {    //查询所有商品    List<Shop> findAll();    //增加商品    Shop addShop(Shop shop);    //通过商品id修改商品名    Shop updateShop();    //通过商品id删除商品    void delShop(Integer id);}

Impl:

package com.shy.service;import com.shy.dao.ShopRepository;import com.shy.entity.Shop;import com.shy.vo.ShopAndShopClassVo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Sort;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class ShopServiceImpl implements ShopService{    @Autowired    private ShopRepository shopRepository;    @Override    public List<Shop> findAll() {        return shopRepository.findAll();    }    @Override    public Shop addShop(Shop shop) {        shop.setPrice(333);        shop.setShopClassId(3);        shop.setNum(30);        shop.setShopName("耳机");        return shopRepository.save(shop);    }    @Override    public Shop updateShop() {        Shop shop = new Shop();        shop.setShopId(11);        shop.setShopName("平板");        shop.setShopClassId(3);        shop.setNum(40);        return shopRepository.save(shop);    }    @Override    public void delShop(Integer id) {        shopRepository.deleteById(id);        System.out.println("删除成功");    }}

controller

package com.shy.controller;import com.alibaba.fastjson.JSON;import com.shy.entity.Shop;import com.shy.service.ShopService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ShopController {    @Autowired    private ShopService shopService;    @GetMapping("/list")    public String findAll(){        return JSON.toJSONString(shopService.findAll());    }    @GetMapping("/save")    public String save(Shop shop){        return JSON.toJSONString(shopService.addShop(shop));    }    @GetMapping("/saveAndFlush")    public String saveAndFlush(){        return JSON.toJSONString(shopService.updateShop());    }    @GetMapping("/delShop/{id}")    public void delShop(@PathVariable Integer id){        shopService.delShop(id);    }}

全程用postman测试

三、自定义SQL

在ShopRepository中添加

//使用原生sql需要加上,nativeQuery = true //?1代表第一个参数    @Query(value="select * from shop where shop.price = ?1",nativeQuery = true)    Shop findByPrice(Double price);    //修改商品,@Modifying+@Query执行更新操作,serviceImpl不要忘记加上,要使用hql的话,需要把entity别名删掉    @Transactional//设计修改表的操作需要开启事务支持    @Modifying//这个注解只支持返回值为int/Integer    @Query("update Shop s set s.shopName = ?1 where s.shopId = ?2")    int updateshop2(String name,Integer shopId);

service:

//通过价格查询商品    Shop findByPrice(Double price);//修改商品名原生sql方法    int updateshop2(String name,Integer shopId);

Impl:

@Override    public Shop findByPrice(Double price) {        return shopRepository.findByPrice(price);    }@Override    public int updateshop2(String name, Integer shopId) {        return shopRepository.updateshop2(name, shopId);    }

controller:

@GetMapping("/listPrice/{price}")    public String findByPrice(@PathVariable Double price){        return JSON.toJSONString(shopService.findByPrice(price));    }@GetMapping("/saveAndFlush3/{id}/{name}")    public String saveAndFlush3(@PathVariable(value = "id") Integer shopId,                               @PathVariable String name){        return shopService.updateshop2(name, shopId)>0?"修改成功":"修改失败";    }

四、分页查询

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

Spring Data JPA 已经帮我们内置了分页功能,在查询的方法中,需要传入参数 Pageable,当查询中有多个参数的时候 Pageable 建议作为最后一个参数传入,

Pageable使用的时候需要传入页数、每页条数和排序规则,排序规则可省略

service:

     Page<Shop> pageShop(Integer pageNo,Integer pageSize,Pageable pageable);

Impl:

@Override    public Page<Shop> pageShop(Integer pageNo, Integer pageSize, Pageable pageable) {        //注意排序这找的是实体类中的字段,不是数据库里的        //分页页码从0开始        pageable = PageRequest.of(pageNo,pageSize, Sort.Direction.DESC, "shopId");        return shopRepository.findAll(pageable);    }

controller:

@GetMapping("/pageShop/{pageNo}/{pageSize}")    public String pageShop(@PathVariable Integer pageNo,                           @PathVariable Integer pageSize,Pageable pageable){        return JSON.toJSONString(shopService.pageShop(pageNo, pageSize, pageable));    }

五、连表查询

VO(value object)值对象

  • 通常用于业务层之间的数据传递,仅仅包含数据而已

  • View object:视图对象

接受页面传递来的对象,封装对象

将业务处理完成的对象,封装成页面要用的数据

创建ShopAndShopClassVo用来接收连表查询后的结果

entity,这里的有参构造必须加,要往里赋值

package com.shy.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class ShopAndShopClassVo {    private String shopName;    private double price;    private String shopClassName;}

ShopRepository:

//连表查询    @Query("select new com.shy.vo.ShopAndShopClassVo(s.shopName,s.price,sc.shopClassName) from Shop s,ShopClass sc " +            "where s.shopClassId=sc.shopClassId and sc.shopClassName=?1")    List<ShopAndShopClassVo> findShopInfo(String shopClassName);

JPQL进行查询,它的特征就是与原生SQL语句类似,完全面向对象,通过类名和属性访问,而不是表名和表属性

service:

//连表查询    List<ShopAndShopClassVo> findShopInfo(String shopClassName);

Impl:

@Override    public List<ShopAndShopClassVo> findShopInfo(String shopClassName) {        return shopRepository.findShopInfo(shopClassName);    }

controller:

@GetMapping("/andFind/{name}")    public String findShopInfo(@PathVariable("name") String shopClassName){        return JSON.toJSONString(shopService.findShopInfo(shopClassName));    }

六、分组查询

接收数据的另一种写法,创建一个结果集的接口来接收连表查询后的结果

定义一个结果集的接口类,接口类的内容来自于商品表和商品类别表。

entity:

package com.shy.entity;public interface GroupShop {    String getNum();    String getShopClassName();}

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

ShopRepository:

//分组查询    @Query("select count(s.shopName) as 商品数量,sc.shopClassName as 类别名称 from Shop s,ShopClass sc where s.shopClassId=sc.shopClassId group by s.shopClassId")    List<GroupShop> groupShop();

service:

//分组查询    List<GroupShop> groupShop();

Impl:

@Override    public List<GroupShop> groupShop() {        return shopRepository.groupShop();    }

controller:

@GetMapping("/groupShop")    public String groupShop(){        return JSON.toJSONString(shopService.groupShop());    }

七、与mybatis对比

  • jpa是对象与对象之间的映射,而mybatis是对象和结果集的映射

  • jpa移植性比较好,不用关心用什么数据库,因为mybatis自由写sql语句,所以当项目移植的时候还需要改sql。

  • 修改字段时JPA更简单,mybatis需要修改一堆的xml,mapper等文件很麻烦。

  • mybatis自定义sql,比较灵活,也可以写复杂的sql,JPA只适合简单的单表sql

  • 总结:mybatis和JPA各有优势,如果sql简单,则jpa使用效率更高,如果sql较复杂,需要自定义,则使用mybatis更加顺手。

关于“Springboot如何使用Spring Data JPA实现数据库操作”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Springboot如何使用Spring Data JPA实现数据库操作

本文链接: https://www.lsjlt.com/news/296604.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Springboot如何使用Spring Data JPA实现数据库操作
    这篇文章将为大家详细讲解有关Springboot如何使用Spring Data JPA实现数据库操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SpringBoot整合JPA使用数据库是开发基本应用的基...
    99+
    2023-06-20
  • Springboot使用Spring Data JPA实现数据库操作
    SpringBoot整合JPA 使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connec...
    99+
    2024-04-02
  • SpringBoot+Spring Data JPA整合H2数据库的示例代码
    目录前言Maven依赖Conroller实体类Repository数据库脚本文件配置文件启动项目访问H2数据库查看全部数据H2数据库文件运行方式前言 H2数据库是一个开源的关系型数据...
    99+
    2024-04-02
  • SpringBoot连接MYSQL数据库并使用JPA进行操作
    今天给大家介绍一下如何SpringBoot中连接Mysql数据库,并使用JPA进行数据库的相关操作。步骤一:在pom.xml文件中添加MYSQl和JPA的相关Jar包依赖,具体添加位置在dependencies中,具体添加的内容如下所示。&...
    99+
    2023-05-31
    jpa mysql spring
  • Spring Data JPA怎么实现持久化存储数据到数据库
    这篇“Spring Data JPA怎么实现持久化存储数据到数据库”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2023-06-30
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2024-04-02
  • Spring Data JPA如何实现审计功能
    本文小编为大家详细介绍“Spring Data JPA如何实现审计功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Data JPA如何实现审计功能”文章能帮助大家解决疑惑,下面跟着小...
    99+
    2023-07-05
  • Spring mvc使用mybatis如何实现连接并操作mysql数据库
    本篇文章给大家分享的是有关Spring mvc使用mybatis如何实现连接并操作mysql数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、web.xml配置我们都知道...
    99+
    2023-05-31
    springmvc mybatis mysql
  • SpringBoot如何使用JdbcTemplate访问操作数据库
    这篇文章给大家分享的是有关SpringBoot如何使用JdbcTemplate访问操作数据库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring对数据库的操作在jdbc上s面做了深层次的封装,使用sprin...
    99+
    2023-06-29
  • 使用Spring Data JPA如何实现自定义规则查询
    使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or    &nbs...
    99+
    2023-05-31
    spring data jpa
  • 在Spring Boot中使用Spring-data-jpa实现分页查询
    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式。1、引入起步依赖   <dependency> <gro...
    99+
    2023-05-31
    spring boot data
  • Spring Data Jpa如何实现自定义方法
    这篇文章将为大家详细讲解有关Spring Data Jpa如何实现自定义方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring Data Jpa 自定义方法的实现最近项目中用到...
    99+
    2023-06-22
  • Spring Data JPA实现数据持久化过程详解
    目录什么是Spring Data JPA入门案例准备数据添加依赖创建实体类创建Repository编写业务逻辑编写控制器结果配置文件详解hibernate.ddl-autojpa.d...
    99+
    2023-05-19
    Spring Data JPA数据持久化 Spring Data JPA数据 Spring Data JPA
  • Spring Data JPA实现持久化存储数据到数据库的示例代码
    目录1.SpringBoot项目整合JPA1.1 pom.xml依赖1.2 application配置文件2.创建实体类3.启动项目,测试验证1.SpringBoot项目整合JPA ...
    99+
    2024-04-02
  • springboot使用RedisRepository操作数据的实现
    目录一、一个属性、一个属性的存取二、使用Jackson2HashMapper存取对象三、使用RedisRepository的对象操作通过集成spring-boot-starter-d...
    99+
    2024-04-02
  • 使用Spring Data JPA如何实现多条件的分页查询
    使用Spring Data JPA如何实现多条件的分页查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。话不多说,请看代码:public Map<String, Obje...
    99+
    2023-05-31
    spring 分页查询 dat
  • spring使用RedisTemplate操作Redis数据库
    一.什么是Redis Redis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。 Redis可以存储键与5种不同数据结构类型之间的映射,这5种...
    99+
    2024-04-02
  • Spring boot Jpa添加对象字段使用数据库默认值操作
    目录项目搭建错误测试解决问题jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其余字段用数据库...
    99+
    2024-04-02
  • Spring Data 利用JPA如何实现调用存储过程
    这篇文章给大家介绍Spring Data 利用JPA如何实现调用存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JPA连接到数据库,调用存储过程,这样的需求很常见。本文就针对这一点,讲述如何使用spring Da...
    99+
    2023-05-31
    jpa spring 存储过程
  • Spring Data JPA的Audit功能审计数据库变更实例
    这篇文章主要讲解了“Spring Data JPA的Audit功能审计数据库变更实例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Data JPA的Audit功能审计数据库变更...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作