Javaweb学习笔记之JDBC(十):获取 数据库元数据、参数元数据、结果集元数据

package com.demo.beanutils;

import com.demo.utils.JdbcUtils;
import org.junit.Test;

import java.sql.*;

/**
 * 元数据:数据库、表、列 等的定义信息;
 * 元数据包括:数据库元数据、参数元数据、结果集元数据;
 * 获取元数据的方法 一般都是以 MetaData 结尾;
 */
public class Demo2 {
    /**
     * 1、获取数据库元数据
     */
    @Test
    public void test1() throws Exception {
        // 获取数据库连接对象
        Connection conn = JdbcUtils.getConnection();

        // 获取数据库元数据
        DatabaseMetaData metaData = conn.getMetaData();

        System.out.println("URL:" + metaData.getURL());                                 // 获取数据库连接的 URL
        System.out.println("UserName:" + metaData.getUserName());                       // 获取数据库管理系统的用户名
        System.out.println("ProductName:" + metaData.getDatabaseProductName());         // 获取数据库的产品名称
        System.out.println("ProductVersion:" + metaData.getDatabaseProductVersion());   // 获取数据库的版本号
        System.out.println("DriverName:" + metaData.getDriverName());                   // 获取驱动程序的名称
        System.out.println("DriverVersion:" + metaData.getDriverVersion());             // 获取驱动程序的版本号
        System.out.println("ReadOnly:" + metaData.isReadOnly());                        // 获取数据库是否是只读的
    }

    /**
     * 2、获取参数元数据
     */
    @Test
    public void test2() throws Exception {
        // 获取数据库连接对象
        Connection conn = JdbcUtils.getConnection();
        // sql 语句
        String sql = "select * from users where username=? and password=?";
        // 预处理 sql 语句
        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 设置参数
        pstmt.setString(1, "rose");
        pstmt.setString(2, "123");
        // 执行 sql 语句,获取结果集
        ResultSet resultSet = pstmt.executeQuery();
        while(resultSet.next()){
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            System.out.println("username:" + username + ", password:" + password);
        }

        // 获取 参数元数据
        ParameterMetaData parameterMetaData = pstmt.getParameterMetaData();

        // 获取参数个数
        System.out.println("count:" + parameterMetaData.getParameterCount());

        // 获取 指定参数的 SQL类型(参数索引从 1 开始)
        // 注意:如果想使用此方法,必须在 url 的后面添加 generateSimpleParameterMetadata=true:生成简单的参数元数据
        // 返回值为 Types 类的枚举
        int type = parameterMetaData.getParameterType(1);
        if (type == Types.VARCHAR){
            System.out.println("参数1为 VARCHAR 类型");
        }
    }

    /**
     * 3、获取结果集元数据
     */
    @Test
    public void test3() throws Exception{
        // 获取数据库连接对象
        Connection conn = JdbcUtils.getConnection();
        // sql 语句
        String sql = "select * from users";
        // 预处理 sql 语句,得到 PreparedStatement 对象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 执行 sql 语句,获取结果集
        ResultSet resultSet = pstmt.executeQuery();
        while(resultSet.next()){
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            System.out.println("username:" + username + ", password:" + password);
        }

        // 获取 结果集元数据
        ResultSetMetaData metaData = pstmt.getMetaData();

        // 获取 resultSet 对象的列数
        int columnCount = metaData.getColumnCount();
        System.out.println("columnCount:" + columnCount);

        // 获取 指定列的名称(列索引从 1 开始)
        for (int i = 0; i < columnCount; i++) {
            String columnName = metaData.getColumnName(i + 1);
            System.out.print(columnName + ", ");
        }
        System.out.println();

        // 获取指定列的 SQL类型
        for (int i = 0; i < columnCount; i++) {
            int columnType = metaData.getColumnType(i + 1); // 列索引从 1 开始
            if (columnType == Types.INTEGER) {
                System.out.println("第" + (i + 1) + "列的数据类型为 INTEGER.");
            }else if (columnType == Types.VARCHAR){
                System.out.println("第" + (i + 1) + "列的数据类型为 VARCHAR.");
            }
        }
    }
}

其中 JdbcUtils.java:

package com.demo.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * jdbc 工具类
 */
public class JdbcUtils {

    // 连接数据库的 url:jdbc协议:数据库子协议://主机:端口/数据库
    private static String url = "jdbc:mysql://localhost:3306/day17?generateSimpleParameterMetadata=true";
    private static String username = "root";   // 用户名
    private static String password = "root";   // 密码

    // 将注册驱动程序放入 静态代码块中,程序一启动的时候执行,只执行一次
    static {
        try {
            // 注册驱动程序
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取 数据库连接对象
     */
    public static Connection getConnection() {
        try {
            // 获取数据库连接对象
            return DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 释放资源
     *
     * @param conn Connection 对象
     * @param stmt PreparedStatement 对象
     * @param rs ResultSet 对象
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null){
            try {
                rs.close();
            }catch (Exception e){
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值