Statement statement = connection.createStatement();
//使用executeQuery会返回一个结果集
ResultSet resultSet = statement.executeQuery(sql);
/*+--------+-----+----+
| name | age | id |
+--------+-----+----+
| sea | 12 | 1 |
| 路易斯 | 18 | 2 |
| louis | 12 | 4 |
| khan | 18 | 5 |
+--------+-----+----+
4 rows in set (0.02 sec)*/
//使用while循环取出数据
while(resultSet.next()){//让光标向后移动,如果没有更多行,则返回false
String name = resultSet.getString(1);//获取该行的第一列
int age = resultSet.getInt(2);//获取第二列
int id = resultSet.getInt(3);
System.out.println(name + "\t" + age + "\t" + id);
出现错误:
你的sql是怎么写的呢,确认你的resultSet返回的结果是按照你的列表一样的数据么
在发布问题的时候,建议说下问题背景,不然我们还得重新分析下你在实现啥需求,你的错误提示已经告诉你sea转换数字报错,前面的代码是否调用了什么函数?
已解决,在查询的时候,需要将查询列和查询的类型相匹配
都更换填字段名称试一下:
String sea=resultSet.getString("sea");
由于参考资料中的代码和问题并无直接关系,结合问题描述,我认为问题出在了#sql#这个变量的使用上,它可能被误认为是SQL语句的一部分而导致错误。我的建议是先检查一下代码中的#sql#出现的位置,并根据需要将其转义。可能的代码如下所示:
String sql = "SELECT * FROM table WHERE column LIKE '%" + escapedSQL + "%'";
这里,escapedSQL是之前已经通过一些规则进行了转义的SQL语句,用%进行模糊匹配。
对于转义SQL语句,可以使用Java提供的PreparedStatement来防止SQL注入攻击。这样,就可以让用户提供的信息不参与SQL编译过程,避免注入攻击的发生。
下面是一个PreparedStatement的使用示例:
try {
String sql = "SELECT * FROM table WHERE column LIKE ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, "%" + searchText + "%");
ResultSet rs = stmt.executeQuery();
} catch (SQLException ex) {
// handle SQLException
}
这里使用PreparedStatement进行模糊匹配,一定程度上避免了SQL注入攻击的发生。在使用PreparedStatement时需要注意,只有占位符'?'才能进行参数绑定,如果有其他字符也需要进行合适的转义处理。
除了PreparedStatement外,其他的一些安全编码的措施也可以帮助我们防止SQL注入攻击。例如,遵循最小特权原则,尽可能降低程序的权限,限制对数据库的访问。另外,可以使用安全的密码管理工具,加强密码的安全性,避免被猜解。
总之,防止SQL注入攻击需要在开发时考虑清楚,使用防护措施,避免程序受到攻击。