JavaWeb | JDBC相关API详解 2 (内附以集合形式输出表)

news2025/1/16 2:39:31

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:🔥JDBC
Java入门篇: 🔥Java基础学习篇
Java进阶学习篇(持续更新中):🔑Java进阶学习篇

在这里插入图片描述

文章目录

  • 一、前言
  • 二、Statement
    • 1.概述
    • 2.方法摘要
  • 三、ResultSet
    • 1.概述
    • 2.方法摘要
      • 1️⃣getXXX(int columnIndex)
      • 2️⃣boolean next()
  • 四、将表中数据存储到集合中
    • 1.创建实体类
    • 2.查询表数据
    • 3.创建集合
    • 4.获取数据并赋值
    • 5.将数据存入集合
    • 6.打印输出集合
    • 7.释放资源
    • 8.完整代码
  • 五、结语

一、前言

这篇文章中会对【JavaWeb | JDBC概述及IDEA连接MySQL】中提到的API做出详细的解释,帮助大家理解,加深印象,以便于在接下来的学习过程中不用去死记硬背每一行代码,而是理解了去编写代码(知道原理在面试中也是很重要的)

二、Statement

1.概述

Statement 对象表示基本语句,其中将单个方法应用于某一目标和一组参数,以返回结果,比如 “a.setFoo(b)”。

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样

2.方法摘要

这里只需要知道其方法即可,接下来的重点会在ResultSet中详细描述

//获取执行sql的对象
Statement stmt = c.createStatement();

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

在这里插入图片描述

三、ResultSet

1.概述

从API帮助文档中可以看到该方法的描述

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

ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。

默认的 ResultSet对象不可更新,仅有一个向前移动的光标。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。可以生成可滚动和/或可更新的 ResultSet 对象。

一般在修改数据库中的某个字段的值、删除某个字段或者将表中的数据封装到一个集合中时会用到这个方法;即在执行完SQL语句以后要有一个变量去接收它,然后再调用set方法进行复制后调用get方法来获取值

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

2.方法摘要

1️⃣getXXX(int columnIndex)

以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值

在这里插入图片描述

代码实现

//定义SQL语句
String sql = "SELECT * FROM user ";

//获取执行sql的对象
Statement stmt = c.createStatement();

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

//获取此 ResultSet 对象的当前行中指定列的值
int id = result.getInt("id");

在IDEA中有快捷键,当我们输入了右边的result.getInt("id")后,使用快捷键Ctrl+Alt+V可以一键生成左边,并且其变量名也可以自己选择,就不用自己去书写了,而且连数据类型也自动生成了!
在这里插入图片描述

2️⃣boolean next()

将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推

在这里插入图片描述
第一次箭头是指向表头行,如下图所示
在这里插入图片描述
当我们调用了 next() 方法后,光标就下移到第一行数据,并且方法返回true,此时就可以通过 getInt("id") 获取当前行id字段的值,也可以通过 getString("name") 获取当前行name字段的值。如果想获取下一行的数据,继续调用 next() 方法,以此类推。
在这里插入图片描述
直到最后一行,再调用next()方法的话,就是无效行,因为这时候箭头指向空,那么想要将表中数据放入集合中就可以使用next()方法,再套用一个while循环。当箭头指向有效行时,用get方法取出表中数据,再调用set方法对集合内的属性进行赋值。

四、将表中数据存储到集合中

1.创建实体类

由于我们数据库中的表名是user,所以这里定义实体类的名字就是User;在这个实体类中定义的成员变量就是表中的字段名(id,name,money)这里要和表中一致,否则容易出错

然后使用快捷键一键生成JavaBean类,并使用Alt+Insert快捷键重写toString类(一定要重写toString类,否则无法生成)具体的原因可以参照这篇文章回顾一下

public class User {
    private int id;
    private String name;
    private double money;

    public User() {
    }

    public User(int id, String name, double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }

    /**
     * 获取
     * @return id
     */
    public int getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return money
     */
    public double getMoney() {
        return money;
    }

    /**
     * 设置
     * @param money
     */
    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

2.查询表数据

这里代码与之前差不多,唯一不同的是在执行完SQL语句后要使用 ResultSet 方法来接收变量,以便于调用get和set方法(变量名可以自己取,这里为了可读性所以使用小写的result

		//注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获取连接
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection c = DriverManager.getConnection(url,username,password);

        //定义sql
        String sql = "SELECT * FROM user ";

        //获取执行sql的对象
        Statement stmt = c.createStatement();

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

3.创建集合

这里List后的名字取决于你的实体类名字

List<User> list = new ArrayList<>();

4.获取数据并赋值

首先我们要新建一个User对象user才能用来给集合内的变量赋值


//新建User对象
User user = new User();
int id = result.getInt("id");
String name = result.getString("name");
double money = result.getInt("money");

//set方法进行赋值
user.setId(id);
user.setName(name);
user.setMoney(money);

5.将数据存入集合

//add方法存入集合
list.add(user);

6.打印输出集合

System.out.println(list);

7.释放资源

//释放资源
result.close();
stmt.close();
c.close();

8.完整代码

import pojo.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class jdbcDemo2 {
    public static void main(String[] args) throws Exception {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //获取连接
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
        String username = "root";
        String password = "123456";
        Connection c = DriverManager.getConnection(url,username,password);

        //定义sql
        String sql = "SELECT * FROM user ";

        //获取执行sql的对象
        Statement stmt = c.createStatement();


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

        //创建集合
        List<User> list = new ArrayList<>();
        
        //遍历表
        while (result.next()){

            //新建User对象
            User user = new User();

            //get方法获取数据
            int id = result.getInt("id");
            String name = result.getString("name");
            double money = result.getInt("money");

            //set方法进行赋值
            user.setId(id);
            user.setName(name);
            user.setMoney(money);

            //add方法存入集合
            list.add(user);
        }

        //输出集合
        System.out.println(list);

        //释放资源
        result.close();
        stmt.close();
        c.close();

    }
}

五、结语

接下来会讲述有关于SQL注入相关问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言编程题

1、求斐波那契数列1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8……前20项之和 #include<stdio.h> int main() {int i,j,k,t2;ij1;printf("%d %d\n",i,j);for(k0;k<9;k){iij;jij;ttij;printf("%d %d\n",i,j);}printf(&q…

java七大查找 十大排序 贪心

七大查找 1.1二分查找(前提是 数据有序)说明&#xff1a;元素必须是有序的&#xff0c;从小到大&#xff0c;或者从大到小都是可以的。public static int binarySearc(int[] arr,int number){int min0;int maxarr.length-1;while(true){if(min>max){return -1;}int mid(maxm…

c++二插搜索树

1二插搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: ​ 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 ​ 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 …

mongodb shell

连接指定数据库 .\mongosh.exe localhost:27017/test不连接数据库 .\mongosh.exe --nodb然后连接数据库 conn new Mongo("localhost:27017") /// mongodb://localhost:27017/?directConnectiontrue&serverSelectionTimeoutMS2000 db conn.getDB("test&q…

Git学习笔记(黑马)

目录 一、获取本地仓库 二、为常用指令配置别名 三、基础操作指令 四、分支 五、Git远程仓库&#xff08; 码云Gitee&#xff09; &#xff08;一&#xff09;配置SSH公钥 &#xff08;二&#xff09;Gitee设置账户公钥 六、操作远程仓库 &#xff08;一&#xff09;添…

【数据结构】详谈复杂度

目录 1.前言 2.什么是复杂度 3.如何计算时间复杂度 1.引例 2.二分查找 3.常见的复杂度 4.如何计算空间复杂度 5.关于递归 6.总结 1.前言 我们在做一些算法题时&#xff0c;经常会发现题目会对时间复杂度或者空间复杂度有所要求&#xff0c;如果你不知道什么是复杂度时&am…

SQL--DDL

目录 一、数据库的相关概念 二、MySQL数据库 1. 关系型数据库&#xff08;RDBMS&#xff09; 2. 数据数据库 3. MySQL客户端连接的两种方式 方式一&#xff1a;使用MySQL提供的客户端命令行工具 方式二&#xff1a;使用系统自带的命令行工具执行指令 三、SQL SQL的…

【C++】深浅拷贝

最近一些老铁一直问我深浅拷贝的问题&#xff0c;今天我们就来介绍一下深浅拷贝在说深浅拷贝构造之前&#xff0c;我们先介绍一下拷贝构造函数的应用场景&#xff1a;使用另一个同类型的对象来初始化新创建的对象。浅拷贝我们在学类和对象时了解到了类的6大默认函数&#xff0c…

给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差值正好为k,那么可以凑在一起比赛 一局比赛只有两个人,返回最多可以同时有多少场比赛

目录题目描述题目解析代码实现对数器题目描述 给定一个数组arr&#xff0c;代表每个人的能力值。再给定一个非负数k&#xff0c;如果两个人能力差值正好为k&#xff0c;那么可以凑在一起比赛一局比赛只有两个人&#xff0c;返回最多可以同时有多少场比赛 比如&#xff1a; [3&a…

MyBatis的入门

1、Mybatis的简介和特性 2、环境配置及其注意事项 2.1、注意事项 本文示例&#xff0c;开发环境 IDE&#xff1a;idea 2019.2 构建工具&#xff1a;maven 3.8.6 MySQL版本&#xff1a;MySQL 8 MyBatis版本&#xff1a;MyBatis 3.5.7 MySQL不同版本的注意事项&#xff1a;…

Allegro如何自动做差分对内等长操作指导

Allegro如何自动做差分对内等长操作指导 在做PCB设计的时候,需要给差分做对内等长,如果差分对比较多,Allegro支持自动做差分对内等长,如下图 具体操作如下 选择Route选择Auto-interactive Phase Tu

【UE4】将pmx导入到ue4中(obj-zip-mixamo绑骨)|模之屋模型导入UE4(较详细)

前言&#xff1a;我用fbx导入mixamo会报错&#xff0c;所以想用obj格式试试。 fbx导入↓ 效果预览&#xff1a; 目录 1.下载模型 2. 为blender安装插件 3.打开blender ​编辑 要删掉默认生成的方块&#xff01;&#xff01;&#xff01; 4.帮老婆找衣服环节&#xff01;&…

CSS定位属性详解

一、简介 1.文档流 在介绍postion之前&#xff0c;有必要先了解下文档流。 简单说就是元素按照其在 HTML 中的位置顺序决定排布的过程。HTML的布局机制就是用文档流模型的&#xff0c;即块元素&#xff08;block&#xff09;独占一行&#xff0c;内联元素&#xff08;inline…

【唐诗学习】三、盛唐诗歌的老大哥

三、盛唐诗歌的老大哥 1. 李白的伯乐——贺知章 在聊盛唐诗人之前&#xff0c;我们要先了解一位出生在初唐的大诗人&#xff1a;贺知章 盛唐诗歌虽然是中国文学的巅峰&#xff0c;但它不是蹿天猴&#xff0c;这个顶点不是“噌”一下就上的&#xff0c;需要有个老大哥把初唐诗…

Blender BMesh数据结构解密

BMesh 是一种非流形边界表示。 它旨在取代当前有限的 EditMesh 结构&#xff0c;解决 EditMesh 的许多设计限制和维护问题。 它与径向边结构相当。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 可编程 3D场景。 1、BMesh实体 在最基本的层面上&#xff0c;BMesh 将拓扑存储…

机器学习(一)——基础概念

小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。 最近换到新版编辑器写文章了&#xff0c;有的操作挺…

Eclipse导入python项目

导入python项目&#xff1a;https://blog.csdn.net/weixin_38917807/article/details/83046956想要导入的项目名称&#xff1a;“template-matching-ocr”路径&#xff1a;“D:\DeepLearning\cv\第九章&#xff1a;项目实战-信用卡数字识别\template-matching-ocr”方法一&…

这20个Pandas函数可以完成80%的数据科学工作

Pandas 是数据科学社区中使用最广泛的库之一&#xff0c;它是一个强大的工具&#xff0c;可以进行数据操作、清理和分析。本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容&#xff0c;到本文结束时&#xff…

【Linux】Linux调试器——gdb使用

前言 学习完 gcc/g 后我们已经能够在 Linux 下进行C/C编程了&#xff0c;但是既然涉及到了编程在怎么能没有调试呢&#xff1f;于是我们想更近一步的话就要学习gdb的使用了。由于Linux的服务器端没有图形化操作界面&#xff0c;用gdb进行调试你可能不太习惯&#xff0c;但这是必…

凌玮科技将在创业板上市:预计募资净额约8亿元,曾踩雷民生理财

近日&#xff0c;广州凌玮科技股份有限公司&#xff08;下称“凌玮科技”&#xff0c;SZ:301373&#xff09;开启申购&#xff0c;并于2023年1月19日披露了首次公开发行股票并在创业板上市网下发行初步配售结果等。本次冲刺上市&#xff0c;凌玮科技的发行价为33.73元/股&#…