(五)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的在线对弈游戏【五子棋】,只用几十行代码完成全部逻辑。
五子棋是规则简单明了的策略型游戏,先形成五子连线者获胜.本课程习作采用两人在线对弈的方式进行比赛,拿着手机在上下班路上玩特别合适. 整个过程在众触低代码应用平台进行,使用表达式描述游戏逻辑(高度简化版 ...
- Schur不等式(舒尔不等式)
舒尔( Schur \texttt{Schur} Schur)不等式1 具体内容 Schur \texttt{Schur} Schur 不等式: x , y , z x,y,z x,y,z 为非负实数 ...
- maven的常见问题
idea2021.3报错-Maven-Terminated-with-exit-code-1
- SQL语句编写
mybatis插入数据 下面的item.avatarUrl取出的是java实体类里面的属性,所有需要大写 插入的SQL: INSERT INTO `one` VALUES(1,"第一个&qu ...
- Netty源码解读(一)-前置准备
前置条件 源码版本netty4.1 了解Java NIO.Reactor模型和Netty的基本使用. 解释一下: Java NIO:了解BIO和NIO的区别以及Java NIO基础API的使用 Rea ...
- 网易云UI模仿-->侧边栏
侧边栏 效果图 界面分解 可以看到从上到下的流式布局.需要一个Column来容纳,并且在往上滑动的过程中顶部的个人信息是不会动的.所以接下来需要将剩余部分占满使用Flexibel组件. 实现 个人信息 ...
- PHP常见的几种攻击方式
1.SQL Injection(sql注入) 1暴字段长度 Order by num/* 2.匹配字段 and 1=1 union select 1,2,3,4,5--.n/* 3.暴露字段位置 an ...
- 深入分析FragmentPagerAdapter和FragmentStatePagerAdapter
最近遇到比较奇怪的bug,TableLayout+ViewPager实现点击顶部tab切换viewpager视图.但是在Viewpager设置dapter时,最开始设置的是FragmentPagerA ...
- 微服务性能分析|Pyroscope 集合 Spring Cloud Pig 的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- 全局异常处理及参数校验-SpringBoot 2.7 实战基础 (建议收藏)
优雅哥 SpringBoot 2.7 实战基础 - 08 - 全局异常处理及参数校验 前后端分离开发非常普遍,后端处理业务,为前端提供接口.服务中总会出现很多运行时异常和业务异常,本文主要讲解在 Sp ...