(四)JPA - JQPL 实现增删改查
建议在需要使用时,看看之前的文章,先把环境搭起来。
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 实现增删改查的更多相关文章
- ssm学习(四)--完整的增删改查demo
上一篇文章简要介绍了将sping mvc加入整个框架,算是完成了ssm的集成.本节继续前面的内容,结合spring mvc做一个简单的增删改查demo. 1.首先,重写一下GeckoList.jsp页 ...
- springboot整合mybatis增删改查(四):完善增删改查及整合swgger2
接下来就是完成增删改查的功能了,首先在config包下配置Druid数据连接池,在配置之前先把相关配置在application.preperties中完善 application.preperties ...
- Django基础学习四_数据库的增删改查
今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...
- (四)Hibernate的增删改查操作(1)
Hiberntae的查找操作有多种: 1. 使用Criteria接口查询 Query_Criteria.java package action; import java.util.ArrayList ...
- SQL学习之简单增删改查
SQL最常用的语句,就是增删改查: 增删改查的对象,分别是库(文件夹),表(文件),表的内容(表的记录): 一.创建一个基本的表 #create table Student_Info (Name VA ...
- springboot(十五):springboot+jpa+thymeleaf增删改查示例
这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...
- springboot+jpa+thymeleaf增删改查的示例(转)
这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...
- (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...
- spring boot2+jpa+thymeleaf增删改查例子
参考这遍文章做了一个例子,稍微不同之处,原文是spring boot.mysql,这里改成了spring boot 2.Oracle. 一.pom.xml引入相关模块web.jpa.thymeleaf ...
随机推荐
- ArrayDeque(JDK双端队列)源码深度剖析
ArrayDeque(JDK双端队列)源码深度剖析 前言 在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列 ...
- VBA驱动SAP GUI完成界面元素值初始化
小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...
- 2022-07-14 第六组 润土 Java02学习笔记
1.引用数据类型 Scanner类: Scanner shuru=new Scanner(System.in); int a=shuru.nextInt();//输入整型 String b= shur ...
- nginx虚拟主机测试
一.基于域名的nginx虚拟主机 基于域名的nginx虚拟主机的操作步骤: 1 .为虚拟主机提供域名和IP的映射(也可以使用DNS正向解析) echo "172.16.10.101 www. ...
- Jackson 解析 JSON 详细教程
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. JSON 对于开发者并不陌生,如今的 ...
- 在Mac Os(苹果)上用手机抓包软件Charles抓取微信小程序中的高清无水印视频
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_118 手机抓包是一名测试工程师常备的技能,比如我想查看一个接口请求的参数.返回值,还有移动设备上的http请求.https请求,这 ...
- React报错之`value` prop on `input` should not be null
正文从这开始~ 总览 当我们把一个input的初始值设置为null或者覆盖初始值设置为null时,会产生"valueprop on input should not be null" ...
- 解决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 ...
- Apache DolphinScheduler使用规范与使用技巧分享
本次分享来源2021年9月4日杨佳豪同学,给大家带来的分享是基于 Apache DolphinScheduler 使用规范与使用技巧分享,分享的内容主要为以下五点: " DolphinSch ...
- Java Script的认识
JavaScript的诞生 1.Java Script诞生于1995年.由Netscape(网景公司)的程序员Brendan Eich(布兰登)与Sun公司联手开发一门脚本语言, 最初名字叫做Mo ...
