(一)JPA的快速入门

建议在需要使用时,看看之前的文章,先把环境搭起来。

5、JPQL

JPQL和SQL

  • 1.JPQL和SQL很像,查询关键字都是一样的
  • 2.唯一的区别是:JPQL是面向对象的

JPQL书写规则:

JPA的查询语言,类似于sql

  • 1.里面不能出现表名,列名,只能出现java的类名,属性名,区分大小写
  • 2.出现的sql关键字是一样的意思,关键字不区分大小写
  • 3.不能写select * 要写select 别名

示例:

SELECT 子句 FROM 子句 [WHERE 子句] [GROUP BY子句][HAVING子句] [ORDER BY子句]

JPQL的语法结构非常类似于SQL,主要的目的是帮助开发者简化技术学习的成本,如果要想使用JPQL查询操作,则要通过EntityManager接口获取查询实例。

在JPA里面考虑到实际查询之中所可能产生的各种繁琐的查询操作问题,也支持原生SQL命令的,同时要使用JPQL查询主要依靠两个接口:Query、TypedQuery,使用TypedQuery可以直接获取到指定类型的查询结果。

  • 一定注意 所有JPQL语句中的 不是表名 而是对应的实体类名

5、1 查询所有

测试类:

    public static Logger loggerFactory = LoggerFactory.getLogger(TestCourseQuery.class);

    @Test
public void testSelectAll() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();
// Course不是表名称 而是对应的实体类名
String jpql = "select c from Course as c";
// JPQL 查询语句
Query query = entityManager.createQuery(jpql);
// 发出最终查询语句
List<Course> list = query.getResultList();
for (Course course : list) {
loggerFactory.info("【查询结果:】 {}", course);
}
// 关闭连接
JPAEntityFactory.close();
}

查询结果:

【查询结果:】 Course(cid=1, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

【查询结果:】 Course(cid=3, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

【查询结果:】 Course(cid=4, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

5、2 查询指定id

TypedQuery createQuery(String var1, Class var2);

var1:需执行的JPQL语句

var2:实体类的Class

TypedQuery: 解决Query需要进行类型转换的问题

测试类:

    @Test
public void testSelectById() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();
// Course不是表名称 而是对应的实体类名
String jpql = "select c from Course as c where c.cid = ?1";
// JPQL 查询语句
TypedQuery<Course> query = entityManager.createQuery(jpql, Course.class);
query.setParameter(1, 1);
// 需要进行强转
Course course = query.getSingleResult();
loggerFactory.info("【查询结果:】 {}", course);
// 关闭连接
JPAEntityFactory.close();
}

查询结果:

执行的sql: select c1_0.cid,c1_0.cname,c1_0.credit,c1_0.end,c1_0.num,c1_0.start from course c1_0 where c1_0.cid=?

【查询结果:】 Course(cid=1, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

5、3 分页模糊查询

如果执行发现报错,仔细查看输出日志

    @Test
public void testSelectSplit() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();
int currentPage = 2; // 页码
int lineSize = 2;// 每页行数
String keyWord = "%Spring%";
// Course不是表名称 而是对应的实体类名
String jpql = "select c from Course as c where c.cname like ?1";
// JPQL 查询语句
TypedQuery<Course> query = entityManager.createQuery(jpql, Course.class);
query.setFirstResult((currentPage - 1) * lineSize); // 开始查询行
query.setMaxResults(lineSize); //每页行数
// 设置? 参数
query.setParameter(1, keyWord);
List<Course> list = query.getResultList();
for (Course course : list) {
loggerFactory.info("【查询结果:】 {}", course);
}
// 关闭连接
JPAEntityFactory.close();
}

执行结果:

执行的sql: select c1_0.cid, c1_0.cname, c1_0.credit, c1_0.end, c1_0.num, c1_0.start from course c1_0 where c1_0.cname like ? limit ?,?

5、4 count

    @Test
public void testSelectCount() {
EntityManager entityManager = JPAEntityFactory.getEntityManager();
String keyWord = "%Spring%";
// Course不是表名称 而是对应的实体类名
String jpql = "select count(c) from Course as c where c.cname like ?1";
// JPQL 查询语句
Query query = entityManager.createQuery(jpql);
// 设置? 参数
query.setParameter(1, keyWord);
loggerFactory.info("【符合模糊查询的数据量:】 {}", query.getSingleResult());
// 关闭连接
JPAEntityFactory.close();
}

执行结果:

执行的sql: select count(c1_0.cid) from course c1_0 where c1_0.cname like ?

【符合模糊查询的数据量:】 4

5、5 更新

例如:我们想把学分小于5的课程全部提高到5

示例代码:

    public static Logger loggerFactory = LoggerFactory.getLogger(TestCourseUpdate.class);

    @Test
public void testUpdate() {
JPAEntityFactory.getEntityManager().getTransaction().begin(); // 开启事务
// Course不是表名称 而是对应的实体类名
String jpql = "update Course as c set c.credit = ?1 where c.credit <?2";
// JPQL 查询语句
Query query = JPAEntityFactory.getEntityManager().createQuery(jpql); // 预处理sql
query.setParameter(1, 5); // 第一个?
query.setParameter(2, 5); // 第二个?
loggerFactory.info("【更新结果:】{}", query.executeUpdate()); // 执行sql
JPAEntityFactory.getEntityManager().getTransaction().commit();// 提交事务
// 关闭连接
JPAEntityFactory.close();
}

执行结果:

执行的sql:update course set credit= ? where credit< ?

5、6 删除指定id

示例代码:

    @Test
public void testDelete() {
JPAEntityFactory.getEntityManager().getTransaction().begin(); // 开启事务
// Course不是表名称 而是对应的实体类名
String jpql = "delete from Course as c where c.cid <?1";
// JPQL 查询语句
Query query = JPAEntityFactory.getEntityManager().createQuery(jpql);
query.setParameter(1, 1); // id为1
loggerFactory.info("【更新结果:】{}", query.executeUpdate());
JPAEntityFactory.getEntityManager().getTransaction().commit();// 提交事务
// 关闭连接
JPAEntityFactory.close();
}

执行结果:

执行的sql:delete from course where cid< ?

(四)JPA - JQPL 实现增删改查的更多相关文章

  1. ssm学习(四)--完整的增删改查demo

    上一篇文章简要介绍了将sping mvc加入整个框架,算是完成了ssm的集成.本节继续前面的内容,结合spring mvc做一个简单的增删改查demo. 1.首先,重写一下GeckoList.jsp页 ...

  2. springboot整合mybatis增删改查(四):完善增删改查及整合swgger2

    接下来就是完成增删改查的功能了,首先在config包下配置Druid数据连接池,在配置之前先把相关配置在application.preperties中完善 application.preperties ...

  3. Django基础学习四_数据库的增删改查

    今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...

  4. (四)Hibernate的增删改查操作(1)

    Hiberntae的查找操作有多种: 1.  使用Criteria接口查询 Query_Criteria.java package action; import java.util.ArrayList ...

  5. SQL学习之简单增删改查

    SQL最常用的语句,就是增删改查: 增删改查的对象,分别是库(文件夹),表(文件),表的内容(表的记录): 一.创建一个基本的表 #create table Student_Info (Name VA ...

  6. springboot(十五):springboot+jpa+thymeleaf增删改查示例

    这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...

  7. springboot+jpa+thymeleaf增删改查的示例(转)

    这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...

  8. (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...

  9. spring boot2+jpa+thymeleaf增删改查例子

    参考这遍文章做了一个例子,稍微不同之处,原文是spring boot.mysql,这里改成了spring boot 2.Oracle. 一.pom.xml引入相关模块web.jpa.thymeleaf ...

随机推荐

  1. ArrayDeque(JDK双端队列)源码深度剖析

    ArrayDeque(JDK双端队列)源码深度剖析 前言 在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列 ...

  2. VBA驱动SAP GUI完成界面元素值初始化

    小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...

  3. 2022-07-14 第六组 润土 Java02学习笔记

    1.引用数据类型 Scanner类: Scanner shuru=new Scanner(System.in); int a=shuru.nextInt();//输入整型 String b= shur ...

  4. nginx虚拟主机测试

    一.基于域名的nginx虚拟主机 基于域名的nginx虚拟主机的操作步骤: 1 .为虚拟主机提供域名和IP的映射(也可以使用DNS正向解析) echo "172.16.10.101 www. ...

  5. Jackson 解析 JSON 详细教程

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. JSON 对于开发者并不陌生,如今的 ...

  6. 在Mac Os(苹果)上用手机抓包软件Charles抓取微信小程序中的高清无水印视频

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_118 手机抓包是一名测试工程师常备的技能,比如我想查看一个接口请求的参数.返回值,还有移动设备上的http请求.https请求,这 ...

  7. React报错之`value` prop on `input` should not be null

    正文从这开始~ 总览 当我们把一个input的初始值设置为null或者覆盖初始值设置为null时,会产生"valueprop on input should not be null" ...

  8. 解决beego运行程序报错问题:stderr: go: github.com/astaxie/beego@v1.12.1: missing go.sum entry

    使用命令bee new beegodemo02创建beego程序后,使用VScode打开后,便会报错无法运行,报错信息如下: Error loading workspace: err: exit st ...

  9. Apache DolphinScheduler使用规范与使用技巧分享

    本次分享来源2021年9月4日杨佳豪同学,给大家带来的分享是基于 Apache DolphinScheduler 使用规范与使用技巧分享,分享的内容主要为以下五点: " DolphinSch ...

  10. Java Script的认识

     JavaScript的诞生 1.Java Script诞生于1995年.由Netscape(网景公司)的程序员Brendan Eich(布兰登)与Sun公司联手开发一门脚本语言,  最初名字叫做Mo ...