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类

修改代码

执行结果:

【执行结果】:[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 操作需要事务的支持

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

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();// 提交事务
}

执行结果:

(五)JPA - 原生SQL实现增删改查的更多相关文章

  1. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  2. 数据库基本查询语句(SQL常用增删改查语句 简单复习 mark)

    SQL常用增删改查语句 1增 1.1[插入单行]insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) ...

  3. spring boot快速入门 4: jpa数据库操作 实现增删改查

    spring boot jpa逆向生成表 简单实例: 第一步:pom文件: <?xml version="1.0" encoding="UTF-8"?&g ...

  4. iOS使用sqlite3原生语法进行增删改查以及FMDB的使用

    首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...

  5. 基本 SQL 之增删改查(一)

    上篇文章,我们介绍了数据的基本 DDL 语句,你应当具备基本的创建数据库.数据表的 SQL 语句,以及表字段的基本数据类型的熟知. 那么本篇就来总结总结大家日常最频繁接触到的 DDM 语句,也就是基本 ...

  6. web sql 基本操作 - 增删改查

    不喜欢看md原文的 可以访问这个链接:http://note.youdao.com/noteshare?id=6a91e3dea7cdf5195bb0e851d9fcb5a5 # web sql 增删 ...

  7. SQL数据库增删改查

    数据类型 运行cmd 输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver     关闭数据库服务 输入net pause MSSQLserve ...

  8. Redis:五种数据类型的简单增删改查

    Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查询ay_ke ...

  9. MySQL基础SQL命令---增删改查

    1.表操作: create table tableName (id int(6) not null primary key auto_increatment,name varchar(10) not ...

随机推荐

  1. SpringBoot集成文件 - 集成POI之Excel导入导出

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...

  2. 温控器/胎压检测/电表/热泵显示控制器等,低功耗高抗干扰断/段码(字段式)LCD液晶显示驱动IC-VK2C22A/B,替代市面16C22,44*4/40*4点显示

    产品品牌:永嘉微电/VINKA 产品型号:VK2C22A/B 封装形式:LQFP52/48 产品年份:新年份 概述: VK2C22是一个点阵式存储映射的LCD驱动器,可支持最大176点(44SEGx4 ...

  3. gdb调试器在windows下的相关内容

    1.gdb调试器在visual studio或dev c++中也有类似的调试图形化可视界面,但是gdb不同的是它是由命令行组成,他的界面对于习惯图形化可视界面的用户来说一时间会不知所措 2.通过gcc ...

  4. CF576A Vasya and Petya's Game

    题目大意: 给定一个数字 n,现在 Vasya 要从 1∼n 中想一个数字 x. Petya 向 Vasya 询问 "x 是否能整除 y?" ,通过 Vasya 的回答来判断 x ...

  5. SQL审核工具自荐Owls

    关键词: sql审批.sql检测.sql执行.备份 概要 这里主要是向大家推荐一款sql检测.审批工具Owls,用于自动检测.审批sql的执行,还有其他的审批.备份.查询等功能.以提高sql的规范化, ...

  6. mysql常见用法

    查看连接数show processlist; 查看慢日志 show variables like '%slow_query_log%'; show variables like 'long_query ...

  7. 利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_165 上一篇文章:Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,是在 ...

  8. 关于hive分区,你知道多少呢?

    ​ 文末查看关键字,回复赠书 一.理论基础 1.Hive分区背景 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入 ...

  9. 零基础学Java(14)对象构造

    对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...

  10. vsftpd 操作手册 - 完整版

    vsftpd # 目录 - ftp 简介 - vsftpd 简介 - vsftpd 安装&卸载 - vsftpd 配置文件 - vsftpd 认证模板 - vsftpd 配置模板 # 目录详解 ...