We have been using projects in mybatis umbrella and have found kotlin support to be surprisingly good (Even though the docs are not so stellar)
We use liquibase for schema version control, and then generate support classes for CRUD operations (from the database) using
mybatis-generator which can
generate kotlin classes for you. When going beyond single-table CRUD operations, we can use
mybatis-dynamic-sql directly for type safe database agnostic operations.
When writing queries which are very much dialect specific - we can pass raw SQL through
mybatis mapper-annotations and mybatis implements these annotated interface behind the scenes taking care of mapping to and from kotlin beans.
Because all of these modes of access are internally backend by the same mybatis foundation, they use the same pool, caching strategy etc.
We have found it to be the best end-to-end solution for SQL mapping in kotlin.