JDBC获取数据表中的内容创建对象并存到集合中

我们打算拿到数据库中某一数据表中的内容,但我们并不知道该数据表的列名和行数时怎么办?

使用元数据,获取数据表的行数(实例数)、列数(属性的个数)、列名(属性名)

我们拿到数据表中的内容,并根据每一行的内容创建一个对象,但我们并不知道需要什么类型的对象。

1、使用泛型
2、使用反射创建对象,因为需要在运行中获取泛型的具体类型,然后创建此类型的对象

其中getConnection()和closeResource()方法时提供好的获取数据库链接和关闭资源的方法,无关紧要,不做展示。
具体实现详见代码及注释

public class GetCollection {
    //创建一个泛型方法,返回泛型List
    public static <T> List<T> method(Class<T> clazz) throws Exception {
        List<T> list = new ArrayList<>();
        //1、获取链接
        Connection connection = GetConnection.getConnection();
        //2、执行sql查询语句,并根据调用方法时传递的表名(表名与类名相同)动态构造sql语句
        String sql = "select * from " + clazz.getSimpleName() + ";";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        //3、获取元数据集对象
        ResultSetMetaData metaData = preparedStatement.getMetaData();
        //4、获取数据表的列数(属性个数)
        int count = metaData.getColumnCount();
        //5、遍历结果集
        while (resultSet.next()) {
            //6、每遍历到一行(也就是一个实例),通过反射创建一个泛型对象
            T t = clazz.newInstance();
            //7、循环得到这一行的每个属性的值
            for (int i = 1; i <= count; i++) {
                //8、得到属性的名字
                String columnLabel = metaData.getColumnLabel(i);
                //9、通过属性的名字得到其值,也可以直接按序号i得到
                Object j = resultSet.getObject(columnLabel);
                //10、使用属性名通过反射得到该类的属性对象,并设置非public的属性可见
                Field declaredField = clazz.getDeclaredField(columnLabel);
                declaredField.setAccessible(true);
                //11、设置该对象的属性的值
                declaredField.set(t, j);
            }
            //12、向list中添加刚才创建好的对象
            list.add(t);
        }
        CloseResource.closeResource(connection, resultSet, preparedStatement);
        return list;
    }
}

class demo {
    public static void main(String[] args) throws Exception {
        List<acccount> usersList = GetCollection.method(acccount.class);
        //List<users> usersList = GetCollection.method(users.class); 获取users表中的数据
        usersList.forEach(System.out::println);
    }
}
public class acccount {
    String name;
    int id;
    int balance;

    public acccount() {
    }

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

    public acccount(String name, int id, int balance) {
        this.name = name;
        this.id = id;
        this.balance = balance;
    }
}

public class users {
    int id;
    String sname;
    String pwd;

    @Override
    public String toString() {
        return "users{" +
                "id=" + id +
                ", sname='" + sname + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }

    public users() {
    }

    public users(int id, String sname, String pwd) {
        this.id = id;
        this.sname = sname;
        this.pwd = pwd;
    }
}

输出结果
acccount{name=‘李白’, id=1, balance=1000}
acccount{name=‘杜甫’, id=2, balance=2500}

您可以使用 JDBCJava Database Connectivity)来连接数据库并获取表中的字段。以下是一个简单的示例代码,演示如何使用 JDBC 获取表中的字段: ```java import java.sql.*; public class JDBCTest { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection conn = DriverManager.getConnection(url, username, password); // 创建 Statement 对象 Statement stmt = conn.createStatement(); // 执行 SQL 查询 String sql = "SELECT * FROM mytable"; ResultSet rs = stmt.executeQuery(sql); // 获取结果集的元数据信息 ResultSetMetaData rsmd = rs.getMetaData(); // 获取字段数量 int columnCount = rsmd.getColumnCount(); System.out.println("表中字段数量:" + columnCount); // 输出每个字段的名称和类型 for (int i = 1; i <= columnCount; i++) { String columnName = rsmd.getColumnName(i); String columnType = rsmd.getColumnTypeName(i); System.out.println("字段名称:" + columnName + ",字段类型:" + columnType); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码,您需要将 `url`、`username` 和 `password` 替换为您实际的数据库连接信息。然后,通过执行 SQL 查询并使用 `ResultSetMetaData` 获取结果集的元数据信息,包括字段数量、字段名称和字段类型。 请注意,在实际开发,您可能需要根据具体的数据库类型和表结构进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的Y同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值