• (四)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 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 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 query = entityManager.createQuery(jpql, Course.class);
            query.setFirstResult((currentPage - 1) * lineSize); // 开始查询行
            query.setMaxResults(lineSize); //每页行数
            // 设置? 参数
            query.setParameter(1, keyWord); 
            List 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 ;
            // 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 ;
            // 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< ?


    __EOF__

  • 本文作者: look-word
  • 本文链接: https://www.cnblogs.com/look-word/p/16727418.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    FPGA/HDL 开发的 10 条规则
    算法-煤球数目
    git多平台多账号公钥配置
    UI5 Tooling
    Centos7 下定义MariaDB源Yum安装最新版本的MariaDB
    Element-UI el-select下拉框多选实现全选
    VScode开发STM32/GD32单片机-环境搭建
    java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
    数字IC手撕代码-XX公司笔试真题(数据流pipeline加和)
    继承和static关键字
  • 原文地址:https://www.cnblogs.com/look-word/p/16727418.html