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. Solution -「二项式定理与组合恒等式」一些练习

    Task 1 \(\mathcal{Prob:}\) \((3x - 2y)^{18}\) 的展开式中, \(x^5y^{13}\) 的系数是什么?\(x^8y^9\) 的系数是什么? \(\math ...

  2. mysql Insert强化

    INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({e ...

  3. ExcelPatternTool: Excel表格-数据库互导工具

    ExcelPatternTool Excel表格-数据库互导工具 介绍: 指定Pattern文件-一个规则描述的json文档,基于此规则实现Excel表格与数据库之间的导入导出,校验等功能. 特点: ...

  4. 技术分享 | 简单测试MySQL 8.0.26 vs GreatSQL 8.0.25的MGR稳定性表现

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. M ...

  5. (原创)[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化

    一.前言 "GDI+"与"鼠标交互",乍一听好像不可能,也无从下手,但是实现原理比想象中要简单很多. 基于"GDI+"的"交互&q ...

  6. 利用 SonarScanner 静态扫描 Rainbond 上的 Maven 项目

    对代码进行静态扫描是一种非常常见的代码质量保证手段,这种扫描不仅仅可以检查到代码中的缺陷,应用各种业界最佳实践,也可以检查出安全方面的漏洞,给予项目代码全方位的提升.在各种代码扫描方案之中,Sonar ...

  7. SpringBoot(一、快速入门)

    1.SpringBoot简介   Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置, ...

  8. 部署前后端为独立的 Docker 节点

    在『服务器部署 Vue 和 Django 项目的全记录』一文中,介绍了在服务器中使用 Nginx 部署前后端项目的过程.然而,当 Web 应用流量增多时,需要考虑负载均衡.流量分发.容灾等情况,原生的 ...

  9. Chapter 09 - NSUndoManager (C#实现 + 全网原创)

    此例子针对NSDocument实现了tableview 每一行添加/删除的undo/redo,以及每一个单元格内容编辑的undo/redo.基于NSDocument类的实现.PersonModel + ...

  10. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...