首页 > 其他分享 >(四)JPA - JQPL 实现增删改查

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

时间:2022-09-25 11:02:13浏览次数:64  
标签:course JPA 改查 查询 Course query JPQL c1 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< ?

标签:course,JPA,改查,查询,Course,query,JPQL,c1,JQPL
From: https://www.cnblogs.com/look-word/p/16727418.html

相关文章

  • (三)JPA - EntityManager的使用
    (二)JPA连接工厂、主键生成策略、DDL自动更新建议在需要使用时,看看之前的文章,先把环境搭起来。4、EntityManagerEntityManager是完成持久化操作的核心对象。EntityMan......
  • (二)JPA 连接工厂、主键生成策略、DDL自动更新
    (一)JPA的快速入门2、JPA连接工厂通过之前的代码实现已经清楚的发现了整个的JPA实现步骤,但是这个步骤似乎有一些繁琐了,毕竟最终所关心的一定是EntityManager对象实例,而......
  • Flask 学习-77.Flask-SQLAlchemy 一对一关系增删改查
    前言SQLAlchemy连接到关系型数据库,关系型数据最擅长的东西就是关系。一对一模型设计有个Student记录学生基本信息,Contact表记录学生联系方式,Student和Contact是一对一......
  • get,post,put,delete四种基础方法对应增删改查
    PUT,DELETE,POST,GET四种基础方法对应增删改查1、GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增......
  • SpringDataJpa使用原生sql的小坑
     1.jpa中的count小坑在SpringDataJpa中repository层的@Query注解内写原生sql,如果有传入Pageable分页查询,即分页数据的pageSize大于原生sql查询出的数据,程序会正......
  • (一)JPA的快速入门
    JPA简介JPA是什么JPA是JavaPersistenceAPI的缩写,是一套由Java官方制定的ORM标准。当制定这套标准以后,市场上就出现很多JPA框架。如:OpenJPA(apache),EclipseTop(linktop)(e......
  • Spring data Jpa 自定义hql分页,添加动态参数校验1
    一,配置好jpa环境直接上代码1,控制器  其中 pageNumber和pageSize是我们自己前端传,filter中以字符串方式包含所需要的参数2.server  用json将参数解......
  • JDBC连接数据库增删改查实例
    查询所有dao层代码:packageexample;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;......
  • MongoDB增删改查
    向数据库中导入数据mongoimport-d数据库名称-c集合名称--file要导入的文件mongoimport-dplayground-cusers--file./user.json 查询//查询用户集合中......
  • 字典增删改查
    #字典Dict,也称为mapping字典是可变的、无序的、key不重复的key-value键值对集合初始化:dict(**kwargs)使用name=value对初始化一个字典dict(iterable,**kwarg),使用可迭代......