专栏首页学习笔记持续记录中...JDBC 通过ResultSet执行查询操作(4)

JDBC 通过ResultSet执行查询操作(4)

对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查询结果集

使用ResultSet的步骤:

1、加载数据库驱动程序:Class.forName(驱动程序类) 2、通过用户名密码和连接地址获取数据库连接对象:DriverManager.getConnection(连接地址,用户名,密码) 3、构造查询SQL语句

  1. 调用Statement 对象的executeQuery(sql) 可以得到结果集
  2. resultSet 实际上返回的就是一张数据表。有一个指针指向数据表的第一行的前面 6、处理结果 7、ResultSet 也需要关闭资源
  3. 可以调用next()方法检测下一行是够有效。若有效该方法返回true,且指针下移。相当于Interator对象的hasNext()和next()方法的结合体
  4. 当指针定位到一行时,可以通过getXxx(index)或getXxx(columnName) 获得每一列的值。例如:getInt(1),getString("name");
// 表结构
create database mydb; # 创建数据库

use mydb;#使用数据库

create table customer_table( #创建分类表
id int PRIMARY KEY AUTO_INCREMENT,  
name varchar(100),
age varchar(100),
birth DATE
);
class MyTest {
    // 关闭数据库资源(注意关闭要从里到外)
    public void releaseDB(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 获取数据库连接
    public Connection myConnection() throws Exception {
        String driverClass = "com.mysql.jdbc.Driver";
        String jdbcUrl = "jdbc:mysql://localhost:3306/mydb";
        String user = "user";
        String password = "password";

        Class.forName(driverClass);
        Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
        return connection;
    }
    public void  testResultSet(){
        Connection conn = null;
        Statement statement = null;
        ResultSet rs = null;
        try{
            // 1. 获得Connection
            conn = myConnection();
            // 2. 获取Statement
            statement = conn.createStatement();
            // 3. 准备SQL
            String sql = "select id,name,email,birth from customers where id = 4";
            // 4. 执行查询,得到ResultSet
            rs = statement.executeQuery(sql);
            // 5. 处理ResultSet
            while(rs.next()){
                int id = rs.getInt(1);
                String name = rs.getString("name");
                String email = rs.getString(3);
                Date birth = rs.getData(4);
                System.out.println(id);
                System.out.println(name);
                System.out.println(email);
                System.out.println(birth);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            releaseDB.release(rs,statement,conn);
        }
    }

    // 可以执行的sql:update、insert、delete
    public void myStatement() throws SQLException {
        Connection conn = null;
        Statement statement = null;
        try {
            // 1. 获取数据库连接
            conn = myConnection();
            // 2. 准备执行的SQL
            String sql = "Insert into table(name,email,birth) values('xyz','xyz@123.com','xxxx-xx-xx')";
            // 3. 执行SQL(注意执行的SQL可以是INSERT、UPDATE或DELETE。但不能是SELECT)
            // 1)获取操作SQL语句的Statement对象
            // 通过调用Connection的createStatement()方法来获取
            statement = conn.createStatement();
            // 2)调用Statement对象的executeUpdate(sql)执行SQL语句进行插入
            statement.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (statement != null) {
                try {
                    statement.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

ResultSetMetaData类

利用ResultSet的getMetaData的方法可以获得ResultSetMetaData对象,ResultSetMetaData存储了 ResultSet对象中列的类型和属性信息的对象。

常见API

// 方法说明:获取指定列的名称
getColumnName(int column):
// 方法说明:返回当前ResultSet对象中的列数
getColumnCount():
// 获取用于打印输出和显示的指定列的建议标题。
String getColumnLabel(int column)
public void myTest01() throws ClassNotFoundException, SQLException {
    String driverClass = "com.mysql.jdbc.Driver";
    String jdbcUrl = null;
    String user = null;
    String password = null;
    Class.forName(driverClass);
    Connection connection = DriverManager.getConnection(jdbcUrl, user, password);
    String sql = "SELECT flow_id flowId, type, id_card idCard, "
                + "exam_card examCard, student_name studentName, "
                + "location, grade " + "FROM examstudent WHERE flow_id = ?";
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setInt(1, 5);
    resultSet = preparedStatement.executeQuery();
    ResultSetMetaData rsmd = resultSet.getMetaData();
    String columnName = rsmd.getColumnName(1); // 获取指定列的名称
    int columCount = rsmd.getColumnCount();// 返回当前ResultSet对象中的列数
    String columnLabel= rsmd.getColumnLabel(1);//获取用于打印输出和显示的指定列的建议标题。
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDBC 批量处理(13)

    1)当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据批量处理。通常情况下比单独提交处理更有效率

    桑鱼
  • @RequestParam 注解(3)

    桑鱼
  • Java基础:五、方法重载(2)

    在Java里,构造器是强制重载方法名的另一个原因。既然构造器的名字已经由类名所决定,就只能有一个构造器名,如果想用多种方式创建一个对象该怎么办呢?这就需要两个构...

    桑鱼
  • hz(赫兹)

    与Date.now不同的是,performance.now返回的时间戳没有被限制在一毫秒的精确度内,他使用浮点数来达到微秒级别的精度。

    公众号@魔术师卡颂
  • 使用Jexus 容器化您的 Blazor 应用程序

    在本文中,我们将介绍如何将 Blazor 应用程序放入Jexus 容器以进行开发和部署。我们将使用 .NET Core CLI,因此无论平台如何,使用的命令都...

    张善友
  • Python获取文件夹的名字

    机器学习和大数据挖掘
  • 用sklearn封装的kmeans库

    机器学习和大数据挖掘
  • C#创建Windows Service(Windows 服务)基础教程

    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基...

    跟着阿笨一起玩NET
  • 【程序源代码】工作流Activiti不错的学习资料总结

    在第一家公司工作的时候主要任务就是开发OA系统,当然基本都是有工作流的支持,不过当时使用的工作流引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的),名称叫...

    程序源代码
  • 关于光纤宽带技术,看这一篇就够啦!

    很抱歉地提醒大家:虽然感觉已经热了很久,但是实际上,昨天才是入伏的第一天。接下来,我们将进入一年当中最炎热的时期。

    鲜枣课堂

扫码关注云+社区

领取腾讯云代金券