【Java开发】嘿马JavaWeb全技术开发第8篇:3.4 ResultSet,3.5 案例【附代码文档】

举报
小帅说java 发表于 2025/09/26 20:40:56 2025/09/26
【摘要】 MySQL基础 1,数据库相关概念 2,MySQL 3,SQL概述 4,DDL:操作数据库 6,navicat使用 7,DML mysql高级 1,约束 2,数据库设计 创建部门表 4,事务 JDBC 1,JDBC概述 2,JDBC快速入门 3,JDBC API详解 4,数据库连接池 Getting Started Mybatis练习 1,配置文件实现CRUD HTML&CSS

🏆🏆🏆教程全知识点简介:MySQL基础 1,数据库相关概念 2,MySQL 3,SQL概述 4,DDL:操作数据库 6,navicat使用 7,DML mysql高级 1,约束 2,数据库设计 创建部门表 4,事务 JDBC 1,JDBC概述 2,JDBC快速入门 3,JDBC API详解 4,数据库连接池 Getting Started Mybatis练习 1,配置文件实现CRUD HTML&CSS 1,HTML 2,CSS JavaScript 5,BOM 9,RegExp对象 HTTP&Tomcat&Servlet 1,Web概述 2, HTTP 3, Tomcat 4, Servlet 一、状态码大类 二、常见的响应状态码 Contributing to Apache Tomcat Code of Conduct How Can I Contribute? 1,Request和Response的概述 2,Request对象 JSP 3,JSP 原理 5,EL 表达式 6,JSTL标签 会话技术 1,会话跟踪技术的概述 2,Cookie 3,Session 4,用户登录注册案例 Filter&Listener&Ajax 1,Filter 2,Listener 3,Ajax 4,axios 5,JSON 6,案例 VUE&Element 1,VUE 3,综合案例 1,功能介绍 2,环境准备 3,查询所有功能 4,添加功能 6,批量删除 7,分页查询


📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/459689    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/460120    中查看

📚📚👉👉👉本站这篇博客:   https://bbs.huaweicloud.com/blogs/460859    中查看

✨ 本教程项目亮点

🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

3.4 ResultSet

3.4.1 概述

ResultSet(结果集对象)作用:

  • ==封装了SQL查询语句的结果。==

而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:

ResultSet  executeQuery(sql):执行DQL 语句,返回 ResultSet 对象

那么 就需要从 ResultSet 对象中获取 想要的数据。ResultSet 对象提供了操作查询结果数据的方法,如下:

boolean next() * 将光标从当前位置向前移动一行 * 判断当前行是否为有效行

方法返回值说明:

  • true : 有效航,当前行有数据
  • false : 无效行,当前行没有数据

xxx getXxx(参数):获取数据

  • xxx : 数据类型;如: int getInt(参数) ;String getString(参数)
  • 参数
  • int类型的参数:列的编号,从1开始
  • String类型的参数: 列的名称

如下图为执行SQL语句后的结果

image-20210725181320813

一开始光标指定于第一行前,如图所示红色箭头指向于表头行。当 调用了 next() 方法后,光标就下移到第一行数据,并且方法返回true,此时就可以通过 getInt("id") 获取当前行id字段的值,也可以通过 getString("name") 获取当前行name字段的值。如果想获取下一行的数据,继续调用 next() 方法,以此类推。

3.4.2 代码实现

[Visual Studio Code Java]

/**
  * 执行DQL
  * @throws Exception
  */
@Test
public void testResultSet() throws  Exception {
    //1. 注册驱动
    //Class.forName("com.mysql.jdbc.Driver");
    //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
    String url = "jdbc:mysql:///db1?useSSL=false";
    String username = "root";
    String password = "1234";
    Connection conn = DriverManager.getConnection(url, username, password);
    //3. 定义sql
    String sql = "select * from account";
    //4. 获取statement对象
    Statement stmt = conn.createStatement();
    //5. 执行sql
    ResultSet rs = stmt.executeQuery(sql);
    //6. 处理结果, 遍历rs中的所有数据
    /* // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //6.2 获取数据  getXxx()
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);

            System.out.println("--------------");

        }*/
    // 6.1 光标向下移动一行,并且判断当前行是否有数据
    while (rs.next()){
        //6.2 获取数据  getXxx()
        int id = rs.getInt("id");
        String name = rs.getString("name");
        double money = rs.getDouble("money");

        System.out.println(id);
        System.out.println(name);
        System.out.println(money);

        System.out.println("--------------");
    }

    //7. 释放资源
    rs.close();
    stmt.close();
    conn.close();
}

[Retrofit 文档]

3.5 案例

  • 需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中

image-20210725182352433

  • 代码实现

[Google Guava 文档]

[Javadoc 工具]

  /**
    * 查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
    * 1. 定义实体类Account
    * 2. 查询数据,封装到Account对象中
    * 3. 将Account对象存入ArrayList集合中
    */
  @Test
  public void testResultSet2() throws  Exception {
      //1. 注册驱动
      //Class.forName("com.mysql.jdbc.Driver");
      //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
      String url = "jdbc:mysql:///db1?useSSL=false";
      String username = "root";
      String password = "1234";
      Connection conn = DriverManager.getConnection(url, username, password);

      //3. 定义sql
      String sql = "select * from account";

      //4. 获取statement对象
      Statement stmt = conn.createStatement();

      //5. 执行sql
      ResultSet rs = stmt.executeQuery(sql);

      // 创建集合
      List<Account> list = new ArrayList<>();

      // 6.1 光标向下移动一行,并且判断当前行是否有数据
      while (rs.next()){
          Account account = new Account();

          //6.2 获取数据  getXxx()
          int id = rs.getInt("id");
          String name = rs.getString("name");
          double money = rs.getDouble("money");

          //赋值
          account.setId(id);
          account.setName(name);
          account.setMoney(money);

          // 存入集合
          list.add(account);
      }

      System.out.println(list);

      //7. 释放资源
      rs.close();
      stmt.close();
      conn.close();
  }

3.6 PreparedStatement

[Lettuce Redis 客户端]

PreparedStatement作用:

  • 预编译SQL语句并执行:预防SQL注入问题

对上面的作用中SQL注入问题大家肯定不理解。那 先对SQL注入进行说明.

3.6.1 SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行的方法。

在今天资料下的 day03-JDBC\资料\2. sql注入演示 中修改 application.properties 文件中的用户名和 ,文件内容如下:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234

在MySQL中创建名为 test 的数据库

create database test;

在命令提示符中运行今天资料下的 day03-JDBC\资料\2. sql注入演示\sql.jar 这个jar包。

image-20210725184701026

此时 就能在数据库中看到user表

image-20210725184817731

接下来在浏览器的地址栏输入 localhost:8080/login.html 就能看到如下页面

image-20210725185024731

就可以在如上图中输入用户名和 进行登陆。用户名和 输入正确就登陆成功,跳转到首页。用户名和 输入错误则给出错误提示,如下图

image-20210725185320875

但是我可以通过输入一些特殊的字符登陆到首页。

用户名随意写, 写成 ' or '1' ='1

image-20210725185603112

这就是SQL注入,也是很危险的。当然现在市面上的系统都不会存在这种问题了,所以大家也不要尝试用这种方式去试其他的系统。

那么该如何解决呢?这里就可以将SQL执行对象 Statement 换成 `PreparedStateme

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。