(五)JPA - 原生SQL实现增删改查
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实现增删改查的更多相关文章
- 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建
数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...
- 数据库基本查询语句(SQL常用增删改查语句 简单复习 mark)
SQL常用增删改查语句 1增 1.1[插入单行]insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) ...
- spring boot快速入门 4: jpa数据库操作 实现增删改查
spring boot jpa逆向生成表 简单实例: 第一步:pom文件: <?xml version="1.0" encoding="UTF-8"?&g ...
- iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...
- 基本 SQL 之增删改查(一)
上篇文章,我们介绍了数据的基本 DDL 语句,你应当具备基本的创建数据库.数据表的 SQL 语句,以及表字段的基本数据类型的熟知. 那么本篇就来总结总结大家日常最频繁接触到的 DDM 语句,也就是基本 ...
- web sql 基本操作 - 增删改查
不喜欢看md原文的 可以访问这个链接:http://note.youdao.com/noteshare?id=6a91e3dea7cdf5195bb0e851d9fcb5a5 # web sql 增删 ...
- SQL数据库增删改查
数据类型 运行cmd 输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据库服务 输入net pause MSSQLserve ...
- Redis:五种数据类型的简单增删改查
Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查询ay_ke ...
- MySQL基础SQL命令---增删改查
1.表操作: create table tableName (id int(6) not null primary key auto_increatment,name varchar(10) not ...
随机推荐
- websocket理解
简介 在实际开发中,可能会出现一个需求场景,要求网页的数据可以实时更新.在这种情况下,我们一般会采用轮询的方式,间隔性获取数据,即通过定时器间隔性请求相应接口获取数据,此方式由于是不断请求服务器,资源 ...
- Windows快捷安装应用方法(此处以Virtualbox为例)
1.执行已下载的virtualbox的安装exe文件,使用pywinauto模拟点击Windows安装的对应控件 1.1.启动exe文件 start *.exe 1.2.使用pywinauto(也适用 ...
- 调和级数为什么是 O(logn) 的
目录 调和级数 正片 调和级数 调和级数(Harmonic series)定义为 \[H(n)=\sum_{i=1}^n\dfrac 1i \] \(H\) 发散,证明看百度 . 正片 首先我们把 \ ...
- Linux—系统基础一
Linux系统基础(一) Linux的基本原则: 由目的单一的小程序组成,组合小程序完成复杂任务: 一切皆文件: 配置文件保存为纯文本格式. 1.shell 1.1 shell简介 Shell俗称壳( ...
- OC高仿iOS网易云音乐AFNetworking+SDWebImage+MJRefresh+MVC+MVVM
效果 因为OC版本大部分截图和Swift版本一样,所以就不再另外截图了. 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS云音乐专栏. 目简介 这是一个使用OC语言 ...
- 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?
大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...
- 业界压测平台与JMeter的对比
压测平台是什么? 压测,即压力测试,作用是对各种服务对象进行压力测试以获得该服务处于或超过预期负载时系统的运行情况,进而判断系统在峰值负载或超出最大负载情况下的处理能力. 压测工具,顾名思义,就是用来 ...
- HCIA-datacom 4.3 实验三:网络地址转换配置实验
实验介绍: 网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程.作为减缓IP地址枯竭的一种过渡方案,NAT通过地址重用 ...
- ABC209F. Deforestation——DP(、数学容斥)
题面 有 n n n 棵树排成一排,每棵树高度为 h i ( i ∈ [ 1 , n ] ) h_i~(i\in[1,n]) hi (i∈[1,n]) ,你现在要按照一个排列 P P P 的顺序去砍 ...
- Linux的NIS配置
快速命令 # Server和Client设置NIS域名 nisdomainname nis_server echo 'NISDOMAIN=nis_server' >> /etc/sysco ...