From a DBA's point of view, applying an abstracting layer over the database can have performance issues.
There are, of course, advantages to having your database interactions in one place and also being able to expose it to other resources.
I would argue that making it database vendor-agnostic is very hard if not impossible to do.
I would also argue that things like load balancing and even sharding, could be better accomplished with things like HA proxy and similar existing products.
However, if you are implementing a database API, you MUST allow for batching in your API or you are probably going to kill your performance.
Some information about batching in your API:
P.S. It would also be a good idea to add some thresholds to monitor for slow database queries in the API.