Trazer dados do banco para um Arraylist

Empresa empresa = new Empresa();

private List<Empresa> lista = new ArrayList<Empresa>();
private Connection con = ConnectionUtil.getConnection();

public List<Empresa> getListaEmpresa() {
    try {
        Statement stmt = con.createStatement();
        String query = "select * from EMPRESA";
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {

            //0     ID        
            empresa.setIdEmpresa(rs.getInt("ID"));
            //1     CNPJ
            empresa.setCnpj(rs.getString("CNPJ"));
            //2     RAZAO_SOCIAL
            empresa.setRazaoSocial(rs.getString("RAZAO_SOCIAL"));
            //3     NOME_FANTASIA
            empresa.setNomeFantasia(rs.getString("NOME_FANTASIA"));
            //4     INSC_ESTADUAL
            empresa.setInscEstadual(rs.getString("INSC_ESTADUAL"));
            //5     CONTATO
            empresa.setContato(rs.getString("CONTATO"));
            //6     CEP
            empresa.setCep(rs.getString("CEP"));
            //7     LOGRADOURO
            empresa.setLogradouro(rs.getString("LOGRADOURO"));
            //8     NUMERO
            empresa.setNumero(rs.getString("NUMERO"));
            //9     BAIRRO
            empresa.setBairro(rs.getString("BAIRRO"));
            //10        ESTADO
            empresa.setEstado(rs.getString("ESTADO"));
            //11        CIDADE
            empresa.setCidade(rs.getString("CIDADE"));
            //12        FONE
            empresa.setFone(rs.getString("FONE"));
            //13        FAX
            empresa.setFax(rs.getString("FAX"));
            //14        EMAIL
            empresa.setEmail(rs.getString("EMAIL"));

            lista.add(empresa);
        }
        return lista;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

public void imprimeLista() {

    for (int i = 0; i < lista.size(); i++) {
        System.out.println(i);
        System.out.println(lista.get(i));
    }
    System.out.println(lista.size());
}

Desse modo sempre que executo tenho o ultimo resultado que cadastrei no meu arrayList

Você criou um atributo empresa e está preenchendo sua lista sempre com com esse atributo, sem contar que, a cada iteração você altera as propriedades dele, isso está errado.
Apaga o atributo empresa e faz assim:

public List<Empresa> getListaEmpresa() {
    try {
        Statement stmt = con.createStatement();
        String query = "select * from EMPRESA";
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
            Empresa empresa = new Empresa(); // A cada iteração cria um objeto do tipo Empresa para receber os valores lidos do banco
            empresa.setIdEmpresa(rs.getInt("ID")); // 0     ID
            empresa.setCnpj(rs.getString("CNPJ")); // 1     CNPJ
            empresa.setRazaoSocial(rs.getString("RAZAO_SOCIAL")); // 2     RAZAO_SOCIAL
            empresa.setNomeFantasia(rs.getString("NOME_FANTASIA")); // 3     NOME_FANTASIA
            empresa.setInscEstadual(rs.getString("INSC_ESTADUAL")); // 4     INSC_ESTADUAL
            empresa.setContato(rs.getString("CONTATO")); // 5     CONTATO
            empresa.setCep(rs.getString("CEP")); // 6     CEP
            empresa.setLogradouro(rs.getString("LOGRADOURO")); // 7     LOGRADOURO
            empresa.setNumero(rs.getString("NUMERO")); // 8     NUMERO
            empresa.setBairro(rs.getString("BAIRRO")); // 9     BAIRRO
            empresa.setEstado(rs.getString("ESTADO")); // 10        ESTADO
            empresa.setCidade(rs.getString("CIDADE")); // 11        CIDADE
            empresa.setFone(rs.getString("FONE")); // 12        FONE
            empresa.setFax(rs.getString("FAX")); // 13        FAX
            empresa.setEmail(rs.getString("EMAIL")); // 14        EMAIL
            lista.add(empresa);
        }
        return lista;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}
1 curtida