(一)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. CF1702B Polycarp Writes a Srting from Memory 题解

    给定一个字符串,每天可以记忆三个字符,求书写出整个字符串的天数. 每次确定要记忆的三个字母,并向后寻找,若有非三个字母其中一个,则重新开启一天记忆三个字母. #include<cstdio> ...

  2. N皇后的位运算有感

    N皇后很明显是一个NP-Hard问题,如果n足够大的话,在有限较短的时间内是很难得出答案的,但是注意到N皇后(笔者认为这类问题称为棋盘问题更为贴切),在n*n棋盘之上,每个点有且只有两种状态,这与电脑 ...

  3. CF222C Reducing Fractions

    题目大意: 给出两个集合,第一个集合数的乘积是分子,第二个集合的数的乘积是分母,要求够造一个同样的集合,但是得到的分数是最简分数. 分析: 寻找思路并不复杂,对两个集合的每个数进行质因数分解,然后统计 ...

  4. 小试牛刀:Go 反射帮我把 Excel 转成 Struct

    背景 起因于最近的一项工作:我们会定义一些关键指标来衡量当前系统的健康状态,然后配置对应的报警规则来进行监控报警.但是当前的报警规则会产生大量的误报,需要进行优化.我所负责的是将一些和用户行为指标相关 ...

  5. Yii项目知识搜集

    [['rId','advertiser_id','image_file'], 'unique','targetAttribute'=>['rId','advertiser_id','image_ ...

  6. Linux 用户管理相关命令

    1 sudo adduser username # 添加用户 2 sudo adduser --system username # 添加系统用户 3 sudo deluser username # 删 ...

  7. 【原创】Auto.js get和post 案例

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Auto.js get和post 案例 ...

  8. Luogu3904 三只小猪 (组合数学,第二类斯特林数,高精)

    即使\(n<=50\),斯特林数也会爆long long. #include <iostream> #include <cstdio> #include <cstr ...

  9. 在微信小程序中,如何获取 for 循环的 index

    微信小程序中,for 循环的 index(索引值)可以用wx:for-index="index"来获取. <view class="item" wx:fo ...

  10. OpenCV CMake VSCode Windows 平台下运行配置及其解决方案

    前言 最近在搞 计算机图形学相关的东西,有个 demo 用到了 opencv,找了 google 一圈,发现国内都没有比较好的配置和解决的办法,要不就是几年前的教程,最近正好踩坑完,其中经历了自己编译 ...