`
qindongliang1922
  • 浏览: 2188882 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117670
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126075
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60034
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71402
社区版块
存档分类
最新评论

JDBC预编译语句表名占位异常

阅读更多
有时候,我们有这样的需求,需要清空多个表的内容,这样我们有两种做法,可用delete from table 或 truncate table table,两种方法视情况而定,前者只是一条条的删除表数据,主键自增的序列还能保存,后者类似是重新建表保留表结构,主键信息,也被清空。

OK,下面我们用JDBC开始删除,因为是多个表,所以要循环删除,根据以往的经验,使用预编译的sql语句,可能执行效率会更高,短短几行代码,搞定:

public void clearTables()throws Exception{
		String table[]={"person","student"};
		Connection con=this.getConnection();
		String sql="truncate table ? ";

		PreparedStatement ps=con.prepareStatement(sql);
		for(String t : table){
			ps.setString(1, t);
			ps.executeUpdate();	
		}
		System.out.println("清空表完毕");	
	}


运行之后,报如下异常:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table 'td_analysis_ebay_result'' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361)
	at com.db.DBHelper.clearTable1(DBHelper.java:82)
	at com.db.DBHelper.main(DBHelper.java:155)


异常提示是语法有问题,但仅从表面上看去,写法并没有问题,经查阅,发现动态绑定,是不支持表名绑定的,无论select,delete还是update语句,使用预编译绑定都会发生语法错误,而字段的动态绑定是支持的,既然,不支持,那么就只能用拼接的做法,来清空多个表内容了,代码如下:
	public void clearTable()throws Exception{
		String table[]={"a","b"};
		Connection con=this.getConnection();
		for(String t : table){
			String sql="truncate table "+t;
			PreparedStatement ps=con.prepareStatement(sql);
			ps.executeUpdate();	
		}
		System.out.println("清空表完毕");	
	}


运行结果正常。
0
0
分享到:
评论

相关推荐

    java_JDBC预编译相关知识点参照.pdf

    总的来说,预编译语句PreparedStatement是Java JDBC中提高性能和保障安全性的重要工具,尤其是在处理大量重复的SQL操作和处理用户输入时。正确使用PreparedStatement,能够有效地优化数据库操作,并增强应用程序的...

    JDBC之PreparedStatement类中预编译的综合应用解析

    PreparedStatement是Java JDBC中用于执行预编译SQL语句的接口,它是Statement的子接口。预编译的SQL语句可以提高数据库操作的性能和安全性。在数据库系统中,预编译意味着SQL语句在首次执行前已经过编译,形成一个...

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

    在执行SQL语句时,我们通常使用`PreparedStatement`而非`Statement`,因为`PreparedStatement`支持预编译的SQL语句,能有效防止SQL注入攻击,并且允许我们以参数化的方式设置SQL语句中的值。这种方式不仅提高了效率...

    SQL语句填充占位符

    SQL语句填充占位符是一种编程技术,它允许我们创建一个带有占位符的静态SQL模板,然后在运行时根据实际参数动态地替换这些占位符。这种方法提高了代码的可读性和安全性,减少了手动构造SQL字符串的需求。 在Java中...

    Java Web应用开发 34 课堂案例-使用预编译SQL语句.docx

    【Java Web应用开发中的预编译SQL语句】 在Java Web应用开发中,预编译SQL语句(PreparedStatement)是一种高效且安全的方式来执行数据库操作。本案例主要关注如何使用PreparedStatement来添加商品信息到数据库,这...

    jdbc 增删改查事物处理, 批处理,以及预编译示例代码

    在Java数据库连接(JDBC)中,增删改查(CRUD)操作是与数据库交互的基础,事务处理、批处理和预编译SQL语句则是提高效率和保证数据一致性的关键技术。以下是对这些概念的详细说明: 1. **JDBC增删改查(CRUD)**:...

    Java Web程序设计-1期 项目库_单元案例_预编译和存储过程操作教学案例.doc

    虽然题目主要涉及预编译语句,但存储过程也是数据库操作中的重要组成部分。存储过程是一组预编译的SQL语句,存储在数据库中,可以通过调用来执行。在Java中,可以使用CallableStatement来调用存储过程,类似于...

    第10章 JDBC-课后习题1

    PreparedStatement接口实现了预编译功能,允许我们在SQL语句中使用占位符(如`?`),然后在执行时动态设置参数。这有以下优点: - 提高性能:预编译的SQL语句可以重复使用,避免了每次执行时的编译过程。 - 防止...

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

    要获取这个预编译语句在执行时的具体SQL,我们需要深入到JDBC驱动的内部或者利用一些第三方工具。由于源码标签的提及,我们可能需要查看JDBC驱动的实现细节,比如MySQL JDBC驱动或Oracle JDBC驱动。这些驱动在执行`...

    Oracle 官方 JDBC Demo JAVA

    预编译语句可以提高查询性能,防止SQL注入攻击。示例可能演示了如何创建预编译的SQL语句,并使用占位符(问号)来传递参数。 5. **批处理操作**: 批处理允许一次性发送多个SQL语句到数据库,从而减少网络开销。...

    MySQL预编译功能详解

    - 设置参数:使用`SET`语句为预编译语句的占位符设置值,如:`SET @str='b1';` - 执行阶段:使用`EXECUTE`语句执行预编译的语句,并传递参数,例如:`EXECUTE myfun USING @str;` 如果需要多次执行相同的预编译语句...

    JAVA Web程序设计-3期(KC006) 08单元案例_预编译和存储过程操作教学案例.doc

    预编译SQL语句,也称为PreparedStatement,是Java JDBC提供的一种优化机制,主要解决动态SQL执行时的性能问题和防止SQL注入攻击。 在案例中,首先我们看到一个名为`pre_insert.jsp`的JSP文件,它是用于处理用户提交...

    使用JDBC的批处理功能

    预编译语句在首次创建时解析SQL,然后只需替换占位符即可多次使用,减少了解析和编译的时间。 五、注意事项 1. 适当设置批处理大小:根据数据库和应用需求调整批处理中SQL语句的数量,过大可能导致内存问题,过小则...

    springJdbcDemo11_java_springjdbc_

    Spring JDBC模块是为了简化传统的JDBC操作而设计的,它通过提供模板类和事务管理器,使得开发者可以避免手动处理数据库连接、预编译SQL语句和异常转换等繁琐工作。 2. **Spring JDBC核心组件** - **JdbcTemplate*...

    jsp技术中JDBC的规范

    3. **使用预编译语句**:相较于传统的`Statement`,`PreparedStatement`不仅可以提高性能,还可以有效防止SQL注入攻击。 - 在示例代码中,可以看到使用了`PreparedStatement`来执行插入操作。 4. **连接池的使用**...

    JDBC数据库

    1. **预编译语句(PreparedStatement)**:使用预编译的SQL语句,可以有效防止注入。因为参数是分开处理的,不会被当作SQL命令的一部分。 2. **参数化查询**:在SQL语句中使用占位符,如`?`,然后通过`setXXX()`...

    sqljdbc和sqljdbc4

    此外,使用PreparedStatement可以防止SQL注入攻击,通过预编译SQL语句并用占位符替换动态参数。 **性能优化**:SQLJDBC4还提供了性能优化选项,例如批处理操作,允许一次提交多个SQL语句,减少网络往返次数。还可以...

    jdbc 插入记录并返回自增主键值

    在Java编程中,JDBC(Java Database Connectivity)...正确地使用预编译的`PreparedStatement`可以提高代码的可读性和安全性,同时,通过设置`RETURN_GENERATED_KEYS`属性,我们可以轻松地获取新插入记录的自增主键值。

    在JSP中访问数据库

    接下来,我们讨论预编译语句(PreparedStatement),这是JDBC提供的一种高效且安全的SQL执行方式。预编译语句可以防止SQL注入攻击,因为它们允许在执行前对SQL语句进行验证。此外,由于数据库可以提前解析和优化预...

    Spring JDBC应用实例讲解

    使用JdbcTemplate可以避免手动管理连接、预编译语句、结果集处理等繁琐工作,从而降低出错的可能性。 **2. NamedParameterJdbcTemplate** NamedParameterJdbcTemplate是JdbcTemplate的扩展,支持命名参数,使得SQL...

Global site tag (gtag.js) - Google Analytics