(一)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. APISpace 日出日落API接口 免费好用

    日出是每个早晨太阳的一半从地平线探出头的时刻,也指太阳穿过地平线的整个过程及其伴随的大气效应.日落是指由于地球自转导致太阳每天从地平线消失的时刻.从赤道上看,春分和秋分时,太阳从正西方落下.从中纬度地 ...

  2. IDEA快捷键之html篇-2

    .qa-item .qa-item-ft .icon { display: inline-block; width: 16px; height: 16px; vertical-align: sub; ...

  3. NOI / 2.1基本算法之枚举-8760:Cantor表

    总时间限制: 1000ms 内存限制: 65536kB 描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编 ...

  4. Linux系统下安装windows字体笔记

    源文档地址:https://www.e-iceblue.cn/spiredocforjavaconversion/word-to-pdf-font-issue.html windows字体路径:C:\ ...

  5. 2509-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用 .properties配置文件

    java实现的数据库连接池有很多,c3p0,dbcp等,还有号称速度最快的HikariCP,并且springboot2.0.2版本默认使用的就是HikariCP. 为什么选用Druid呢? - 性能够 ...

  6. Vue 自定义事件 && 组件通信

    1 App.vue 2 <template> 3 <!-- 4 组件的自定义事件: 5 1.一种组件间通信的方式,使用于:子组件===>父组件 6 2.使用场景:A是父组件,B ...

  7. 如何让 JS 代码不可断点

    绕过断点 调试 JS 代码时,单步执行(F11)可跟踪所有操作.例如这段代码,每次调用 alert 时都会被断住: debugger alert(11) alert(22) alert(33) ale ...

  8. 用JavaScript写随机出一个颜色

    function changeColor(){ var r = parseInt(Math.random()*255) var g = parseInt(Math.random()*255) var ...

  9. Docker 01 概述

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  10. postgresql用户与权限管理

    pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合.为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户. 由于用户也拥有一系列的相 ...