2.Statement的其他两种方法

本文介绍了一个使用Java JDBC进行数据库操作的示例,包括加载驱动、建立连接、执行SQL语句(查询、插入),以及处理结果集和更新数据。通过具体代码展示了如何使用PreparedStatement执行参数化的SQL语句,确保了代码的安全性和效率。
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;



public class Demo_main {

	public static void main(String[] args) throws Exception{

//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
//建立连接
			Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc的使用","root","root");
//执行SQL语句
			
	//还有2个其他的方法:
	//ps.executeQuery()主要用于查询,返回ResultSet;	
		    String s1 ="select * from student where age>?";
			PreparedStatement p1 = c.prepareStatement(s1);
			p1.setObject(1, 18);	//找到age大于18的数据
			//ps.execute();//返回的是布尔类型,返回是否有结果集
			ResultSet rs = p1.executeQuery();
			while(rs.next()) {
				System.out.println("id="+rs.getInt(1)+"   姓名="+rs.getString(2)+"   age="+rs.getString(3));
			}
		
	//ps.executeUpdate()主要用于insert/updata/delete,其实除了查询外其他操作都可以使用这个,返回更新的的函数
			String s2 ="insert into student (name,age) values(?,?)";
			PreparedStatement p2 = c.prepareStatement(s2);
			p2.setObject(1, "赵六");
			p2.setObject(2, 22);
			int i = p2.executeUpdate();
			System.out.println(i);
//关闭资源
			
			p1.close();
			p2.close();
			c.close();
			
			
	}

}

### JSQLParser 中 SetOperation 无法转换为 PlainSelect 的问题分析与解决方案 在使用 JSQLParser 解析 SQL 查询时,可能会遇到 `SetOperation cannot be cast to PlainSelect` 的错误。这是因为在解析某些复杂的 SQL 查询(如包含 `UNION` 或 `INTERSECT` 的查询)时,JSQLParser 将其解析为 `SetOperation` 类型,而不是 `PlainSelect`[^1]。 #### 错误原因 `PlainSelect` 是 JSQLParser 中表示简单 SELECT 查询的类,而 `SetOperation` 则用于表示涉及多个子查询的操作(如 UNION、INTERSECT 等)。当尝试将 `SetOperation` 强制转换为 `PlainSelect` 时,会抛出 `ClassCastException`,因为这两种类型并不兼容[^2]。 #### 解决方案 为了正确处理这种情况,需要检查解析后的查询是否为 `SetOperation` 类型,并根据具体需求进行处理。以下是一个示例代码,展示如何区分 `PlainSelect` 和 `SetOperation` 并分别处理: ```java import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SetOperationList; public class JSQLParserExample { public static void main(String[] args) { String sql = "SELECT * FROM table1 UNION SELECT * FROM table2"; try { Select selectStatement = (Select) CCJSqlParserUtil.parse(sql); if (selectStatement.getSelectBody() instanceof PlainSelect) { PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); System.out.println("This is a PlainSelect: " + plainSelect.toString()); } else if (selectStatement.getSelectBody() instanceof SetOperationList) { SetOperationList setOpList = (SetOperationList) selectStatement.getSelectBody(); System.out.println("This is a SetOperationList with " + setOpList.getSelects().size() + " selects."); } else { System.out.println("Unsupported select body type."); } } catch (JSQLParserException e) { e.printStackTrace(); } } } ``` #### 代码说明 1. 使用 `CCJSqlParserUtil.parse` 方法解析 SQL 查询。 2. 检查 `SelectBody` 的类型: - 如果是 `PlainSelect`,则直接处理。 - 如果是 `SetOperationList`,则提取其中的子查询列表。 3. 根据实际需求处理不同的查询类型[^3]。 #### 注意事项 - 在处理 `SetOperationList` 时,可以通过 `getSelects()` 方法获取所有子查询,并对每个子查询单独处理。 - 如果需要进一步解析子查询中的内容,可以递归调用解析逻辑。 ### 示例输出 对于输入 SQL `SELECT * FROM table1 UNION SELECT * FROM table2`,上述代码将输出: ``` This is a SetOperationList with 2 selects. ``` #### 总结 通过区分 `PlainSelect` 和 `SetOperationList`,可以有效避免 `ClassCastException`,并正确处理复杂的 SQL 查询结构[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值