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);
}
}
}
}