#java.sql.ParameterMetaData

# 描述

ParameterMetadata接口用于获取PreparedStatement中绑定参数的类型与属性信息。

java.sql.ParameterMetaData是获取预编译SQL语句参数元数据的核心接口,能动态查询占位符的数量、类型、是否可为空等属性。

详细接口说明请参考JDBC官方网站 (opens new window)。

# 方法

YashanDB JDBC驱动对ParameterMetaData接口有如下方法:

方法 返回类型
getParameterCount() int

# 示例

package quickstart;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Properties;

public class ParameterMetaDataExample {

    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        String url = "jdbc:yasdb://192.168.1.2:1688/yasdb";
        Properties info = new Properties();
        info.setProperty("user", "username");
        info.setProperty("password", "passwd");
        Class.forName("com.yashandb.jdbc.Driver");
        return DriverManager.getConnection(url, info);
    }

    // 查看所有参数信息
    public void viewAllParameters(PreparedStatement ps) throws SQLException {
        ParameterMetaData meta = ps.getParameterMetaData();
        int count = meta.getParameterCount();

        for (int i = 1; i <= count; i++) {
            int type = meta.getParameterType(i);
            String typeName = meta.getParameterTypeName(i);
            int precision = meta.getPrecision(i);
            int scale = meta.getScale(i);

            System.out.printf("Parameter %d: Type = %s, Precision = %d, Scale = %d%n",
                i, typeName, precision, scale);
        }
    }

    // 根据元数据自动设置参数
    public void autoSetParameters(PreparedStatement ps) throws SQLException {
        ParameterMetaData meta = ps.getParameterMetaData();

        for (int i = 1; i <= meta.getParameterCount(); i++) {
            int type = meta.getParameterType(i);

            if (type == Types.INTEGER) {
                ps.setInt(i, 0);
            } else if (type == Types.VARCHAR) {
                ps.setString(i, "");
            } else if (type == Types.DECIMAL) {
                ps.setBigDecimal(i, BigDecimal.ZERO);
            }
        }
    }

    // 验证参数设置
    public void validateParameters(PreparedStatement ps, Object... values)
            throws SQLException {
        ParameterMetaData meta = ps.getParameterMetaData();

        if (meta.getParameterCount() != values.length) {
            throw new SQLException("Parameter count mismatch");
        }
    }

    public static void main(String[] args) {
        try (Connection conn = getConnection()) {
            try (Statement stmt = conn.createStatement()) {
                try {
                    stmt.execute("DROP TABLE parameter_meta_demo");
                } catch (SQLException ignored) {
                }
                stmt.execute("CREATE TABLE parameter_meta_demo (id INT, name VARCHAR(20), amount DECIMAL(10,2))");
            }
            try (PreparedStatement ps = conn.prepareStatement("INSERT INTO parameter_meta_demo VALUES (?, ?, ?)")) {
                System.out.println("Parameter count: " + ps.getParameterMetaData().getParameterCount());
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

正常情况下,程序输出如下:

Parameter count: 3
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流