首页 > 其他分享 >JDBC 批量操作 in 的使用

JDBC 批量操作 in 的使用

时间:2024-01-04 15:02:13浏览次数:42  
标签:JDBC 批量 占位 task SQL Oracle 操作 where id

 我们经常会有这种业务需求,根据一个条件集合去查询一张表的数据,比如:


select * from all_element t where t.task_id in (List <taskids>);

在java语言中,我们需要用到JDBC来和数据库打交道,那么在JDBC中该如何处理这种需求呢?我们可以有如下几种处理方式

方案一:写一个函数把参数集合转换成一个or 条件 或 in 条件的字符串,最后拼成一个sql


select * from all_element t where t.task_id in (123 ,456, 789);

或者是:


select * from all_element t where t.task_id=123 or t.task_id= 456 t.task_id= 789;

   但是这样效率如何呢?我们知道Oracle对传过来的SQL是需要事先编译的,不过是Oracle有个缓存功能可以缓存编译好的SQL,但前提是传过来的SQL必须完全一致,很明显,如果按照以上方式的话,一旦taskid值变化,那么Oracle的缓存便无法利用。

方案二:使用预编译的PrepareStatement

   为了解决Oracle缓存无法利用问题,Jdbc提供了预编译的PrepareStatement,对于变化的参数可以用占位符 <?> 来代替,因此我们可以用占位符来减少Oracle编译次数。

private static final String QUERY = "select * from all_element where taskId = ?";
ps = con .prepareStatement(QUERY);
for(String taskId : taskIds){
  ps.setInt(1, taskId);
  rs = ps .executeQuery();
}

   这样做虽然可以很好的利用Oracle的缓存,但缺点也很明显,就是每一个Id都需要查询数据库一次,这样效率是极低的。

方案三:动态地创建PrepareStatement

   虽然变化的参数可以用占位符 <?> 来代替,然而遗憾的是Jdbc只提供了单一占位符功能即占位符不能是一个可迭代的集合。因此,对于我们传过来的集合参数,我们可以动态地创建一个PrepareStatement:

   拼一个和集合大小相等数量占位符的SQL,再写一个循环来赋值每一个占位符,这样就可以解决taskId的值变化而导致Oracle重新编译SQL问题。

private static void createQuery(List<String> taskIds) {
        String query = "select * from all_element t where t.task_id in (";
        StringBuilder queryBuilder = new StringBuilder(query);
        for (int i = 0; i < taskIds.size(); i++) {
            queryBuilder.append(" ?");
            if (i != taskIds.size() - 1)
                queryBuilder.append(",");
        }
        queryBuilder.append(")");
        ps = con.prepareStatement(queryBuilder.toString());
        for (int i = 1; i <= taskIds.size(); i++) {
            ps.setInt(i, taskIds.get(i - 1));
        }
        rs = ps.executeQuery();
    }

标签:JDBC,批量,占位,task,SQL,Oracle,操作,where,id
From: https://blog.51cto.com/u_16421711/9101173

相关文章

  • 基于TIC6000的DSP教学实验箱操作教程:5-18 RGB24图像灰度转换(LCD显示)
    一、实验目的学习RGB24图像灰度转换的原理,掌握图像的读取方法,并实现在LCD上显示灰度转换前后的图像。二、实验原理RGB24图像灰度转换RGB颜色空间作为一种常用的彩色图像表示模型,分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。一般情况下,RGB彩色图像灰度化有三种转化方案:(1)......
  • OpenCV入门01:图像处理简介/图像的基础操作
    项目开源,地址:https://gitee.com/zccbbg/opencv_study文章目录图像处理简介灰度图像二值图像彩色图opencv介绍图像基础操作图像读取与显示绘制几何图形图像的属性其他操作算数操作加法混合图像色彩空间转换图像处理简介灰度图像●灰度图像是由灰度级组成的图像,每个像素的灰度级......
  • Mongo Express web浏览器直观界面 管理和操作MongoDB数据库
    MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB数据库MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB......
  • html5实现文件批量上传组件
    一、概述在html5中,相对于之前添加了不少新的元素和属性,在javascript中也添加了一些新的API,这些给我们的开发带来了很多便利。但由于各浏览器的发展步骤不一致,也导致了不同浏览器对html5支持的差异性。 二、实现原理1.在该html5实现的文件批量上传组件中,我们主要是利用html5中的一......
  • js 操作 clipboard
     文章目录Document.execCommand()方法复制操作粘贴操作优缺点Clipboard对象介绍Clipboard对象方法Clipboard.readText(https://www.chinaobd2.com/upload/support/smartpro-5000u-plus-chips-support-list.html)粘贴文本Clipboard.read()粘贴数据Clipb......
  • 软件测试/测试开发|一文告诉你Python列表相关操作
    列表是Python中最常用的数据类型之一。它是一种有序、可变,异构的数据集合,可以存储多个不同类型的元素。列表的特点列表是Python中的一种数据结构,具有以下特点:有序性:列表中的元素按照添加的顺序进行存储,每个元素都有一个对应的索引,可以通过索引访问和操作列表中的元素。可变性:列......
  • 【JDBC】Java数据库连接:操作流程、API、数据库连接池
    JDBC简介JDBC(JavaDataBaseConnectivity)Java数据库连接JDBC是使用Java语言操作关系型数据库的一套APIJDBC操作数据库流程JDBCAPIDriverManager驱动管理类Connection数据库连接对象StatementResultSet结果集对象PreparedStatementPreparedStatement好......
  • dremio hive jdbc arp date 类型问题记录
    简单记录下碰到的一些问题分析arthasstack查看调用对于hive是类似的,我测试的是mysql的stackcom.mysql.cj.jdbc.result.ResultSetImplgetDate效果ffect(classcount:2,methodcount:4)costin329ms,listenerId:11ts=2023-12-2606:18:17;thread_name=e3-1a758f......
  • 如何批量发送邮件分别给不同的人?
    在现代社会中,电子邮件已经成为人们日常沟通和工作中不可或缺的一部分。对于需要向多个人发送个性化邮件的情况,学会如何批量发送邮件分别给不同的人是非常重要的技能。本文将为您详细介绍这一过程,并提供一些建议,让您能够高效而专业地处理大量邮件收件人。1.选择合适的邮件客户端首......
  • 如何批量发送邮件分别给不同的人?
    在现代社会中,电子邮件已经成为人们日常沟通和工作中不可或缺的一部分。对于需要向多个人发送个性化邮件的情况,学会如何批量发送邮件分别给不同的人是非常重要的技能。本文将为您详细介绍这一过程,并提供一些建议,让您能够高效而专业地处理大量邮件收件人。1.选择合适的邮件客户端首......