Separando SQL do Código Java

Esse é um problema que sempre encontro quando tenho que me conectar a uma base de dados; como separar o SQL do código java normal? Eu costumo usar uma classe separada para as conexões do banco de dados, no entanto, quando você tem vários bancos de dados e várias tabelas em cada banco de dados, é sempre difícil fazer isso 100%

Por exemplo, se quisermos colocar todo o SQL java em uma classe chamada DBConnector.java, como codificamos genericamente para diferentes Inserções, Exclusões, Recuperação de Dados, etc? O que eu estou pensando como o caso ideal é que todas as instruções SQL devem estar na mesma classe e devem ser compatíveis com sabores diferentes da mesma operação dentro do escopo do aplicativo de banco de dados, fornecendo assim uma separação lógica do resto do código.

public void insertData (String db, String table, <Whatever Fields to be Inserted>)
{
  //generic SQL INSERT statement and execution 
}

public ResultSet retrieveData (String db, String table, <Whatever Fields Relevant>) 
{
  //generic retrieval of data
}

Existe alguma maneira de conseguir isso? Ou devemos apenas adicionar funcionalidades para diferentes tipos de Inserção, Consulta, etc?

Obrigado!

questionAnswers(4)

yourAnswerToTheQuestion