java中查询多个表时,如何将结果封装

java通过反射为实体类赋值时,多表查询时,赋值实体类中存在其他实体类,如何解决?

map<字段名,值>
以下代码只能为Java自带的类型赋值, 对于嵌套实体类--不知其类型

private static Object mapToObject(Map<String, Object> map, Class<?> c) {
        if (map.isEmpty()) {
            return null;
        }
        try {
            //通过公共的空参的构造方法创建对象
            Object o = c.newInstance();
            //通过内省工具 Introspector 获取bean信息
            BeanInfo beanInfo = Introspector.getBeanInfo(o.getClass());
            //获取bean属性的描述器
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
                //获取setter方法,用于写入属性值
                Method setter = propertyDescriptor.getWriteMethod();
                if (setter != null) {
                    //propertyDescriptor.getName()获取指定对象的属性名
                    //invoke 执行属性名在指定对象中的setter方法
                    setter.invoke(o, map.get(propertyDescriptor.getName()));
                }
            }
            return o;
        } catch (InstantiationException | IllegalAccessException | IntrospectionException |
                 InvocationTargetException e) {
            throw new RuntimeException(e);
        }

该回答引用ChatGPT

在Java中,可以使用反射为实体类赋值。当实体类中存在其他实体类时,可以通过以下步骤解决:

定义一个函数,用于将查询结果映射到实体类中。该函数应该具有适当的参数和返回类型,以便在查询多个表时处理结果。

在实体类中,将嵌套的实体类定义为成员变量,并在构造函数中进行初始化。

在映射函数中,遍历结果集并为每个嵌套的实体类创建一个新的实例。然后,使用反射为该实例的属性赋值。

将嵌套的实体类添加到父实体类中。完成映射后,返回父实体类的实例。

例如,考虑以下两个实体类:


public class Book {
    private int id;
    private String title;
    private Author author;
    
    public Book() {
        this.author = new Author();
    }
    // getters and setters
}

public class Author {
    private int id;
    private String name;
    // getters and setters
}

现在,假设我们需要从数据库中查询Book和Author表,并将结果映射到Book实体类中。我们可以编写以下映射函数:


public static Book mapResultSetToBook(ResultSet rs) throws SQLException {
    Book book = new Book();
    Author author = new Author();
    while (rs.next()) {
        int bookId = rs.getInt("book_id");
        String title = rs.getString("title");
        int authorId = rs.getInt("author_id");
        String authorName = rs.getString("author_name");
        if (book.getId() != bookId) {
            book.setId(bookId);
            book.setTitle(title);
            author.setId(authorId);
            author.setName(authorName);
            book.setAuthor(author);
        }
    }
    return book;
}

在此映射函数中,我们首先为Book和Author实例创建了新的实例。然后,我们遍历结果集并为每个属性赋值。当我们遇到新的book_id时,我们将嵌套的Author实例添加到Book实例中。

这样,我们就可以通过使用反射将多个表的查询结果映射到实体类中,其中包含其他实体类。