首页 > 数据库 >(五)JPA - 原生SQL实现增删改查

(五)JPA - 原生SQL实现增删改查

时间:2022-09-28 22:59:04浏览次数:58  
标签:entityManager JPA SQL 改查 JPAEntityFactory course sql query 执行

6、原生SQL

JPA除了对JPQL提供支持外,还对原生SQL语句也提供了支持。下面小节一起来看看吧。

6、1 查询单个

示例代码:

    @Test
    public void getSingle() {
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接 
        String sql = "select cid, cname, credit, end, num, start " +
                "from yootk.course where cid = ?1";
        Query query = entityManager.createNativeQuery(sql); // 预处理sql
        query.setParameter(1, 1);
        Course course = (Course) query.getSingleResult();
        loggerFactory.info("【执行结果】:{}",course ); // 执行sql
        JPAEntityFactory.close();// 关闭连接
    }

执行结果:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class look.word.po.Course

意思是 query.getSingleResult() 不能转换成 Course类

修改代码

image-20220923113459225

执行结果:

【执行结果】:[1, Spring编程实战, 5, 2022-12-30, 88, 2022-09-19]

可以发现,query.getSingleResult() 返回的是一个数组对象。不能转换成Course也是正常的。后续文章会解决这个问题

6、2 查询多个

实例代码:

@Test
public void getAllCourse() {
    EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接
    String sql = "select cid, cname, credit, end, num, start " +
            "from yootk.course ";
    Query query = entityManager.createNativeQuery(sql); // 预处理sql
    List list = query.getResultList();// 执行sql
    for (Object o : list) {
        loggerFactory.info("【执行结果】:{}", o);
    }
    JPAEntityFactory.close();// 关闭连接
}

执行结果:

【执行结果】:[1, Spring编程实战, 5, 2022-12-30, 88, 2022-09-19]

【执行结果】:[5, SpringCloud编程实战, 5, 2022-12-30, 88, 2022-09-19]

【执行结果】:[6, SSM编程实战, 5, 2022-12-30, 88, 2022-09-19]

6、3 分页模糊查询

示例代码:

    @Test
    public void getAllCourseSplit() {
        int current = 2;
        int lineSize = 3;
        String keyWord = "%Spring%";
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接
        String sql = "select cid, cname, credit, end, num, start " +
                "from yootk.course where cname like :k1";
        Query query = entityManager.createNativeQuery(sql); // 预处理sql
        query.setFirstResult((current - 1) * lineSize); // 等同于 limit ?
        query.setMaxResults(lineSize); //  // 等同于 limit ?,?
        query.setParameter("k1", keyWord);
        List list = query.getResultList();// 执行sql
        for (Object o : list) {
            loggerFactory.info("【执行结果】:{}", o);
        }
        JPAEntityFactory.close();// 关闭连接

执行结果:

执行的sql: select cid,cname,credit,end,num,start from yootk.course where cname like ? limit ?,?

6、4 count

统计 模糊匹配到的行数

    //  统计行数
    @Test
    public void getAllCourseCount() {
        String keyWord = "%Spring%";
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接
        String sql = "select count(*) from yootk.course where cname like :k1";
        Query query = entityManager.createNativeQuery(sql); // 预处理sql
        query.setParameter("k1", keyWord);
        loggerFactory.info("【执行结果】:{}", query.getSingleResult());// 执行sql
        JPAEntityFactory.close();// 关闭连接
    }

执行结果

执行的sql: select count(*) from yootk.course where cname like ?

6、5 更新

例如:我们想把学分小于5的课程全部提高到5

  • 注意到:我们当前是未开启事务的,观察程序执行结果。
    @Test
    public void getUpdateCourse() {
        // 例如:我们想把学分小于5的课程全部提高到5
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于 获取连接
        //entityManager.getTransaction().begin(); // 开启事务
        String sql = "update yootk.course as c set c.credit = ?1 where c.credit <?2";
        Query query = entityManager.createNativeQuery(sql); // 预处理sql
        query.setParameter(1, 5);
        query.setParameter(2, 5);
        loggerFactory.info("【执行结果】:{}", query.executeUpdate());// 执行sql
        //entityManager.getTransaction().commit(); // 提交事务
        JPAEntityFactory.close();// 关闭连接
    }

执行结果:

异常提示信息为:说我们的 update / delete 操作需要事务的支持

  • 把上叙代码注释掉的事务,放开执行即可。

image-20220924122837866

6、6 删除指定id

示例代码:

   // 删除指定id
    @Test
    public void deleteById() {
        EntityManager entityManager = JPAEntityFactory.getEntityManager(); // 等同于 获取连接
        entityManager.getTransaction().begin(); // 开启事务
        String deleteSql = "delete from yootk.course where cid = ?1";
        Query query = entityManager.createNativeQuery(deleteSql);
        query.setParameter(1, 1); // 预处理sql 赋值
        loggerFactory.info("【执行结果】:{}", query.executeUpdate());// 执行sql
        entityManager.getTransaction().commit(); // 提交事务
        JPAEntityFactory.close();// 关闭连接
    }

执行结果

执行的sql: delete from yootk.course where cid = ?

6、7 新增

实例代码:

    @Test
    public void addCourse() {
        EntityManager entityManager = JPAEntityFactory.getEntityManager();// 等同于获取连接
        entityManager.getTransaction().begin(); //开启事务
        String addSql = "insert into yootk.course(cname, credit, end, num, start) " +
                "value(:cname,:credit,:end,:num,:start )";
        Query query = entityManager.createNativeQuery(addSql);
        query.setParameter("cname", "java就业课程实战"); // 对预处理参数赋值
        query.setParameter("credit", 10); // 对预处理参数赋值
        query.setParameter("start", DateUtil.stringToDate("2021-10-01")); // 对预处理参数赋值
        query.setParameter("end", DateUtil.stringToDate("2022-10-01")); // 对预处理参数赋值
        query.setParameter("num", 999); // 对预处理参数赋值
        query.executeUpdate(); // 执行最终sql
        entityManager.getTransaction().commit();// 提交事务
    }

执行结果:

image-20220924124652213

标签:entityManager,JPA,SQL,改查,JPAEntityFactory,course,sql,query,执行
From: https://www.cnblogs.com/look-word/p/16739856.html

相关文章

  • MHA实现MySQL的高可用性
    MHA:MHAMasterHighAvailability对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现。目前MHA主要......
  • postgresql主从复制
    PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组成。yuminstallhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-re......
  • mysql ascii()函数简介
    在mysql中ASCII()函数是把字符转换成ascii码值的函数.语法:ASCII(str)返回字符串str最左面字符的ASCII代码值,如果str是空字符串,返回0,如果str是NULL,返回NULL.举例:1.代码......
  • mysql substr()函数
    mysql中的substr()函数和hibernate的substr()参数都一样,就是含义有所不同。用法:substr(stringstring,numstart,numlength);string为字符串;start为起始位置;le......
  • centos7 安装 mysql5.7.25
    一、检查是否安装了mysql和mariadb,若已经安装就需要卸载。[root@localhost~]#rpm-qa|grep//查询出来已安装的mariadb[root@localhost~]#rpm-e--nodeps文件名......
  • docker搭建mysql
    下载mysql镜像[root@localhost~]#dockerpullmysql:5.5.59 创建mysql容器[root@localhost~]#dockerrun-itd--namemysql-p3309:3306--restart=always-eMYSQL_......
  • Can’t connect to local MySQL server through socket 原因解析
    在连接mysql的时,经常会出现以下错误提示:ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/var/lib/mysql/mysql.sock' 出现此错误提示的原因一......
  • mysql写注释的几种方法
    MySQL的注释风格总的来说有三种、它们分别是:1、单行注释可以用"#"select1ascname;#thisisacomment+-------+|cname|+-------+|12、单行注释的第二种写法用......
  • SQL中limit的用法
    格式:select*fromtableNamelimiti,n#tableName:表名#i:为查询结果的索引值(默认从0开始),当i=0时可省略i#n:为查询结果返回的数量#i与n之间使用英文逗号","隔开#limit......
  • mysql sleep()函数简介
    语法:sleep(N)通过在MySQL中执行selectsleep(N)可以让此语句运行N秒钟: ......