Programming with JDBC API is quite simple as it is merely a thin layer over the database programming interfaces. However there are some downsides, which you need to consider:
First, using native SQL language in your code exposes your application to a tight coupling with the database where your code has been initially developed. Even if the SQL dialects are similar, each database performs differently depending on the structure of the query, necessitating vendor-specific tuning in most cases.
Second, when you are using plain JDBC, you need to bridge the gap between the relational model and the object model by creating a layer of intermediate objects or collections which host the data fetched from the DB. This is an unnecessary effort because ORM tools, such as Hibernate, can do it for you out of the box.
Finally, by using an intermediate layer which sits between your code and the database it's possible to add additional services like caching which, if properly used,...