Class AppConnection

java.lang.Object
br.com.intersys.systextil.connection.AppConnection
All Implemented Interfaces:
Closeable, AutoCloseable

public class AppConnection extends Object implements Closeable
Author:
Sérgio Siegrist
  • Field Details

    • ORACLE_TYPES_CURSOR

      public static final int ORACLE_TYPES_CURSOR
      Tipo de parâmetro de saída a ser usado quando é cursor Oracle.
      See Also:
  • Constructor Details

    • AppConnection

      public AppConnection()
      Inicializa e abre uma Connection. Esta pode se tornar a "root" para outras AppConnections derivadas.
    • AppConnection

      public AppConnection(AppConnection appConn)
      Inicializa uma AppConnection que utiliza a mesma Connection que uma outra AppConnection. Armazena uma referência ao conjunto de statements abertas pela AppConnection "root".
    • AppConnection

      public AppConnection(AppConnection conn, String sql)
      Conveniência para inicializar uma conexão já com um comando SQL. Deixa o statement aberto para receber parâmetros e ser executado.
    • AppConnection

      public AppConnection(AppConnection appConn, String query, Object... params)
      Conveniência para iniciar uma conexão já com um comando SQL e alguns parâmetros
      Parameters:
      appConn - A conexão root
      query - A query sql
      params - os parâmetros da query
    • AppConnection

      public AppConnection(Connection conn, TransactionManager tm)
      Inicializa uma AppConnection que utiliza uma Connection fornecida pela aplicação e um TransactionManager externo para o caso de utilizar transações gerenciadas por J2EE. Esta pode se tornar a "root" para outras AppConnections derivadas.
    • AppConnection

      public AppConnection(Connection conn)
      Inicializa uma AppConnection que utiliza uma Connection fornecida pela aplicação. Esta pode se tornar a "root" para outras AppConnections derivadas.
    • AppConnection

      public AppConnection(String query)
      Conveniência para executar comandos SQL em aplicações web. Já executa o comando e o deixa aberto para ser acessado depois.
    • AppConnection

      public AppConnection(String query, int id)
      Conveniência para executar comandos SQL com um parâmetro numérico em aplicações web. Já executa o comando e o deixa aberto para ser acessado depois.
    • AppConnection

      public AppConnection(String query, String id)
      Conveniência para executar comandos SQL com um parâmetro de texto em aplicações web. Já executa o comando e o deixa aberto para ser acessado depois.
  • Method Details

    • getQuery

      public String getQuery()
      Retorna o que foi passado por último em setQuery(String) ou equivalentes.
    • getParams

      public Object[] getParams()
      Retorna um array contendo todos os parâmetros fornecidos.
    • getConnection

      public final Connection getConnection()
      Retorna a conexão JDBC atualmente em uso por este objeto.
    • getNewJndiConnection

      public static AppConnection getNewJndiConnection(String jndi)
    • newConnection

      public static Connection newConnection()
      Retorna uma nova conexão JDBC conforme as regras desta classe, sem ter que instanciar uma AppConnection.
    • setPersistOnSQLException

      public void setPersistOnSQLException(boolean persist)
      Define se a conexão deve permanecer aberta após a ocorrência de erros de banco. Por padrão, a conexão é fechada, o que é conveniente em puras aplicações web.

      Se esta opção for ativada, na ocorrência de erros será fechada apenas a AppConnection atual, e será forçado rollback. As AppConnections ancestrais permanecem como estão.

    • setAutoCommit

      public void setAutoCommit(boolean autoCommit)
      Executa setAutoCommit na Connection. Se autoCommit for false, inicia uma transação.
    • getAutoCommit

      public boolean getAutoCommit()
    • commit

      public void commit()
    • rollback

      public void rollback()
      Executa rollback numa transação controlada pela aplicação. Lança DebugException se falhar.
    • close

      public void close()
      Deve ser usado ao fim das operações envolvendo AppConnection para fechar a Connection. Se for executado na "root", fecha todos os Statements que estiverem abertos. Este método não executa automaticamente commit ou rollback.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
    • next

      public boolean next()
    • getCurrentRecordCount

      public int getCurrentRecordCount()
      Retorna a quantidade de registros que foram lidos até o momento. Esse valor fica disponível mesmo depois do statement já ter sido fechado.

      É uma comodidade após a leitura dos registros, para verificar se a consulta trouxe registros.

      Returns:
      a quantidade de registros que foram lidos até o momento
    • setQuery

      public final void setQuery(String query)
    • setUpdateableQuery

      public void setUpdateableQuery(String query)
    • prepareCall

      public void prepareCall(String sql)
    • closeAndThrow

      public void closeAndThrow(SQLException e) throws DebugException
      Fecha a conexão de maneira segura, e lança uma DebugException que informa qual foi o erro, qual foi o comando SQL e quais foram os parâmetros que geraram a falha.

      Também é usado internamente se ocorrer algum SQLException genérico de acesso ao banco.

      Se estava no meio de uma transação, a Connection é passada automaticamente para o modo auto-commit.

      Throws:
      DebugException
    • closeAndThrow

      public void closeAndThrow(RuntimeException e) throws RuntimeException
      Utilidade para lançar uma RuntimeException qualquer e ao mesmo tempo fechar a conexão de maneira segura, sem ter que fechar a conexão explicitamente ou recorrer a blocos finally.

      Se estava no meio de uma transação, a Connection é passada automaticamente para o modo auto-commit.

      Throws:
      RuntimeException
    • registerOutParameter

      public void registerOutParameter(int parameterIndex, int sqlType)
    • setNull

      public void setNull(int parameterIndex, int sqlType)
      É preciso informar o tipo sql conforme java.sql.Types.
    • setInt

      public final void setInt(int parameterIndex, int x)
    • setLong

      public void setLong(int parameterIndex, long x)
    • setDouble

      public void setDouble(int parameterIndex, double x)
    • setFloat

      public void setFloat(int parameterIndex, float x)
    • setBigDecimal

      public void setBigDecimal(int parameterIndex, BigDecimal x)
    • setAmount

      public void setAmount(int parameterIndex, Amount x)
    • setString

      public final void setString(int parameterIndex, String x)
    • setDateTime

      public void setDateTime(int parameterIndex, Date x)
    • setDate

      public void setDate(int parameterIndex, Date x)
    • setTime

      public void setTime(int parameterIndex, Date x)
    • setObject

      public void setObject(int parameterIndex, Object x)
    • setBytes

      public void setBytes(int parameterIndex, byte[] bytes)
    • getBoolean

      public boolean getBoolean(int columnIndex)
    • getBoolean

      public boolean getBoolean(String columnName)
    • getByte

      public byte getByte(int columnIndex)
    • getByte

      public byte getByte(String columnName)
    • getShort

      public short getShort(int columnIndex)
    • getShort

      public short getShort(String columnName)
    • getInt

      public int getInt(int columnIndex)
    • getCsInt

      public int getCsInt(int columnIndex)
    • getInt

      public int getInt(String columnName)
    • getLong

      public long getLong(int columnIndex)
    • getLong

      public long getLong(String columnName)
    • getCsDouble

      public double getCsDouble(int columnIndex)
    • getDouble

      public double getDouble(int columnIndex)
    • getDouble

      public double getDouble(String columnName)
    • getFloat

      public float getFloat(int columnIndex)
    • getFloat

      public float getFloat(String columnName)
    • getDateTime

      public Timestamp getDateTime(int columnIndex)
    • getDateTime

      public Timestamp getDateTime(String columnName)
    • getDate

      public Date getDate(int columnIndex)
    • getDate

      public Date getDate(String columnName)
    • getTime

      public Time getTime(int columnIndex)
    • getTime

      public Time getTime(String columnName)
    • getTimestamp

      public Timestamp getTimestamp(int columnIndex)
    • getTimestamp

      public Timestamp getTimestamp(String columnName)
    • getBigDecimal

      public BigDecimal getBigDecimal(int columnIndex)
    • getBigDecimal

      public BigDecimal getBigDecimal(String columnName)
    • getBigDecimalNotNull

      public BigDecimal getBigDecimalNotNull(int collumnIndex)
    • getBigDecimalNotNull

      public BigDecimal getBigDecimalNotNull(String columnName)
    • getAmount

      public Amount getAmount(int columnIndex)
    • getAmount

      public Amount getAmount(String columnName)
    • getAmountNotNull

      public Amount getAmountNotNull(int columnIndex)
    • getAmountNotNull

      public Amount getAmountNotNull(String columnName)
    • getString

      public String getString(int columnIndex)
    • getCsString

      public String getCsString(int columnIndex)
    • getString

      public String getString(String columnName)
    • getBytes

      public byte[] getBytes(int columnIndex)
    • getBytes

      public byte[] getBytes(String columnName)
    • getInputStream

      public InputStream getInputStream(int columnIndex)
    • getInputStream

      public InputStream getInputStream(String columnName)
    • getReader

      public Reader getReader(int columnIndex)
    • getReader

      public Reader getReader(String columnName)
    • getClobString

      public String getClobString(int columnIndex)
      Lê uma coluna CLOB como String.
      Parameters:
      columnIndex - a coluna
      Returns:
      o conteúdo da coluna como String
    • getClobString

      public String getClobString(String columnName)
      Lê uma coluna CLOB como String.
      Parameters:
      columnName - a coluna
      Returns:
      o conteúdo da coluna como String
    • getLongString

      public String getLongString(int columnIndex)
      Lê uma coluna LONG como String.

      (A Oracle recomenda não usar esse tipo de coluna.)

      Parameters:
      columnIndex - a coluna
      Returns:
      o conteúdo da coluna como String
    • getLongString

      public String getLongString(String columnName)
      Lê uma coluna LONG como String.

      (A Oracle recomenda não usar esse tipo de coluna.)

      Parameters:
      columnName - a coluna
      Returns:
      o conteúdo da coluna como String, ou um texto vazio se estiver nulo
    • getObject

      public Object getObject(String columnName)
    • getObject

      public Object getObject(int columnIndex)
    • getObject

      public Object getObject(String columnName, Class<?> type)
    • getObject

      public Object getObject(int columnIndex, Class<?> type)
    • wasNull

      public boolean wasNull()
    • executeCheckedUpdate

      Se ocorrer exceção, fecha o Statement mas não fecha a Connection. Isto permite que a exceção seja tratada e a Connection continue sendo utilizada. Isto também exige que a Connection seja fechada externamente num bloco finally.

      Se alguma RuleViolation não for tratada, então pode-se lançar a DebugException correspondente de maneira segura executando closeAndThrow(e).

      Throws:
      UniqueViolation
      NotNullViolation
      CheckViolation
      ParentKeyViolation
      ChildRecordViolation
      CustomViolation
      RuleViolation
    • executeCheckedSQL

      Faz o mesmo que executeCheckedUpdate(), exceto que, se ocorrer uma exceção que não for RuleViolation, é lançada como DebugSQLException para forçar o tratamento.
      Throws:
      UniqueViolation
      NotNullViolation
      CheckViolation
      ParentKeyViolation
      ChildRecordViolation
      CustomViolation
      RuleViolation
      DebugSQLException
    • insertUnique

      public boolean insertUnique()
      Executa um comando INSERT, e fecha o statement, sem gerar erro caso ocorra tentativa de violação de chave primária.

      Se o comando não for INSERT, o funcionamento não está definido - mas provavelmente funcionará como um executeUpdate() seguido de close(). Deve ser usado somente se o comando for INSERT.

      Uso típico:

      AppConnection cn = new AppConnection(conn);
      cn.setQuery("INSERT INTO etc...");
      cn.setParâmetros...;
      if(!cn.insertUnique()) {
          // Executar update...
      } // Não é preciso fazer close();
      Returns:
      se a inserção foi feita com sucesso
    • executeSQL

      public int executeSQL() throws DebugSQLException
      Executa qualquer tipo de comando SQL, lançando os dados do erro que ocorrer, seja ele qual for.
      Returns:
      a quantidade de linhas afetadas pela execução, ou -1 se não for o caso.
      Throws:
      DebugSQLException
    • executeUpdate

      public int executeUpdate() throws DebugException
      Se ocorrer exceção, fecha a Connection e lança a DebugException correspondente. Se precisar reaproveitar a Connection após tratar a DebugException, utilize executeCheckedUpdate em vez deste.
      Throws:
      DebugException
    • executeAndNext1

      public final boolean executeAndNext1()
      Conveniência para executar a consulta e imediatamente retornar o único registro esperado. Otimiza a memória reservada para receber só 1 registro. É útil para consultas pela chave primária ou que só verificam a existência de um registro ou que geram somente uma linha de totais gerais.
      Returns:
      se há registro. O mesmo que next()
    • exists

      public final boolean exists()
      Conveniência para verificar se é encontrado um registro, executando a consulta e fechando o statement em um único método.
      Returns:
      se foi encontrado um registro
    • setFetchSize

      public final void setFetchSize(int rows)
      Faz o mesmo que o método do mesmo nome em java.sql.Statement: reserva memória para recuperar certa quantidade de registros. É uma dica para aumentar o desempenho da consulta ou economizar memória quando se sabe quantos registros são esperados.
    • executeQuery

      public final void executeQuery()
    • executeQuery

      public final void executeQuery(String query)
    • execute

      public boolean execute()
      Executa um CallableStatement.
      Returns:
      o resultado de java.sql.PreparedStatement.execute(), isto é, se foi obtido um conjunto de registros de uma consulta.
    • updateRow

      public void updateRow()
    • deleteRow

      public void deleteRow()
    • execute

      public int execute(String query)
    • execute

      public int execute(String query, int id)
    • executeUpdate

      public static int executeUpdate(String query, int id)
    • execute

      public int execute(String query, int[] ids)
    • executeUpdate

      public static int executeUpdate(String query, int[] ids)
    • execute

      public int execute(String query, String id)
    • executeUpdate

      public static int executeUpdate(String query, String id)
    • execute

      public int execute(String query, String[] ids)
    • executeUpdate

      public static int executeUpdate(String query, String[] ids)
    • execute

      public int execute(String query, int[] ints, String[] ids)
    • executeUpdate

      public static int executeUpdate(String query, int[] ints, String[] ids)
    • execute

      public int execute(String query, int[] ints0, String[] ids0, int[] ints1, String[] ids1)
    • executeUpdate

      public static int executeUpdate(String query, int[] ints0, String[] ids0, int[] ints1, String[] ids1)
    • formatString

      public static String formatString(String x)
      Formata um String como um valor para ser concatenado dentro de um comando SQL. Coloca aspas simples ao redor do valor, e faz "escape" de caracteres de aspas simples que existirem dentro do valor.
      Returns:
      o valor formatado entre aspas simples, ou "NULL" se for nulo ou vazio
    • isClosed

      public boolean isClosed()
    • refreshRow

      public void refreshRow()
    • getStatement

      public final AppConnection getStatement(Object key, String sql)
      Abre e retorna um comando SQL para ser usado em um processo. Ele fica mapeado na chave key memorizado para ser reaproveitado no mesmo processo. Assim, um novo comando SQL só é criado se já não existir algum mapeado na mesma chave (não importa qual seja o real conteúdo de sql) e fica disponível enquanto não for fechado usando close(java.lang.Object).
      Parameters:
      key - uma chave de fácil memorização para distinguir este comando SQL de outros usados no processo
      sql - o comando SQL que será usado para abrir um novo comando (statement)
      Returns:
      o comando existente associado a key ou, se não existir, um novo comando associado a key
    • close

      public final void close(Object key)
      Fecha o comando SQL mapeado na chave key e desfaz este mapeamento, se existir.
      Parameters:
      key - a chave na qual o comando SQL está mapeado.
    • readIntNotNull

      public int readIntNotNull()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou 0 se não houver registro
    • readInteger

      public Integer readInteger()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando nulo se não houver registro.
      Returns:
      o valor lido, ou nulo se não houver registro
    • readInteger

      public Integer readInteger(Integer defVal)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando o valor default se não houver registro.
      Returns:
      o valor lido, ou defVal se não houver registro
    • readDoubleNotNull

      public double readDoubleNotNull()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou 0.0 se não houver registro
    • readDouble

      public Double readDouble()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando nulo se não houver registro.
      Returns:
      o valor lido, ou nulo se não houver registro
    • readDouble

      public Double readDouble(Double defVal)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando o valor default se não houver registro.
      Returns:
      o valor lido, ou defVal se não houver registro
    • readStringNotNull

      public String readStringNotNull()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou vazio se não houver registro. Nunca retorna nulo.
    • readString

      public String readString()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando nulo se não houver registro.
      Returns:
      o valor lido, ou nulo se não houver registro
    • readString

      public String readString(String defVal)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando o valor default se não houver registro.
      Returns:
      o valor lido, ou defVal se não houver registro
    • readDate

      public Date readDate()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou nulo se não houver registro
    • readBigDecimalNotNull

      public BigDecimal readBigDecimalNotNull()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou BigDecimal.ZERO se não houver registro. Se o valor lido for nulo, retorna BigDecimal.ZERO. Nunca retorna nulo.
    • readBigDecimal

      public BigDecimal readBigDecimal()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando nulo se não houver registro.
      Returns:
      o valor lido, ou nulo se não houver registro. Se o valor lido for nulo, retorna BigDecimal.ZERO.
    • readBigDecimal

      public BigDecimal readBigDecimal(BigDecimal defVal)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando o valor default se não houver registro.
      Returns:
      o valor lido, ou defVal se não houver registro Se o valor lido for nulo, retorna BigDecimal.ZERO.
    • readAmountNotNull

      public Amount readAmountNotNull()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta.
      Returns:
      o valor lido, ou Amount.ZERO se não houver registro. Se o valor lido for nulo, retorna Amount.ZERO. Nunca retorna nulo.
    • readAmount

      public Amount readAmount()
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando nulo se não houver registro.
      Returns:
      o valor lido, ou nulo se não houver registro. Se o valor lido for nulo, retorna Amount.ZERO.
    • readAmount

      public Amount readAmount(Amount defVal)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar o valor da única coluna, fechando a consulta e retornando o valor default se não houver registro.
      Returns:
      o valor lido, ou defVal se não houver registro Se o valor lido for nulo, retorna Amount.ZERO.
    • readOne

      public <T> T readOne(Maker<T> maker)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar um valor com base nesse registro, fechando a consulta.
      Type Parameters:
      T - o tipo do objeto a ser retornado
      Parameters:
      maker - o "maker" que converte um registro em um objeto com valores
      Returns:
      o valor lido, ou nulo se não houver registro ou se o "maker" utilizado permitir retorno nulo. Se o "maker" utilizado não permitir nulo, o retorno nulo indica que não há registro.
    • map

      public <T> Optional<T> map(Function<? super AppConnection,T> mapper)
      Conveniência para, de uma só vez, executar a consulta, ler o único registro e retornar um valor com base nesse registro, fechando a consulta.

      É muito semelhante a readOne(Maker), aceitando uma função genérica e retornando um Optional.

      Importante: Após o retorno, esta consulta estará fechada. Não será possível obter mais dados por ela.

      Type Parameters:
      T - o tipo do objeto a ser retornado
      Parameters:
      mapper - a função que converte um registro em um objeto com valores
      Returns:
      o valor lido, ou nulo se não houver registro ou se a função utilizada permitir retorno nulo. Se a função utilizada não permitir nulo, o retorno nulo indica que não há registro.
    • ifPresentThrow

      public <X extends Throwable> void ifPresentThrow(Function<? super AppConnection,? extends X> exceptionSupplier) throws X
      Conveniência para, de uma só vez, executar a consulta, abrir o único registro e lançar uma Exception com base nesse registro se houver, fechando a consulta.

      Importante: Após o retorno, esta consulta estará fechada. Não será possível obter mais dados por ela.

      Type Parameters:
      X - o tipo da Exception que será lançada
      Parameters:
      exceptionSupplier - a função que lê o registro atual e com base nele retorna uma Exception que será lançada. Se retornar null, não lançará nada.
      Throws:
      X - se o exceptionSupplier retornar algo a lançar
    • forEach

      public int forEach(Consumer<? super AppConnection> action)
      Processa todos os registros da consulta, aplicando-lhes o consumidor informado. Assegura o fechamento do cursor.

      É a maneira mais simples de processar um SELECT.

      Parameters:
      action - o consumidor de registros
      Returns:
      a quantidade de registros processados
    • stream

      public <R> R stream(Function<Stream<AppConnection>,R> streamHandler)
      Processa todos os registros da consulta, usando um stream. Assegura o fechamento do cursor.
      Type Parameters:
      R - o tipo do retorno, que pode ser: uma contagem, uma soma, um valor selecionado, qualquer coisa, geralmente como resultado do processamento do stream.
      Parameters:
      streamHandler - uma função que processa o stream de registros e retorna um resultado. Se não houver nada a retornar, deve retornar pelo menos null.
      Returns:
      o resultado do processamento do stream
    • getColumns

      public List<String> getColumns(String table) throws DebugException
      Returns:
      uma lista com as colunas de uma tabela
      Throws:
      DebugException
    • getMetaData

      public ResultSetMetaData getMetaData()
      Returns:
      o MetaData do ResultSet