有时候,我们有这样的需求,需要清空多个表的内容,这样我们有两种做法,可用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("清空表完毕");
}
运行结果正常。
分享到:
相关推荐
总的来说,预编译语句PreparedStatement是Java JDBC中提高性能和保障安全性的重要工具,尤其是在处理大量重复的SQL操作和处理用户输入时。正确使用PreparedStatement,能够有效地优化数据库操作,并增强应用程序的...
PreparedStatement是Java JDBC中用于执行预编译SQL语句的接口,它是Statement的子接口。预编译的SQL语句可以提高数据库操作的性能和安全性。在数据库系统中,预编译意味着SQL语句在首次执行前已经过编译,形成一个...
在执行SQL语句时,我们通常使用`PreparedStatement`而非`Statement`,因为`PreparedStatement`支持预编译的SQL语句,能有效防止SQL注入攻击,并且允许我们以参数化的方式设置SQL语句中的值。这种方式不仅提高了效率...
SQL语句填充占位符是一种编程技术,它允许我们创建一个带有占位符的静态SQL模板,然后在运行时根据实际参数动态地替换这些占位符。这种方法提高了代码的可读性和安全性,减少了手动构造SQL字符串的需求。 在Java中...
【Java Web应用开发中的预编译SQL语句】 在Java Web应用开发中,预编译SQL语句(PreparedStatement)是一种高效且安全的方式来执行数据库操作。本案例主要关注如何使用PreparedStatement来添加商品信息到数据库,这...
在Java数据库连接(JDBC)中,增删改查(CRUD)操作是与数据库交互的基础,事务处理、批处理和预编译SQL语句则是提高效率和保证数据一致性的关键技术。以下是对这些概念的详细说明: 1. **JDBC增删改查(CRUD)**:...
虽然题目主要涉及预编译语句,但存储过程也是数据库操作中的重要组成部分。存储过程是一组预编译的SQL语句,存储在数据库中,可以通过调用来执行。在Java中,可以使用CallableStatement来调用存储过程,类似于...
PreparedStatement接口实现了预编译功能,允许我们在SQL语句中使用占位符(如`?`),然后在执行时动态设置参数。这有以下优点: - 提高性能:预编译的SQL语句可以重复使用,避免了每次执行时的编译过程。 - 防止...
预编译语句可以提高查询性能,防止SQL注入攻击。示例可能演示了如何创建预编译的SQL语句,并使用占位符(问号)来传递参数。 5. **批处理操作**: 批处理允许一次性发送多个SQL语句到数据库,从而减少网络开销。...
- 设置参数:使用`SET`语句为预编译语句的占位符设置值,如:`SET @str='b1';` - 执行阶段:使用`EXECUTE`语句执行预编译的语句,并传递参数,例如:`EXECUTE myfun USING @str;` 如果需要多次执行相同的预编译语句...
预编译SQL语句,也称为PreparedStatement,是Java JDBC提供的一种优化机制,主要解决动态SQL执行时的性能问题和防止SQL注入攻击。 在案例中,首先我们看到一个名为`pre_insert.jsp`的JSP文件,它是用于处理用户提交...
要获取这个预编译语句在执行时的具体SQL,我们需要深入到JDBC驱动的内部或者利用一些第三方工具。由于源码标签的提及,我们可能需要查看JDBC驱动的实现细节,比如MySQL JDBC驱动或Oracle JDBC驱动。这些驱动在执行`...
预编译语句在首次创建时解析SQL,然后只需替换占位符即可多次使用,减少了解析和编译的时间。 五、注意事项 1. 适当设置批处理大小:根据数据库和应用需求调整批处理中SQL语句的数量,过大可能导致内存问题,过小则...
Spring JDBC模块是为了简化传统的JDBC操作而设计的,它通过提供模板类和事务管理器,使得开发者可以避免手动处理数据库连接、预编译SQL语句和异常转换等繁琐工作。 2. **Spring JDBC核心组件** - **JdbcTemplate*...
3. **使用预编译语句**:相较于传统的`Statement`,`PreparedStatement`不仅可以提高性能,还可以有效防止SQL注入攻击。 - 在示例代码中,可以看到使用了`PreparedStatement`来执行插入操作。 4. **连接池的使用**...
1. **预编译语句(PreparedStatement)**:使用预编译的SQL语句,可以有效防止注入。因为参数是分开处理的,不会被当作SQL命令的一部分。 2. **参数化查询**:在SQL语句中使用占位符,如`?`,然后通过`setXXX()`...
此外,使用PreparedStatement可以防止SQL注入攻击,通过预编译SQL语句并用占位符替换动态参数。 **性能优化**:SQLJDBC4还提供了性能优化选项,例如批处理操作,允许一次提交多个SQL语句,减少网络往返次数。还可以...
在Java编程中,JDBC(Java Database Connectivity)...正确地使用预编译的`PreparedStatement`可以提高代码的可读性和安全性,同时,通过设置`RETURN_GENERATED_KEYS`属性,我们可以轻松地获取新插入记录的自增主键值。
接下来,我们讨论预编译语句(PreparedStatement),这是JDBC提供的一种高效且安全的SQL执行方式。预编译语句可以防止SQL注入攻击,因为它们允许在执行前对SQL语句进行验证。此外,由于数据库可以提前解析和优化预...
使用JdbcTemplate可以避免手动管理连接、预编译语句、结果集处理等繁琐工作,从而降低出错的可能性。 **2. NamedParameterJdbcTemplate** NamedParameterJdbcTemplate是JdbcTemplate的扩展,支持命名参数,使得SQL...