热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springdatajpa介绍以及基础示例

JPA介绍JPA的全称是JavaPersistenceAPI,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规

JPA介绍

JPA的全称是Java Persistence API,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规范,它的目标是实现ORM的天下归一。

1、java数据库编程的进化史:

1)jdbc:

jdbc是jdk提供数据库操作最基础的api,它提供了一套操作数据库的标准规范,不同的数据库厂商通过自己的驱动jar来适配该规范。

Class.forName("com.mysql.cj.jdbc.Driver");
cOnn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");

// 执行查询
Statement stmt = conn.createStatement();
String sql = "SELECT id, name, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);

2)hibernate、mybatis 等ORM框架:

  • Hibernate 可以认为是JPA规范的的一种实现,使用起来比较方便,但是不够灵活;
  • Mybatis是一个持久层的sql mapping框架。 mybatis的优势在于可以灵活的写SQL,自由度比较高

3)spring data jpa:

spring data jpa不是像Hibernate那样对jpa的实现,而是对其更进一步做了封装,使用起来非常简单、灵活。

spring data jpa的目的就是不让程序员花太多时间在数据库层面的处理,所以要做的只是声明接口(类似于mybatis),而且spring data jpa会帮常用sql都帮你拼写好(不像mybatis那样,还需要自己写sql或者mapper)。基于spring data jpa编写持久层逻辑,一般分为如下几步:

  • 定义实体类,关联数据库中的表。
  • 声明持久层接口,接口需要继承Repository。
  • 接口中声明需要的方法,spring data jpa会自动给我们生成实现代码

Spring data jpa有以下几个常用的接口:

  • Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类,方便Spring自动扫描识别, 一般不在程序中直接使用。
  • CrudRepository:继承Repository,实现了一组CRUD相关的方法,这个用的比较多,一般如果上层业务只需要基本的增删改查,继承这个接口就可以了。
  • JpaRepository:继承PagingAndSortingRepository,实现一组JPA规范相关的方法。这个也用的比较多,它和CrudRepository区别在于支持分页和排序。

简单示例

创建springboot项目:
1)pom.xm如下:


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.qiyi.test
TestSpringBoot
0.0.1-SNAPSHOT
TestSpringBoot

org.springframework.boot
spring-boot-starter-parent
2.0.4.RELEASE



UTF-8
1.8
1.8



junit
junit
test


org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-test
test



mysql
mysql-connector-java
runtime



org.springframework.boot
spring-boot-starter-data-jpa



com.alibaba
fastjson
1.2.9






2)application.properties:

spring.jpa.show-sql = true
logging.level.org.springframework.data=DEBUG
spring.jpa.hibernate.ddl-auto=
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3)定义实体类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="test")
public class Test{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "service_code")
private String serviceCode;
private int status = 0;//0:正常、-1异常


//set get方法
}

4)dao接口:

import org.springframework.data.jpa.repository.JpaRepository;
import com.qiyi.test.TestSpringBoot.entity.WoodyService;
public interface TestDao extends JpaRepository {
}

5)controller层:

public class TestController {

@Autowired
private TestDao testDao;

@RequestMapping("/jpsTest")
@ResponseBody
public JSONObject jpsTest(HttpServletRequest request,HttpServletResponse httpResponse) {

JSONObject res = new JSONObject();

try {
List findAll = testDao.findAll();

Optional findById = testDao.findById(33);
System.out.println(findById);
System.out.println("==============");

long count = testDao.count();
System.out.println(count);
res.put("data",findAll);
res.put("code","success");
} catch (Exception e) {
res.put("code","error");
return res;
}
return res;
}
}

注:省略了service层.

可以看到,dao层接口继承了JpaRepository后,默认会有如下findXXX方法,以及count等方法。

查询规范

直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:

支持的关键字1

支持的关键字2

参考:http://www.machengyu.net/tech/2019/06/29/spring-data-jpa-demo.html

https://blog.csdn.net/hgx_suiyuesusu/article/details/80919171


推荐阅读
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
author-avatar
园园哚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有