Перемещать ResultSet в JSON в Java JSP

Моя консультация - это, чтобы знать, как я могу перемещать Ресультсет де Скльсервер JSON, так как я работаю с книжными магазинами в языке сценариев JavaScript (ChartJS), чтобы производить графики для dashboard, и этот только читает данные в этом формате.

package DAO;

import conexion.Conexion;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.json.JSONObject;

public class GraficaDAO {

    private static final Conexion con = Conexion.conectar();
    private static PreparedStatement ps = null;
    private static ResultSet res = null;

    public ResultSet reporteMensual(String mes) throws Exception {

        String sproc = "{call sp_EquiposMes (?)}";

        try {
            ps = con.getCnn().prepareCall(sproc);
            ps.setString(1, mes.toString());
            res = ps.executeQuery();

            while (res.next()){
                String equipos = res.getString(1);
            }

        } catch (SQLException ex) {

        } finally {
            try {
                if (res != null) {
                    res.close();
                }
                if (ps != null) {
                    ps.close();
                }
                con.cerrarConexion();
            } catch (Exception e) {
            }
        }
        return res;
    }
}

Это код моей консультации, на данный момент я хранил ее в String, чтобы подкреплять, если данные прибывают.

2
задан 07.01.2017, 17:11
0 ответов

Когда ты будешь работать с твоим слоем базы данных, вместо того, чтобы возвращать один ResultSet, лучшее состоит в том, чтобы возвращать объект или представление даты, что ты захотел работать, потом ты можешь преобразовывать эту дату, как больше я последовал тебе.

В случае твоего метода GraficaDAO#reporteMensual лучшее, что ты можешь делать, состоит в том, чтобы получать данные, возвращенные процедурой, хранившейся в списке и потом конвертировать - готово в объекте JSON (или любая другая вещь, в которой ты нуждался бы).

public class GraficaDAO {

    private static final String sproc = "{call sp_EquiposMes (?)}";

    //devuelve una lista, no el ResultSet
    //una vez que cierres la conexión a base de datos, el ResultSet
    //estará cerrado y no podrá ser usado
    public List<ResultadosGrafico> reporteMensual(String mes) {
        List<ResultadosGrafico> lista = new ArrayList<>();

        //todos los elementos de conexion a base de datos deben estar
        //en el menor alcance posible para el metodo
        Conexion con = Conexion.conectar();
        //siempre dentro de un bloque try con recursos
        //automáticamente llamará al método close de los
        //recursos abiertos dentro de los "parámetros" del try
        //disponible desde Java 7
        try (Connection conn = con.getCnn();
            //para invocar procedimientos almacenados en Java
            //conviene usar CallableStatement
            CallableStatement cs = conn.prepareCall(sproc);) {
            //mes ya es un String, no tienes que llamar a su método toString
            cs.setString(1, mes);
            try (ResultSet res = cs.executeQuery()) {
                while (res.next()) {
                    //parsea el resultado de cada fila del ResultSet
                    ResultadosGrafico rg = new ResultadosGrafico();
                    //en lugar de usar el número de columna, mejor usa el nombre de la columna que se ha devuelto
                    rg.setAtributo1(res.getString("columna1"));
                    rg.setAtributo2(res.getString("columna2"));
                    //etc...

                    //importante: agregar este elemento en tu lista
                    lista.add(rg);
                }
            }
        } catch (SQLException ex) {
            //por lo menos debes loguear esta excepción
            ex.printStackTrace();
        }
    }
    return lista;
}

Потом, ты можешь использовать книжный магазин как JSON.org чтобы конвертировать список List<ResultadosGrafico> в цепь JSON. Но это слишком много работы. Лучшее состоит в том, чтобы использовать книжные магазины как jackson или Google gson, что делают самое простое превращение, и он проще поддержания.

Продолжая предыдущий рисунок и с книжным магазином, как jackson, ты можешь делать как останься:

public class ClienteReporteGrafico {

    public static void main(String[] args) throws Exception {
        //obtener la lista desde el dao
        GraficaDAO graficaDAO = new GraficaDAO();
        List<ResultadosGrafico> lista = graficaDAO.reporte();
        //jackson convierte tu objeto en json
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(lista);
        //pintamos el json en la consola para ver el resultado
        System.out.println(json);
    }
}
2
ответ дан 03.12.2019, 17:51
  • 1
    Muchí пропасти спасибо за беспокойство Luiggi, ты помог мне слишком много :) –  07.01.2017, 23:12

Ты можешь Использовать следующий код, чтобы создавать объект json и потом добавлять каждый элемент resultset к json.

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;

import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class ResultSetConverter {
  public static JSONArray convert( ResultSet rs )
    throws SQLException, JSONException
  {
    JSONArray json = new JSONArray();
    ResultSetMetaData rsmd = rs.getMetaData();

    while(rs.next()) {
      int numColumns = rsmd.getColumnCount();
      JSONObject obj = new JSONObject();

      for (int i=1; i<numColumns+1; i++) {
        String column_name = rsmd.getColumnName(i);

        if(rsmd.getColumnType(i)==java.sql.Types.ARRAY){
         obj.put(column_name, rs.getArray(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT){
         obj.put(column_name, rs.getInt(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BOOLEAN){
         obj.put(column_name, rs.getBoolean(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BLOB){
         obj.put(column_name, rs.getBlob(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.DOUBLE){
         obj.put(column_name, rs.getDouble(column_name)); 
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.FLOAT){
         obj.put(column_name, rs.getFloat(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.INTEGER){
         obj.put(column_name, rs.getInt(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.NVARCHAR){
         obj.put(column_name, rs.getNString(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.VARCHAR){
         obj.put(column_name, rs.getString(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.TINYINT){
         obj.put(column_name, rs.getInt(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.SMALLINT){
         obj.put(column_name, rs.getInt(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.DATE){
         obj.put(column_name, rs.getDate(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.TIMESTAMP){
        obj.put(column_name, rs.getTimestamp(column_name));   
        }
        else{
         obj.put(column_name, rs.getObject(column_name));
        }
      }

      json.put(obj);
    }

    return json;
  }
}
1
ответ дан 03.12.2019, 17:51
  • 1
    Осторожно. Если добавляют этот mé совсем такой, каков, он будет не удаваться, так как, назвав mé совсем GraficaDAO#reporteMensual ResultSet, возвращенные уже estará закрыто. –  07.01.2017, 17:13
  • 2
    Спасибо за твой ответ Эфрен Нарваес :D –  07.01.2017, 23:12

Теги

Похожие вопросы