Per me, SQL è una parte fondamentale (in molti casi, la maggior parte) del codice di logica aziendale. Se si tenta di separarlo dal codice che opera sui dati restituiti, si è più inclini a sbilanciare la comprensibilità e la manutenibilità del codice.
A mio avviso, lettura dei dati, elaborazione dei dati, scrittura dei dati, ricerca dei dati ... sono tutte operazioni simili e si conservano nello stesso posto.
Se inizi a percepire una duplicazione degli sforzi con le query, forse hai bisogno di una vista del database o di un oggetto che possa incapsulare quell'aspetto dell'accesso al database.
Un altro suggerimento è di avere effettivamente un buon metodo di query del database. Nel software che scrivo (PostgreSQL, MySQL, SQL Server), mi sono assicurato che la maggior parte delle mie operazioni di query potesse avvenire come una singola istruzione di codice.
GetValue(SQL, [transaction], [array_of_params])
GetRow(SQL, [transaction], [array_of_params])
GetRowList(SQL, [transaction], [array_of_params])
GetValueList(SQL, [transaction], [array_of_params])
Execute(SQL, [transaction], [array_of_params])
Quelle sono (approssimativamente) le chiamate di funzione principale che mi assicuro facciano parte del mio "oggetto di connessione". Dipende dalla lingua, da cosa effettivamente implementate, ma il mio punto è di mantenerlo davvero, davvero semplice e indolore.
In breve, considera SQL come parte nativa della programmazione e non astrarre per motivi di astrazione.