Tag: prepared statement

Java PreparedStatement在execute()上抱怨SQL语法

这让我疯了……我在这里做错了什么? ArrayList toAdd = new ArrayList(); toAdd.add(“password”); try{ PreparedStatement pStmt = conn.prepareStatement(“ALTER TABLE testTable ADD ? varchar(100)”); for (String s : toAdd) { pStmt.setString(1, s); pStmt.execute(); } } catch (SQLException e) { e.printStackTrace(); } 结果是… 02:59:12,885 ERROR [STDERR] com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在第1行的”password’varchar(100)’附近使用正确的语法 但… ArrayList toAdd = new ArrayList(); toAdd.add(“password”); try{ Statement stmt = conn.prepareStatement(); for (String s […]

PreparedStatement setString(…)for all,即使cororesponding数据类型是一个整数

我遇到过以下代码,我觉得它做错了: (请注意,这是JDK 1.4.2,因此列表未键入) StringBuffer queryBuffer = new StringBuffer(); ArrayList temp = new ArrayList(); … queryBuffer.append(“and sb.POSTCODE = ? “); temp.add(postcode); … conn = ConnectionManager.getConnection(); pstmt = conn.prepareStatement(queryBuffer.toString()); 这就是我所关注的: for(int i=0; i<temp.size(); i++) { log.debug("setString("+ (i+1) + "," + (String)temp.get(i) + ")"); pstmt.setString(i+1, (String)temp.get(i)); } 但我已经注意到数据库中的一些相应的数据类型(字段)是整数,而日期,这会没问题吗?

“ORA-01008:并非所有变量都绑定”错误

我使用以下方法通过使用jdbc计算工资单,但“ORA-01008:并非所有变量绑定”错误都没有删除。 有什么想法吗? 我正在使用以下代码 public double getPayroll(){ ResultSet rs = null; ResultSet rs1 = null; ResultSet rs2 = null; Connection conn = null; PreparedStatement pstmt = null; try { conn = getDBConnection(); double dailyPay=0,basicPay=0,payroll2=0; int houseRent=0,convAllow=0,noOfPresents=0,empId=0; String q = “select e_id from employee”; pstmt = conn.prepareStatement(q); rs = pstmt.executeQuery(); while (rs.next()) { empId=rs.getInt(1); String q1 = […]

JDBC PreparedStatement中“null原语”的解决方法?

使用原始JDBC时,您可以参数化PreparedStatement如下所示: PreparedStatement statement = connection.prepareStatement(someSQLString); String someString = getSomeString(); Integer int = getSomeInteger(); statement.setString(1, someString); statement.setLong(2, 5L); statement.setInt(3, int); … 在这里,如果someString为null ,那很好 – 字符串可以为空。 但是如果getSomeInteger()返回null ,我们就会遇到问题。 PreparedStatement#setInt(int,int)将原始int为值,因此不能为null 。 但是,我可能希望上面第3列的null对于此特定记录为null是完全合理的。 毕竟,我曾经使用的每个RDBMS都允许数字(INT,LONG等)字段为NULLABLE … 那么解决方法是什么?

在查询中使用带间隔的prepareStatement时出错

运行此查询时SELECT SYSDATE + INTERVAL ‘7’ DAY FROM DUAL; 在像这样的prepareStatement PreparedStatement ps = connection.prepareStatement(“select sysdate + interval ? day from dual” ); ps.setString(1, “7”); ps.executeQuery(); 它会抛出exception,语法不好,显然是,因为我能够在sql-developer中运行相同的查询。 这是PreparedStatement的错误吗? 我可以将预备语句与间隔一起使用吗?

如何将ArrayList绑定到Oracle中的PreparedStatement?

我想知道是否有办法将ArrayList(或任何类型的List)绑定到PreparedStatement,最终将用于访问Oracle数据库。 我发现: PreparedStatement IN子句替代? 这似乎与我的问题类似,但这个问题更具体:我想将一个ArrayList绑定到一个PreparedStatement以在Oracle中使用,如果可能的话,这是如何实现的?

在没有预准备语句的情况下防止SQL注入(JDBC)

我有一个数据库日志appender,每隔一段时间就会将可变数量的日志行插入到数据库中。 我想以防止SQL注入的方式创建一个SQL语句,但不使用服务器端预处理语句(因为我在每个选择中都有可变数量的行,缓存它们不会有帮助,但可能会损害性能) 。 我也喜欢准备好的陈述的便利,并且更喜欢他们串起来。 有没有像“客户端准备好的声明”?

如何使用MySQL编写的语句缓存?

我如何利用MySQL的缓存预准备语句的能力? 使用预准备语句的一个原因是,如果要再次使用相同的预准备语句,则无需多次发送预准备语句本身。 Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/mydb” + “?cachePrepStmts=true”, “user”, “pass”); for (int i = 0; i < 5; i++) { PreparedStatement ps = conn.prepareStatement("select * from MYTABLE where id=?"); ps.setInt(1, 1); ps.execute(); } conn.close() 运行上面的Java示例时,我在mysqld日志文件中看到了5对Prepare和Execute命令。 将ps赋值移到循环之外会导致单个Prepare和5 Execute命令。 连接参数“cachePrepStmts = true”似乎没有任何区别。 使用Spring和Hibernate运行类似程序时,发送的Prepare命令数(1或5)取决于是否启用了cachePrepStmts连接参数。 Hibernate如何执行预准备语句以利用cachePrepStmts设置? 是否有可能使用纯JDBC模仿这个? 我在MySQL Server 4.1.22和mysql-connector-java-5.0.4.jar上运行它

在dbcp中使用PreparedStatement池

有人可以解释如何使用dbcp准确准备连接池吗? (如果可能,使用一些示例代码)。 我已经想出如何打开它 – 将KeyedObjectPoolFactory传递给PoolableConnectionFactory。 但是之后应该如何定义具体的准备陈述呢? 现在我只使用PoolingDataSource从池中获取连接。 如何使用池中的预准备语句?

Java JDBC – 多个预准备语句批量插入

使用JDBC(Oracle)我需要在两个表中的每一个中插入大约一千行。 像这样的东西: “INSERT INTO TABLE_A (A_ID, A_NAME, A_LAST_NAME) VALUES (MY_SEQUENCE.NEXTVAL, ?, ?)”; “INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (MY_SEQUENCE.CURRVAL, ?)”; 问题是两个表都是通过共同的顺序连接的,因此语句的顺序很重要。 如果我只有一张桌子那就很容易了。 在那种情况下我使用了代码: String insert = “Insert into TABLE_A(A_ID, A_NAME, A_LAST_NAME) values(MY_SEQUENCE.NEXTVAL, ?, ?)”; conn.setAutoCommit(false); PreparedStatement ps = conn.prepareStatement(insert); for(MyObject obj : myCollection) { ps.setString(1, obj.getName()); ps.setString(2, obj.getLastName()); ps.addBatch(); } ps.executeBatch(); conn.commit(); ps.close(); 但是这种方法只能使用一个准备好的语句,因此只能使用一个插入。 我该如何为这个问题提供解决方案?