Em primeiro lugar, considere o uso de parâmetros de consulta em instruções preparadas:
PreparedStatement stm = c.prepareStatement("UPDATE user_table SET name=? WHERE id=?");
stm.setString(1, "the name");
stm.setInt(2, 345);
stm.executeUpdate();
A outra coisa que pode ser feita é manter todas as consultas no arquivo de propriedades. Por exemplo, em um arquivo queries.properties pode colocar a consulta acima:
update_query=UPDATE user_table SET name=? WHERE id=?
Então, com a ajuda de uma classe de utilitário simples:
public class Queries {
private static final String propFileName = "queries.properties";
private static Properties props;
public static Properties getQueries() throws SQLException {
InputStream is =
Queries.class.getResourceAsStream("/" + propFileName);
if (is == null){
throw new SQLException("Unable to load property file: " + propFileName);
}
//singleton
if(props == null){
props = new Properties();
try {
props.load(is);
} catch (IOException e) {
throw new SQLException("Unable to load property file: " + propFileName + "\n" + e.getMessage());
}
}
return props;
}
public static String getQuery(String query) throws SQLException{
return getQueries().getProperty(query);
}
}
você pode usar suas consultas da seguinte maneira:
PreparedStatement stm = c.prepareStatement(Queries.getQuery("update_query"));
Esta é uma solução bastante simples, mas funciona bem.
InputStream
interior daif (props == null)
instrução para não instanciá-la quando não for necessária.Para SQL arbitrário, use jOOQ . jOOQ atualmente suporta
SELECT
,INSERT
,UPDATE
,DELETE
,TRUNCATE
, eMERGE
. Você pode criar SQL assim:Em vez de obter a string SQL, você também pode simplesmente executá-la, usando jOOQ. Vejo
http://www.jooq.org
(Isenção de responsabilidade: eu trabalho para a empresa por trás do jOOQ)
fonte
"?"
ou vincular os valores em linha.Uma tecnologia que você deve considerar é o SQLJ - uma maneira de incorporar instruções SQL diretamente no Java. Como um exemplo simples, você pode ter o seguinte em um arquivo chamado TestQueries.sqlj:
Há uma etapa adicional de pré-compilação que pega seus arquivos .sqlj e os converte em Java puro - em suma, procura os blocos especiais delimitados com
e os transforma em chamadas JDBC. Existem vários benefícios importantes em usar SQLJ:
Existem implementações do tradutor para a maioria dos principais fornecedores de banco de dados, então você deve ser capaz de encontrar tudo o que precisa facilmente.
fonte
Estou me perguntando se você está atrás de algo como o Squiggle . Também algo muito útil é o jDBI . Não vai te ajudar com as dúvidas.
fonte
Gostaria de dar uma olhada no Spring JDBC . Eu o uso sempre que preciso executar SQLs de maneira programática. Exemplo:
É realmente ótimo para qualquer tipo de execução de sql, especialmente consultas; ele o ajudará a mapear conjuntos de resultados para objetos, sem adicionar a complexidade de um ORM completo.
fonte
Costumo usar os Parâmetros JDBC Nomeados do Spring para que eu possa escrever uma string padrão como "select * from blah where colX = ': someValue'"; Acho que é bem legível.
Uma alternativa seria fornecer a string em um arquivo .sql separado e ler o conteúdo usando um método utilitário.
Ah, também vale a pena dar uma olhada no Squill: https://squill.dev.java.net/docs/tutorial.html
fonte
Eu apoio as recomendações para usar um ORM como o Hibernate. No entanto, certamente existem situações em que isso não funciona, então aproveitarei esta oportunidade para apresentar algumas coisas que ajudei a escrever: SqlBuilder é uma biblioteca java para construir dinamicamente instruções sql usando o estilo "builder". é bastante poderoso e flexível.
fonte
Tenho trabalhado em um aplicativo de servlet Java que precisa construir instruções SQL muito dinâmicas para fins de relatório ad hoc. A função básica do aplicativo é alimentar vários parâmetros de solicitação HTTP nomeados em uma consulta pré-codificada e gerar uma tabela de saída bem formatada. Usei Spring MVC e a estrutura de injeção de dependência para armazenar todas as minhas consultas SQL em arquivos XML e carregá-los no aplicativo de relatório, junto com as informações de formatação da tabela. Eventualmente, os requisitos de relatório tornaram-se mais complicados do que os recursos das estruturas de mapeamento de parâmetros existentes e tive que escrever o meu próprio. Foi um exercício interessante de desenvolvimento e produziu uma estrutura para mapeamento de parâmetros muito mais robusta do que qualquer outra coisa que pude encontrar.
Os novos mapeamentos de parâmetros eram assim:
A beleza da estrutura resultante era que ela podia processar parâmetros de solicitação HTTP diretamente na consulta com verificação de tipo e verificação de limite adequadas. Nenhum mapeamento extra necessário para validação de entrada. Na consulta de exemplo acima, o parâmetro denominado serverId seria verificado para garantir que pudesse ser convertido em um número inteiro e estivesse no intervalo de 0-50. O parâmetro appId seria processado como uma matriz de inteiros, com um limite de comprimento de 50. Se o campo showOwnerestiver presente e definido como "verdadeiro", os bits de SQL nas aspas serão adicionados à consulta gerada para os mapeamentos de campo opcionais. field Vários outros mapeamentos de tipo de parâmetro estão disponíveis, incluindo segmentos opcionais de SQL com outros mapeamentos de parâmetro. Ele permite um mapeamento de consulta tão complexo quanto o desenvolvedor pode criar. Ele ainda possui controles na configuração do relatório para determinar se uma determinada consulta terá os mapeamentos finais por meio de um PreparedStatement ou simplesmente será executada como uma consulta pré-construída.
Para os valores de solicitação Http de amostra:
Isso produziria o seguinte SQL:
Eu realmente acho que Spring ou Hibernate ou um desses frameworks deveriam oferecer um mecanismo de mapeamento mais robusto que verifica tipos, permite tipos de dados complexos como arrays e outros recursos. Eu escrevi meu motor apenas para meus propósitos, ele não foi totalmente lido para lançamento geral. Ele só funciona com consultas Oracle no momento e todo o código pertence a uma grande corporação. Algum dia, posso pegar minhas ideias e construir uma nova estrutura de código aberto, mas espero que um dos grandes jogadores existentes aceite o desafio.
fonte
Por que você deseja gerar todo o sql manualmente? Você já olhou para um ORM como o Hibernate Dependendo do seu projeto, ele provavelmente fará pelo menos 95% do que você precisa, de uma forma mais limpa do que o SQL bruto, e se você precisar obter o último pedaço de desempenho, pode criar o Consultas SQL que precisam ser ajustadas manualmente.
fonte
Você também pode dar uma olhada em MyBatis ( www.mybatis.org ). Ele ajuda a escrever instruções SQL fora do seu código java e mapeia os resultados do sql em seus objetos java, entre outras coisas.
fonte
O Google fornece uma biblioteca chamada Room Persitence Library, que fornece uma maneira muito limpa de escrever SQL para aplicativos Android , basicamente uma camada de abstração sobre o banco de dados SQLite subjacente . Abaixo está um pequeno snippet de código do site oficial:
Existem mais exemplos e melhores documentações nos documentos oficiais da biblioteca.
Também existe um chamado MentaBean que é um Java ORM . Ele tem recursos interessantes e parece ser uma maneira bastante simples de escrever SQL.
fonte
Room provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite
. Portanto, não é uma biblioteca ORM genérica para RDBMS. Destina-se principalmente a aplicativos Android.Leia um arquivo XML.
Você pode lê-lo em um arquivo XML. É fácil de manter e trabalhar. Existem analisadores STaX, DOM, SAX padrão disponíveis para criar poucas linhas de código em java.
Faça mais com atributos
Você pode ter algumas informações semânticas com atributos na tag para ajudar a fazer mais com o SQL. Pode ser o nome do método ou tipo de consulta ou qualquer coisa que ajude você a codificar menos.
Manter
Você pode colocar o xml fora do frasco e mantê-lo facilmente. Mesmos benefícios de um arquivo de propriedades.
Conversão
XML é extensível e facilmente conversível para outros formatos.
Caso de uso
Metamug usa xml para configurar arquivos de recursos REST com sql.
fonte
I don't see a reason to make use of XML.
, pois não consegui editá-lo.Se você colocar as sequências SQL em um arquivo de propriedades e, em seguida, ler isso, poderá manter as sequências SQL em um arquivo de texto simples.
Isso não resolve os problemas de tipo SQL, mas pelo menos torna muito mais fácil copiar e colar do TOAD ou sqlplus.
fonte
Como você obtém a concatenação de strings, além de strings SQL longas em PreparedStatements (que você poderia fornecer facilmente em um arquivo de texto e carregar como um recurso de qualquer maneira) que você quebra em várias linhas?
Você não está criando strings SQL diretamente, está? Essa é a maior proibição da programação. Use PreparedStatements e forneça os dados como parâmetros. Isso reduz muito a chance de injeção de SQL.
fonte