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.
Mentre lo guardo, sto leggendo dati, elaborando dati, scrivendo dati, cercando dati ... sono tutte operazioni simili, e meglio conservate nello stesso luogo.
Se inizi a percepire una duplicazione degli sforzi con le query, allora 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 un buon metodo di interrogazione del database. Nel software che scrivo (PostgreSQL, MySQL, SQL Server), ho assicurato che la maggior parte delle mie operazioni di interrogazione può 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])
Queste sono (approssimativamente) le chiamate alle funzioni principali che cerco fanno parte del mio "oggetto connessione". Dipende dal linguaggio, da ciò che effettivamente implemente, ma il mio punto è di mantenerlo davvero, molto semplice e indolore.
In sintesi, considera SQL come parte nativa della programmazione e non astratti per motivi di astrazione.