当前位置: 首页 > news >正文

(四)JPA - JQPL 实现增删改查

(一)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接口获取查询实例。

image-20220921224843472

在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 ?,?

image-20220921234522049

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< ?

相关文章:

  • 焦虑经济衍生冥想生意,年轻人会为“放空”买单吗?
  • linux之framebuffer(1)
  • Linux常用基本命令详解(二)-------磁盘分区和磁盘管理类命令
  • Vue:列表排序和筛选(运用计算属性和监视属性(侦听属性))
  • 难点:树的代码
  • vulnhub blogger: 1
  • php项目宝塔搭建实战ThinkAdmin通用公众号小程序后台开发框架
  • Web前端系列技术之Web APIs基础(从基础开始)⑥
  • FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写
  • kafka 代码使用
  • 两个单链表相交的一系列问题
  • 连接查询
  • ArrayList源码解析
  • iptables防火墙 (SNAT、DNAT)
  • idea2021.3.3 创建maven-scala项目并解决遇到的问题:通过add frameworks support找到不到scala插件
  • 自己简单写的 事件订阅机制
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 2017年终总结、随想
  • css布局,左右固定中间自适应实现
  • iOS 系统授权开发
  • React的组件模式
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 闭包--闭包之tab栏切换(四)
  • 初识 webpack
  • - 概述 - 《设计模式(极简c++版)》
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 猴子数据域名防封接口降低小说被封的风险
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 配置 PM2 实现代码自动发布
  • 如何借助 NoSQL 提高 JPA 应用性能
  • ​力扣解法汇总946-验证栈序列
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (七)Java对象在Hibernate持久化层的状态
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (算法)N皇后问题
  • (算法)前K大的和
  • (转)【Hibernate总结系列】使用举例
  • (转)scrum常见工具列表
  • (转)菜鸟学数据库(三)——存储过程
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ***利用Ms05002溢出找“肉鸡
  • .bashrc在哪里,alias妙用
  • .gitignore文件_Git:.gitignore
  • .net FrameWork简介,数组,枚举
  • .NET Micro Framework初体验(二)
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使窗口永不获得焦点
  • .Net中间语言BeforeFieldInit