如何将mysql查询结果Map到java对象?

q5iwbnjs  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(378)

我正在构建一个dropwizard应用程序,我想在其中轻松地将mysql数据库的结果Map到java对象。我以前见过用对象Map器来实现这一点,所以我知道这是可以做到的,但不幸的是,我不记得在哪里或如何实现。
我创建了不可变类,并希望将值Map到它们。下面是一个不可变的示例:

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

这是我迄今为止的刀:

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

它适用于更简单的数据类型,如 String 或者 int .

5us2dqdw

5us2dqdw1#

为此,我为我的对象创建了一个简单的Map器。这就是Map器的外观:

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

相关问题