в идеале нужно чтобы он позволял
- маппить результат произвольного sql запроса на объект
- принимать объект строки запроса в Consumer
// вместо
List<T> selectAll();
//надо
void selectAll(Consumer<T> consumer);
- некоторый примитивный criteria api (или просто позволять юзать кусок sql из where не указывая весь запрос с десятком полей)
- маппить объект на аргументы произвольного запроса
- автоматически генерировать примитивные запросы для записи и обновления
- ничего не делать с foreign key и ключами - т.е. позволять с ними работать в ручную
MyBatis\ibatis не предлагать - там sql в xml и воще кошмар.