如何将MySQL查询结果映射到Java对象?

时间:2018-11-26 22:30:02

标签: java mysql jdbc dropwizard

我正在构建一个Dropwizard应用程序,我想在其中轻松将结果从MySQL数据库映射到Java对象。我之前已经看到使用对象映射器完成此操作,因此我知道可以完成此操作,但是不幸的是我不记得在哪里或如何做。

我创建了不可变类,我想将值映射到它们。这是不可变的示例:

@Value.Immutable
public interface Task {
    int getTaskId();
    int getCreatorId();
    String getTitle();
    String getDescription();
    int getCreatedAt();
}

到目前为止,这是我的DAO:

public interface TasksDAO {
    @SqlQuery("select task_id, title, description, creator_id, created_at from tasks")
    Set<ImmutableTask> getAllTasks();

    @SqlQuery("select task_id, title, description, creator_id, created_at from tasks where id = :id")
        ImmutableTask getTaskById(@Bind("id") int id);
}

它适用于简单的数据类型,例如Stringint

1 个答案:

答案 0 :(得分:1)

为此,我为对象创建了一个简单的映射器。映射器的外观如下:

public class TaskMapper implements ResultSetMapper<ImmutableTask> {
    public ImmutableTask map(int index, ResultSet r, StatementContext ctx) throws SQLException {
        return ImmutableTask.builder()
                .taskId(r.getInt("task_id"))
                .creatorId(r.getInt("creator_id"))
                .title(r.getString("title"))
                .description(r.getString("description"))
                .createdAt(r.getTimestamp("created_at"))
                .build();
    }
}

(生成器是因为它是不可变的,但在其他情况下可以用new Task()替换)

然后,我使用mapper注释更新了DAO,如下所示:

public interface TasksDAO {
    @SqlQuery("select task_id, title, description, creator_id, created_at from tasks")
    @Mapper(TaskMapper.class)
    Set<ImmutableTask> getAllTasks();

    @SqlQuery("select task_id, title, description, creator_id, created_at from tasks where task_id = :id")
    @Mapper(TaskMapper.class)
    ImmutableTask getTaskById(@Bind("id") int id);
}