简单实现将JDBC ResultSet结果集映射成对象

简介

JDBC查询返回ResultSet结果集,调用方法,传入要映射的对象的Class对象,利用反射获取该对象声明的全部属性,然后通过结果集获取列名,与对象的属性进行匹配然后赋值。

(目前未实现泛型,只是简单的进行了结果处理,代码也存在不合理的地方)

 

实现

Book.java

public class Book {
    private int id;
    private String bookname;
    private String bookauthor;
    private double bookprice;
    private Date booktime;
    private String bookpublish;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookname='" + bookname + '\'' +
                ", bookauthor='" + bookauthor + '\'' +
                ", bookprice=" + bookprice +
                ", booktime=" + booktime +
                ", bookpublish='" + bookpublish + '\'' +
                '}';
    }
}

JDBCUtil.java

    static Connection conn = null;

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF8", "root", "123456");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * CRUD 实现增删查改
     *
     * @param sql
     * @param param
     * @return
     */
    public static Object CRUD(String sql, Class clazz, List<Object> param) {
        PreparedStatement pst = null;
        Object object = null;
        try {
            pst = conn.prepareStatement(sql);
            for (int i = 1; i <= param.size(); i++) {
                pst.setObject(i, param.get(i - 1));
            }
            String operate = sql.trim().substring(0, 6);
            if (operate.equalsIgnoreCase("select")) {
                object = pst.executeQuery();
            } else {
                object = pst.executeUpdate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        ResultSet rs = (ResultSet) object;
        Object result = null;
        try {
            result = getBeans(rs, clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 映射结果集到JavaBean
     *
     * @param resultSet
     * @param clazz
     * @return
     * @throws Exception
     */
    public static Object getBeans(ResultSet resultSet, Class clazz) throws Exception {
        //获取要封装的javabean声明的属性
        Field[] fields = clazz.getDeclaredFields();
        //获取ResultSetMetaData(包含ResultSet中列的名称和类型的信息)
        ResultSetMetaData metaData = resultSet.getMetaData();
        //光标移到最后
        resultSet.last();
        //获取结果数据条数
        int rows = resultSet.getRow();
        //光标移到第一条数据前
        resultSet.beforeFirst();
        //获取查询结果列数
        int columnCount = metaData.getColumnCount();
        if (rows > 1) {
            List<Object> list = new ArrayList<>();
            //遍历ResultSet
            while (resultSet.next()) {
                //调用无参构造实例化对象
                Object object = clazz.newInstance();
                for (int j = 1; j <= columnCount; j++) {
                    //获取列名
                    String columnName = metaData.getColumnName(j);
                    //匹配JavaBean的属性,然后赋值
                    for (Field field : fields) {
                        field.setAccessible(true);
                        if (field.getName().equalsIgnoreCase(columnName)) {
                            field.set(object, resultSet.getObject(columnName));
                        }
                    }
                }
                list.add(object);
            }
            return list;
        } else {
            Object object = clazz.newInstance();
            //遍历ResultSet
            while (resultSet.next()) {
                for (int j = 1; j <= columnCount; j++) {
                    String columnName = metaData.getColumnName(j);
                    for (Field field : fields) {
                        field.setAccessible(true);
                        if (field.getName().equalsIgnoreCase(columnName)) {
                            field.set(object, resultSet.getObject(columnName));
                        }
                    }
                }
            }
            return object;
        }
    }
}

Test.java

        //测试查询1
        List<Book> list = (List<Book>) CRUD("select * from book where id in (?,?)", Book.class, Arrays.asList(new Object[]{1004, 1005}));
        System.out.println(list);
        //测试查询2
        Book book = (Book) CRUD("select * from book where id = ?", Book.class, Arrays.asList(new Object[]{1001}));
        System.out.println(book);

结果

[Book{id=1004, bookname='水浒传', bookauthor='施耐庵', bookprice=65.0, booktime=2017-03-04, bookpublish='机械工程出版社'}, Book{id=1005, bookname='红楼梦', bookauthor='曹雪芹', bookprice=57.0, booktime=2014-09-15, bookpublish='华东师范出版社'}]

Book{id=1001, bookname='西游记', bookauthor='吴承恩', bookprice=50.23, booktime=2020-06-17, bookpublish='北京大学出版社'}

猜你喜欢

转载自blog.csdn.net/zh137289/article/details/106730107