(四)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 ...
随机推荐
- BUCK 电路PSIM仿真模型搭建之二 (传递函数模块的使用)
1. 利用S函数模块进行环路仿真 将PI 写成 截止频率的表示形式 Kp* (Ti*s+1)/Ti*s , 这里Kp = 20, Ti = 0.0001 , 写入仿真模型参数框 仿真结果: ...
- ELK 日志分析系统的部署
一.ELK简介 ElasticSearch介绍Elasticsearch是一个基于Lucene的搜索服务器. 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. Elasti ...
- 五分钟给你的 gRPC服务 加上 HTTP 接口
gRPC 服务要加 HTTP 接口? go-zero 给大家带来极简的 RESTful 和 gRPC 服务开发体验的同时,社区又给我们提出了新的期望: 我想只写一次代码 既要 gRPC 接口 也要 H ...
- HTTP协议之Expect爬坑
前言 今天,在对接一个第三方平台开放接口时遇到一个很棘手的问题,根据接口文档组装好报文,使用HttpClient发起POST请求时一直超时,对方服务器一直不给任何响应. 发起请求的代码如下: usin ...
- java------注释、关键字、字面量
注释(对代码的一种解释说明) 单行注释 // 多行注释 /* */ 文档注释 /** */ 注释使用细节: 注释内容不参与编译和运行,所以只在java文件中存在 不管是单行注释还是多行注释 ...
- springmvc源码笔记-HandlerMethodReturnValueHandler
返回值解析器 用于对controller的返回值进行二次处理 结构 // 返回值解析器 public interface HandlerMethodReturnValueHandler { // 判断 ...
- 8月份的.NET Conf 活动 专注于 .NET MAUI
.NET Conf:Focus on MAUI 是一个为期一天的免费直播活动,将于太平洋时间 8 月 9 日上午 9 点开始,来自社区和 Microsoft 团队的演讲者们将分享使用MAUI .了解. ...
- CentOS7桥接模式上不了外网的配置
电脑VM10装了CentOS7后用NAT模式可以上网,但我想要的是桥接模式,因为我要用Xshell5进行远程访问.所以要 ifconfig 找到ip .那么为什么桥接模式上不了外网呢? 首先参考了 h ...
- Blazor和Vue对比学习(进阶2.2.4):状态管理之持久化保存(2),Cookie/Session/jwt
注:本节涉及到前后端,这个系列的对比学习,还是专注在前端Vue和Blazor技术,所以就不撸码了,下面主要学习概念. 我们知道,Http是无状态协议,客户端请求服务端,认证一次后,如果再次请求,又要重 ...
- 优雅退出在Golang中的实现
背景 为什么需要优雅关停 在Linux下运行我们的go程序,通常有这样2种方式: 前台启动.打开终端,在终端中直接启动某个进程,此时终端被阻塞,按CTRL+C退出程序,可以输入其他命令,关闭终端后程序 ...
