ResultSet底层和Statement

本文介绍了JDBC中的ResultSet对象,它是数据库查询结果的表示,通过Statement执行SQL获取。ResultSet有一个光标,可以使用next()方法遍历数据。同时,文章还讲解了Statement对象及其在SQL注入中的风险。为了防止SQL注入,推荐使用PreparedStatement。文中提供了Statement的SQL注入示例,强调了不安全的字符串拼接造成的安全隐患。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次博客带领大家学习JDBC中的ResultSet底层和Statement。

ResultSet的基本介绍

  • ResultSet表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

  • ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。

ResultSet的案例

public class ResultSet_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properites"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, password);

        Statement statement = connection.createStatement();
        String sql = "select id,name,sex,borndate from actor";
        ResultSet resultSet = statement.executeQuery(sql);
        
        while (resultSet.next()){
            int id =resultSet.getInt(1);
            String name = resultSet.getString(2);
            String sex = resultSet.getString(3);
            Date date = resultSet.getDate(4);
            System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);
        }

        resultSet.close();
        statement.close();
        connection.close();
    }
}

Statement 的基本介绍

  1. Statement对象用于执行静态SQL语句并返回其生成的结果的对象。

  2. 在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过

    • Statement [存在SQL注入]
    • PreparedStatement [预处理]
    • CallableStatement [存储过程]
  3. Statement 对象执行SQL语句,存在SQL注入风险。

  4. SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。

  5. 要防范SQL注入,只要用PrepareStatement(从Statement扩展而来)取代Statement就可以了。

Statement 的SQL注入案例

public class Statement_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入管理员的名字:");
        String admin_name =scanner.nextLine();
        System.out.println("请输入管理员的密码");
        String admin_pwd=scanner.nextLine();
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properites"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, password);

        Statement statement = connection.createStatement();
        String sql = "select name,pwd from admin where name ='"+admin_name+"' and pwd ='"+admin_pwd+"'";
        ResultSet resultSet = statement.executeQuery(sql);
        if(resultSet.next()){
            System.out.println("恭喜登录成功!");
        }else{
            System.out.println("对不起,登陆失败");
        }
        resultSet.close();
        statement.close();
        connection.close();
    }
}
CREATE TABLE admin(
	NAME VARCHAR(32) NOT NULL UNIQUE,
	pwd VARCHAR(32) NOT NULL DEFAULT '') CHARACTER SET utf8;
	
INSERT INTO admin VALUES('tom','123');
  • 输入数据库不存在的数据也能登录成功!
    请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值