`
llm6101
  • 浏览: 21541 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PrepareStatement中的sql语句中的in查询问题

阅读更多
正在开发一个小东西,需要俩个不同的数据库DB_A和DB_B(不同的实例),都是Oracle的
在库DB_A中的一个表A根据条件查出主键有1,2,3,4,5,6
拼好后为"1,2,3,4,5,6"

再在第二个库DB_B中的B表中把上面拼的字符串作为in的参数,如下
String in_data="1,2,3,4,5,6";
pst = 
  conn.prepareStatement("select id,name from B where id in ? ");
pst.setString(1,"("+in_data+")");


发现查不出记录,我又试
String in_data="1,2,3,4,5,6";
pst = 
  conn.prepareStatement("select id,name from B where id in ( ? )");
pst.setString(1,in_data);


还是不出记录,我再试
String in_data="1";
pst = 
  conn.prepareStatement("select id,name from B where id in ( ? )");
pst.setString(1,in_data);


终于出来了id=1的记录,似乎明白了点啥么
PrepareStatement是动态设定参数的,
也就是现在生成select id,name from B where id in ( ? )
一个?代表一个参数,pst.setString(1,"1,2,3,4,5,6"),
就相当于select id,name from B where id in ( '1,2,3,4,5,6' ),
没有id为'1,2,3,4,5,6'的记录,当然查不出来啦

但是由于我的in_data是根据条件动态改变的,由于俩查询在不同的DB实例中,所以用子查询是不行的;而用PrepareStatement设置in参数的时候就不能确定到底是用几个"?"

最后只好用Statement拼字符串了,不知道各位有啥好办法
分享到:
评论
4 楼 chyyang 2008-07-31  
llm6101 写道
coldsky 写道
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现



呵呵 不错 谢谢啊~~~~ 是个好方法




思路很清晰,很新颖,呵呵
3 楼 llm6101 2008-06-30  
coldsky 写道
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现



呵呵 不错 谢谢啊~~~~ 是个好方法
2 楼 gordonAtJava 2008-06-30  
嘿嘿,in是有个数限制滴,要注意
1 楼 coldsky 2008-06-30  
给个提示
String[] in_datas=new String[]{"1", "2", "3"};

String inString=""
for(int i=0;i<in_datas.length;i++){
    if(i>0){
        inString+=", ";

    }
    inString+="?";
}

pst =    
  conn.prepareStatement("select id,name from B where id in ( "+inString+" )");   

for(int i=0;i<in_datas.length;i++){
    pst.set(i, in_datas[i]);
}

可以参考 org.hibernate.criterion 包的实现

相关推荐

    prepareStatement和Statement的区别

    prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement...

    JDBC PrepareStatement 使用(附各种场景 demo)

    在批量处理数据时,PrepareStatement提供了`addBatch()`方法,可以将多条SQL语句添加到批处理队列中,最后通过`executeBatch()`一次性执行。这在插入大量数据时非常有效。例如,批量插入用户记录: ```java String ...

    MySQL prepare语句的SQL语法

    MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] …]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_...

    sql语句中用问号代替参数

    参数化查询允许将变量值插入到SQL语句中,而不是直接将它们拼接到字符串中。问号是大多数数据库系统用来表示这些参数的占位符。例如,以下是一个简单的参数化SELECT语句: ```sql SELECT * FROM Users WHERE ...

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 10); ``` 在这个例子中,我们想知道实际执行的SQL语句是"SELECT * FROM table WHERE id = 10"。为了实现这个需求,我们可以自定义一个辅助...

    JDBC(用PrepareStatement实现)

    创建PreparedStatement对象需要通过Connection接口的prepareStatement()方法,传入SQL语句作为参数。例如: ```java Connection conn = DriverManager.getConnection(url, username, password); ...

    java数据库连接PrepareStatement

    要创建一个 `PreparedStatement` 对象,首先需要通过 `Connection` 对象调用 `prepareStatement` 方法,并传入一个 SQL 语句字符串。例如: ```java // 假设 con 是已建立的 Connection 对象 String sql = "UPDATE ...

    如何获得PreparedStatement最终执行的sql语句

    在Java的JDBC编程中,`PreparedStatement`是一个非常重要的接口,它用于预编译SQL语句,提高了数据库操作的效率和安全性。当我们处理大量重复的SQL操作时,使用`PreparedStatement`可以避免SQL注入等问题,同时提升...

    程序结合SQL语句结构,动态实现SQL多条件查询语句代码

    本文将深入探讨如何在程序中结合SQL语句结构,动态地实现SQL多条件查询,以提高开发效率并减少代码重复。我们将通过一个具体的示例,基于标签“SanYe”来阐述这一主题。 首先,理解SQL语句的基本结构是关键。一个...

    SQL_执行语句(查询和修改)

    - **解释**:使用`PreparedStatement`对象预编译SQL语句,允许参数化查询,提高效率并防止SQL注入攻击。在此示例中,`?`用作占位符,之后通过`setInt`和`setString`方法设置具体值。 ##### 2. `UPDATE`语句基础 - ...

    页面传入多个条件——sql语句的拼接

    在IT领域,特别是数据库操作与查询方面,SQL语句的动态构建是一项非常实用且重要的技能。根据提供的文件信息,我们可以深入探讨如何通过条件拼接来构造SQL查询语句,这在实际开发中极为常见。 ### SQL语句拼接的...

    SQL语句拼接

    在实际开发过程中,为了实现动态SQL查询的功能,开发者常常需要根据不同的条件来构造SQL语句。这种根据条件动态生成SQL的过程就被称为SQL语句拼接。这种方式尤其适用于那些查询条件不确定或可变的场景,例如用户可以...

    SQL语句大全(很全)sql语句用法

    ### SQL语句大全详解 #### 一、概述 SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。本文档提供了一套全面的SQL语句及其用法,适用于MySQL、Oracle和SQL Server等主流数据库系统。这些SQL...

    连接jdbc时sql语句统一设置参数

    在Java编程中,连接数据库并执行SQL语句是常见的任务,而`JDBC`(Java Database Connectivity)就是实现这一目标的接口和API。本篇将深入讲解如何在使用JDBC时,通过统一的方式设置SQL语句中的参数,提高代码的...

    JDBC的动态SQL语句在浏览器_服务器模式中的应用.pdf

    "JDBC的动态SQL语句在浏览器_服务器模式中的应用.pdf" JDBC(Java Database ...JDBC的动态SQL语句在浏览器/服务器模式中的应用可以提高应用程序的灵活性和可维护性,但是需要正确地使用这种技术来避免安全性问题。

    在高校教学系统开发中动态SQL语句的应用.pdf

    具体操作方式为,首先使用PREPARE语句从SQL语句模板创建动态阶段区,然后使用EXECUTE执行带参数的SQL语句,例如:PREPARE DynamicStagingArea FROM SQLStatement USING TransactionObject; EXECUTE ...

    PowerBuilder中动态SQL语句的应用.pdf

    此外,使用动态SQL语句还可以在程序中根据不同情况动态地生成不同的查询语句,从而提高程序的灵活性和适应性。但同时,动态SQL的使用也增加了编程的复杂度和调试的难度,因此需要程序员在实际开发中权衡利弊。 文章...

    SQL语句大全大全

    根据提供的信息,我们可以总结出以下详细的SQL知识点...以上是SQL语句的一些基础和进阶知识点,涵盖了数据操作、数据定义、数据控制、事务控制以及程序化SQL等方面。这些知识对于学习和使用SQL进行数据库管理非常重要。

    C++链接SQL Server,用SQL语句查询数据库中的内容

    本文将深入探讨如何使用C++与SQL Server交互,并通过SQL语句查询数据库中的内容。 首先,要实现C++与SQL Server的连接,我们需要一个中间库来处理底层的通信和数据转换。ODBC(Open Database Connectivity)和ADO...

Global site tag (gtag.js) - Google Analytics