Fair question -- I use JDBI because it works the way I think (or at least the way I have thought in the past, which I understand and agree with for the most part).
Sql2o looks pretty nice (well, to be honest, it looks exactly like JDBI), which is cool. If sql2o came into its APIs independently of JDBI, that is pretty cool. I love cases of convergent evolution. Frankly, I doubt it, though :-) If Lars is lurking here, I'd love to compare notes (you also look familiar, did we meet at a JavaZone by chance?)
MyBatis predates JDBI by a bit (with its old name of iBatis) and was certainly a thing that influenced JDBI. I don't remember the details from over a decade ago on exactly how though :-)
So, why does JDBI work the way it does, and why do I plan on continuing to use it? JDBI is really focused on providing a great API for talking to databases. The JDBC API is horrible (it is massively successful, but that is not because of its user-friendly API design), and I want a better one. There have been three APIs for JDBI, the first was like the current fluent API, but predates Java5 and type parameterization, so was all Map oriented. Version 2 made that much better once Java 5 and type parameterization became a viable thing. The SQL Object API actually grew out of a JDBC4 proposal which I thought was good, but the JDBC EG decided against. I am very happy with its heuristic value (it was one of the first annotation-oriented apis, which later became very popular via jax-rs, retrofit, feign, etc. I have never been very happy with the sql object api implementation, but after Dain and Martin fixed the bugs in my first implementation, it *works* (and is reasonably correct), so there it is :-)
Performance of the library has never been a priority because every time I've run any meaningful benchmark, performance of the lib was dwarfed by making an RPC out to the database. The time spent in JDBI was literally lost in the noise of talking over the network and was not measurable. Microbenchmarks stubbing out the database could certainly lead to things that might be improved, but for every real case with a real (network accessed) database, the variance in talking to the database inside JDBC made the time spent in JDBI impossible to effectively detect. If this has changed such that the impact of JDBI is measurable, it is worth taking a look at :-) The multithreaded case in your benchmark makes me worry that we have some contention cropping up and that'd be bad.
For JDBI3, the priority has been taking advantage of the Stream API, which maps exceptionally well queries. It is also taking nicely separable things, like the sql object api, out of the core (so that one with a prettier impl, and which makes extension, etc, easier) becomes easier.
-Brian