परिणाम के सबसे कुशल रूपांतरण JSON के लिए?


109

निम्नलिखित कोड ResultSetका उपयोग करके एक JSON स्ट्रिंग में कनवर्ट करता है JSONArrayऔर JSONObject

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
एक अलग कार्यान्वयन code.google.com/p/bonex-homerunning/source/browse/trunk/...
लीफ Gruenwoldt

1
java.sql। ), "एरे सरणी = rs.getArray (column_name); यदि (ऐरे! = null) obj.put (column_name, new JSONArray (array.getArray ()));"
आणविक

यदि प्रदर्शन एक प्रमुख मुद्दा है, तो आपको इस JSON API का उपयोग नहीं करना चाहिए, बल्कि एक स्ट्रीमिंग लाइब्रेरी का उपयोग करना चाहिए, जिसमें सभी डेटा की मेमोरी ऑब्जेक्ट्स बनाने की आवश्यकता के बिना JSON लिखते हैं (जहां आप पेड़ में वापस देख सकते हैं / सामान पा सकते हैं)। उस ने कहा, मैं यह सुनिश्चित करूंगा कि ऐसा करने से पहले आपके पास वास्तव में एक प्रदर्शन मुद्दा हो।
सेबेस्टियन वैन डेन ब्रोक

3
आपके स्निपेट में कोई त्रुटि है। java.sql.Types.BIGINT8 बाइट्स का आकार है, इसलिए इसे पढ़ने के लिए rs.getLong()नहीं होना चाहिएrs.getInt()
ध्रुवीय मछली

3
इसे लोड करने के लिए धन्यवाद। आपने बस मुझे काम के लायक घंटे बचाए।
DRich

जवाबों:


23

जेआईटी कंपाइलर शायद इसे बहुत तेज बनाने जा रहा है क्योंकि यह सिर्फ शाखाएं और बुनियादी परीक्षण हैं। आप शायद इसे एक कॉलबैक के लिए हैशपॉप लुकअप के साथ अधिक सुरुचिपूर्ण बना सकते हैं, लेकिन मुझे संदेह है कि यह किसी भी तेजी से होगा। स्मृति के रूप में, यह बहुत पतला है।

किसी तरह मुझे संदेह है कि यह कोड वास्तव में स्मृति या प्रदर्शन के लिए एक महत्वपूर्ण बोतल गर्दन है। क्या आपके पास इसे अनुकूलित करने का प्रयास करने का कोई वास्तविक कारण है?


मैं स्रोत कोड को एक ओपन-सोर्स फ्रेमवर्क में डाल रहा हूं, इसलिए मुझे नहीं पता कि इसका क्या उपयोग किया जाएगा। इसलिए मैं इसे यथासंभव कुशल बनाने की कोशिश कर रहा हूं।
डेविन डिक्सन

1
@DevinDixon: क्या रूपरेखा उपलब्ध है? क्या आपके प्रश्न में कोड जैसा कुछ है जो पहले से ही एक ओपन सोर्स रेपो में कहीं उपलब्ध है?

34

मुझे लगता है कि कम मेमोरी (डेटा कार्डिनैलिटी के आधार पर एक निश्चित और रेखीय राशि) का उपयोग करने का एक तरीका है, लेकिन यह विधि हस्ताक्षर को बदलने के लिए है। वास्तव में, हम परिणामी स्ट्रीम से सीधे Json डेटा को प्रिंट कर सकते हैं, जैसे ही हम उन्हें ResultSet से लाते हैं: पहले से ही लिखा गया डेटा कचरा एकत्र कर लिया जाएगा क्योंकि हमें एक सरणी की आवश्यकता नहीं है जो उन्हें स्मृति में रखता है।

मैं GSON का उपयोग करता हूं जो टाइप एडेप्टर को स्वीकार करता है। मैंने ResultSet को JsonArray में बदलने के लिए एक प्रकार का एडेप्टर लिखा और यह आपके कोड की तरह दिखता है। मैं "Gson 2.1: 31 दिसंबर, 2011 को लक्षित" रिलीज का इंतजार कर रहा हूं, जिसमें "उपयोगकर्ता-परिभाषित स्ट्रीमिंग प्रकार एडेप्टर के लिए समर्थन" होगा। फिर मैं अपने एडॉप्टर को स्ट्रीमिंग एडॉप्टर होने के लिए संशोधित करूंगा।


अपडेट करें

जैसा कि वादा किया गया था कि मैं जैक्सन के साथ नहीं बल्कि गैसन के साथ वापस आ रहा हूं। सॉरी टू बी लेट (2 साल)।

प्रस्तावना: इटसेफ के परिणाम की कम मेमोरी का उपयोग करने की कुंजी "सर्वर साइड" कर्सर में है। इस तरह के कर्सर (जावा देवों के लिए उर्फ ​​रिजल्ट) के साथ डीबीएमएस क्लाइंट (उर्फ ड्राइवर) को डेटा बढ़ाता है क्योंकि क्लाइंट रीडिंग के साथ आगे बढ़ता है। मुझे लगता है कि Oracle कर्सर डिफ़ॉल्ट रूप से सर्वर साइड हैं। MySQL के लिए> 5.0.2 कनेक्शन url paramenter में उपयोग के लिए देखें । अपने पसंदीदा DBMS के बारे में जांचें।

1: तो कम स्मृति का उपयोग करने के लिए हमें चाहिए:

  • दृश्य के पीछे सर्वर साइड कर्सर का उपयोग करें
  • केवल पढ़ने के लिए खुले परिणाम का उपयोग करें और निश्चित रूप से, केवल आगे ;
  • किसी सूची (या a) में सभी कर्सर लोड करने से बचें JSONArray ) लेकिन प्रत्येक पंक्ति को सीधे आउटपुट लाइन पर लिखें , जहां आउटपुट लाइन के लिए मेरा मतलब आउटपुट स्ट्रीम या लेखक या एक जेनसन जनरेटर है जो आउटपुट स्ट्रीम या एक लेखक को लपेटता है।

2: जैक्सन डॉक्यूमेंटेशन कहता है:

स्ट्रीमिंग एपीआई सबसे अच्छा प्रदर्शन कर रहा है (सबसे कम ओवरहेड, सबसे तेज़ पढ़ने / लिखने; अन्य 2 तरीके इस पर निर्मित)

3: मैं आपको अपने कोड उपयोग getInt, getBoolean में देखता हूं। getFloat ... बिना परिणाम के wasNull । मुझे उम्मीद है कि इससे समस्याएं पैदा हो सकती हैं।

4: मैंने एरे को कैश थिंक करने के लिए और प्रत्येक पुनरावृत्तियों को कॉल करने से बचने के लिए उपयोग किया। हालांकि स्विच / केस निर्माण का प्रशंसक नहीं था, मैंने इसके लिए इसका उपयोग कियाint एसक्यूएल केTypes

जवाब: अभी तक पूरी तरह से परीक्षण नहीं हुआ है, यह जैक्सन 2.2 पर आधारित है :

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.2.2</version>
</dependency>

ResultSetSerializerवस्तु कैसे क्रमानुसार करने एक ResultSet (JSON करने के लिए वस्तु tranform) पर जैक्सन निर्देश देता है। यह अंदर जैक्सन स्ट्रीमिंग एपीआई का उपयोग करता है। यहाँ एक परीक्षण का कोड:

SimpleModule module = new SimpleModule();
module.addSerializer(new ResultSetSerializer());

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);

[ . . . do the query . . . ]
ResultSet resultset = statement.executeQuery(query);

// Use the DataBind Api here
ObjectNode objectNode = objectMapper.createObjectNode();

// put the resultset in a containing structure
objectNode.putPOJO("results", resultset);

// generate all
objectMapper.writeValue(stringWriter, objectNode);

और, ज़ाहिर है, ResultSetSerializer वर्ग का कोड:

public class ResultSetSerializer extends JsonSerializer<ResultSet> {

    public static class ResultSetSerializerException extends JsonProcessingException{
        private static final long serialVersionUID = -914957626413580734L;

        public ResultSetSerializerException(Throwable cause){
            super(cause);
        }
    }

    @Override
    public Class<ResultSet> handledType() {
        return ResultSet.class;
    }

    @Override
    public void serialize(ResultSet rs, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {

        try {
            ResultSetMetaData rsmd = rs.getMetaData();
            int numColumns = rsmd.getColumnCount();
            String[] columnNames = new String[numColumns];
            int[] columnTypes = new int[numColumns];

            for (int i = 0; i < columnNames.length; i++) {
                columnNames[i] = rsmd.getColumnLabel(i + 1);
                columnTypes[i] = rsmd.getColumnType(i + 1);
            }

            jgen.writeStartArray();

            while (rs.next()) {

                boolean b;
                long l;
                double d;

                jgen.writeStartObject();

                for (int i = 0; i < columnNames.length; i++) {

                    jgen.writeFieldName(columnNames[i]);
                    switch (columnTypes[i]) {

                    case Types.INTEGER:
                        l = rs.getInt(i + 1);
                        if (rs.wasNull()) {
                            jgen.writeNull();
                        } else {
                            jgen.writeNumber(l);
                        }
                        break;

                    case Types.BIGINT:
                        l = rs.getLong(i + 1);
                        if (rs.wasNull()) {
                            jgen.writeNull();
                        } else {
                            jgen.writeNumber(l);
                        }
                        break;

                    case Types.DECIMAL:
                    case Types.NUMERIC:
                        jgen.writeNumber(rs.getBigDecimal(i + 1));
                        break;

                    case Types.FLOAT:
                    case Types.REAL:
                    case Types.DOUBLE:
                        d = rs.getDouble(i + 1);
                        if (rs.wasNull()) {
                            jgen.writeNull();
                        } else {
                            jgen.writeNumber(d);
                        }
                        break;

                    case Types.NVARCHAR:
                    case Types.VARCHAR:
                    case Types.LONGNVARCHAR:
                    case Types.LONGVARCHAR:
                        jgen.writeString(rs.getString(i + 1));
                        break;

                    case Types.BOOLEAN:
                    case Types.BIT:
                        b = rs.getBoolean(i + 1);
                        if (rs.wasNull()) {
                            jgen.writeNull();
                        } else {
                            jgen.writeBoolean(b);
                        }
                        break;

                    case Types.BINARY:
                    case Types.VARBINARY:
                    case Types.LONGVARBINARY:
                        jgen.writeBinary(rs.getBytes(i + 1));
                        break;

                    case Types.TINYINT:
                    case Types.SMALLINT:
                        l = rs.getShort(i + 1);
                        if (rs.wasNull()) {
                            jgen.writeNull();
                        } else {
                            jgen.writeNumber(l);
                        }
                        break;

                    case Types.DATE:
                        provider.defaultSerializeDateValue(rs.getDate(i + 1), jgen);
                        break;

                    case Types.TIMESTAMP:
                        provider.defaultSerializeDateValue(rs.getTime(i + 1), jgen);
                        break;

                    case Types.BLOB:
                        Blob blob = rs.getBlob(i);
                        provider.defaultSerializeValue(blob.getBinaryStream(), jgen);
                        blob.free();
                        break;

                    case Types.CLOB:
                        Clob clob = rs.getClob(i);
                        provider.defaultSerializeValue(clob.getCharacterStream(), jgen);
                        clob.free();
                        break;

                    case Types.ARRAY:
                        throw new RuntimeException("ResultSetSerializer not yet implemented for SQL type ARRAY");

                    case Types.STRUCT:
                        throw new RuntimeException("ResultSetSerializer not yet implemented for SQL type STRUCT");

                    case Types.DISTINCT:
                        throw new RuntimeException("ResultSetSerializer not yet implemented for SQL type DISTINCT");

                    case Types.REF:
                        throw new RuntimeException("ResultSetSerializer not yet implemented for SQL type REF");

                    case Types.JAVA_OBJECT:
                    default:
                        provider.defaultSerializeValue(rs.getObject(i + 1), jgen);
                        break;
                    }
                }

                jgen.writeEndObject();
            }

            jgen.writeEndArray();

        } catch (SQLException e) {
            throw new ResultSetSerializerException(e);
        }
    }
}

27

दो चीजें जो इसे तेज करेंगी वे हैं:

अपने कॉल को rsmd.getColumnCount()लूप से बाहर ले जाएं । स्तंभ गणना पंक्तियों में भिन्न नहीं होनी चाहिए।

प्रत्येक स्तंभ प्रकार के लिए, आप कुछ इस तरह कॉल करते हैं:

obj.put(column_name, rs.getInt(column_name));

स्तंभ मान प्राप्त करने के लिए कॉलम इंडेक्स का उपयोग करना थोड़ा तेज़ होगा:

obj.put(column_name, rs.getInt(i));

इसके अलावा String column_name;लूप से बाहर परिभाषित करें ।
चारनी काये

22

एक सरल समाधान (प्रश्न में कोड के आधार पर):

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; i++) {
    String column_name = rsmd.getColumnName(i);
    obj.put(column_name, rs.getObject(column_name));
  }
  json.put(obj);
}
return json;

3
अच्छा है, लेकिन DATETIME और TIMESTAMP के साथ एक बग है (इसमें Apostrophes शामिल नहीं है
OhadR

अच्छा और सरल
अनूप LL

10

आप नौकरी के लिए jOOQ का उपयोग कर सकते हैं । कुछ उपयोगी JDBC एक्सटेंशन का लाभ उठाने के लिए आपको jOOQ की सभी विशेषताओं का उपयोग करने की आवश्यकता नहीं है। इस मामले में, बस लिखें:

String json = DSL.using(connection).fetch(resultSet).formatJSON();

प्रासंगिक एपीआई तरीके हैं:

  • DSLContext.fetch(ResultSet) JDBC रिजल्ट को JOOQ रिजल्ट में बदलने के लिए।
  • Result.formatJSON() JSON स्ट्रिंग में jOOQ परिणाम को प्रारूपित करने के लिए।

परिणामी स्वरूपण इस तरह दिखेगा:

{"fields":[{"name":"field-1","type":"type-1"},
           {"name":"field-2","type":"type-2"},
           ...,
           {"name":"field-n","type":"type-n"}],
 "records":[[value-1-1,value-1-2,...,value-1-n],
            [value-2-1,value-2-2,...,value-2-n]]}

तुम भी आसानी से, के माध्यम से अपने स्वयं के स्वरूपण बना सकते हैं Result.map(RecordMapper)

यह अनिवार्य रूप से आपके कोड के समान ही है, JSON ऑब्जेक्ट्स की पीढ़ी को दरकिनार करते हुए, सीधे "स्ट्रीमिंग" में StringBuilder । मैं यह कहूंगा कि प्रदर्शन की स्थिति दोनों मामलों में नगण्य होनी चाहिए, हालांकि।

(अस्वीकरण: मैं jOOQ के पीछे कंपनी के लिए काम करता हूं)


यह भयानक है, लेकिन मुझे परिणामी स्ट्रिंग को पार्स करने में परेशानी हो रही है। जब मूल्यों के कुछ एक उद्धरण चिह्न पार्सर नहीं कर सकते हैं सही ढंग से काम होते हैं: मुझे लगता है कि मूल्यों के अंदर है कि उद्धरण चिह्न (भाग निकले किया जाना चाहिए "करने के लिए \"आदेश एक मान्य JSON स्ट्रिंग बनाने के लिए)। क्या यह formatJSON()फ़ंक्शन का एक बग है ? या क्या मैं कुछ न कुछ भूल रहा हूं?
वनिरोस

@Oneiros: jOOQ को उन उद्धरण चिह्नों से सही ढंग से बचना चाहिए ... सर्वश्रेष्ठ एक नया प्रश्न पूछें (विवरण के साथ) या एक बग की रिपोर्ट करें: github.com/jOOQ/jOOQ/issues/new
लुकास एडर

आपके उदाहरण में, परिणामसेट का उपयोग किसमें किया गया है fetch(resultSet)? यह कहीं भी परिभाषित नहीं है। और अगर मुझे ResultSetलाने से पहले JDBC मिलता है तो इसका उद्देश्य क्या है DSL.using(connection)? इसे कनेक्शन की आवश्यकता क्यों है? :)
निकोला लोसी 29

1
@ NikolaLošić: खैर, सवाल JDBC का उपयोग करने के बारे में पूछता है ResultSet, इसलिए मुझे लगता है कि इसमें कोई संदेह नहीं है ResultSet। वास्तव में, यह स्पष्ट नहीं है कि connectionयहाँ क्यों आवश्यक है। यदि आप jOOQ का उपयोग कर रहे हैं, तो आपके पास वैसे भी आपके पास उपलब्ध DSLContext( DSL.using(connection)या इसी तरह का) परिणाम होगा , हालाँकि।
लुकास एडर

शामिल करने के लिए सही JOOQ लाइब्रेरी क्या है? मैं कई कोशिश कर रहा हूं, लेकिन हर एक ने मुझे क्लास को डीएसएल संदर्भ के साथ त्रुटि नहीं दी। Thnks
लोरेंजो Barbagli

7

@Jim कुक द्वारा दिए गए सुझावों के अलावा। एक अन्य विचार अगर-एलस के बजाय एक स्विच का उपयोग करना है:

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);

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

  json.put(obj);
}

4
लूपिंग पीछे की ओर (इंडेक्स शून्य की तुलना) भी तेज है (इंडेक्स की तुलना अभिव्यक्ति की तुलना में)।
डेव जार्विस

4

यह उत्तर सबसे कुशल नहीं हो सकता है, लेकिन यह सुनिश्चित है कि यह गतिशील है। मूल JDBC को Google की Gson लाइब्रेरी के साथ जोड़कर, मैं आसानी से SQL परिणाम से JSON स्ट्रीम में परिवर्तित कर सकता हूं।

मैंने कन्वर्टर को शामिल किया है, उदाहरण डीबी प्रॉपर्टीज़ फ़ाइल, एसक्यूएल टेबल जेनरेशन और एक ग्रैड बिल्ड फाइल (इस्तेमाल की गई निर्भरता के साथ)।

QueryApp.java

import java.io.PrintWriter;

import com.oracle.jdbc.ResultSetConverter;

public class QueryApp {
    public static void main(String[] args) {
        PrintWriter writer = new PrintWriter(System.out);
        String dbProps = "/database.properties";
        String indent = "    ";

        writer.println("Basic SELECT:");
        ResultSetConverter.queryToJson(writer, dbProps, "SELECT * FROM Beatles", indent, false);

        writer.println("\n\nIntermediate SELECT:");
        ResultSetConverter.queryToJson(writer, dbProps, "SELECT first_name, last_name, getAge(date_of_birth) as age FROM Beatles", indent, true);
    }
}

ResultSetConverter.java

package com.oracle.jdbc;

import java.io.*;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.*;

import com.google.common.reflect.TypeToken;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonWriter;

public class ResultSetConverter {
    public static final Type RESULT_TYPE = new TypeToken<List<Map<String, Object>>>() {
        private static final long serialVersionUID = -3467016635635320150L;
    }.getType();

    public static void queryToJson(Writer writer, String connectionProperties, String query, String indent, boolean closeWriter) {
        Connection conn = null;
        Statement stmt = null;
        GsonBuilder gson = new GsonBuilder();
        JsonWriter jsonWriter = new JsonWriter(writer);

        if (indent != null) jsonWriter.setIndent(indent);

        try {
            Properties props = readConnectionInfo(connectionProperties);
            Class.forName(props.getProperty("driver"));

            conn = openConnection(props);
            stmt = conn.createStatement();

            gson.create().toJson(QueryHelper.select(stmt, query), RESULT_TYPE, jsonWriter);

            if (closeWriter) jsonWriter.close();

            stmt.close();
            conn.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException se2) {
            }
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
            try {
                if (closeWriter && jsonWriter != null) jsonWriter.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

    private static Properties readConnectionInfo(String resource) throws IOException {
        Properties properties = new Properties();
        InputStream in = ResultSetConverter.class.getResourceAsStream(resource);
        properties.load(in);
        in.close();

        return properties;
    }

    private static Connection openConnection(Properties connectionProperties) throws IOException, SQLException {
        String database = connectionProperties.getProperty("database");
        String username = connectionProperties.getProperty("username");
        String password = connectionProperties.getProperty("password");

        return DriverManager.getConnection(database, username, password);
    }
}

QueryHelper.java

package com.oracle.jdbc;

import java.sql.*;
import java.text.*;
import java.util.*;

import com.google.common.base.CaseFormat;

public class QueryHelper {
    static DateFormat DATE_FORMAT = new SimpleDateFormat("YYYY-MM-dd");

    public static List<Map<String, Object>> select(Statement stmt, String query) throws SQLException {
        ResultSet resultSet = stmt.executeQuery(query);
        List<Map<String, Object>> records = mapRecords(resultSet);

        resultSet.close();

        return records;
    }

    public static List<Map<String, Object>> mapRecords(ResultSet resultSet) throws SQLException {
        List<Map<String, Object>> records = new ArrayList<Map<String, Object>>();
        ResultSetMetaData metaData = resultSet.getMetaData();

        while (resultSet.next()) {
            records.add(mapRecord(resultSet, metaData));
        }

        return records;
    }

    public static Map<String, Object> mapRecord(ResultSet resultSet, ResultSetMetaData metaData) throws SQLException {
        Map<String, Object> record = new HashMap<String, Object>();

        for (int c = 1; c <= metaData.getColumnCount(); c++) {
            String columnType = metaData.getColumnTypeName(c);
            String columnName = formatPropertyName(metaData.getColumnName(c));
            Object value = resultSet.getObject(c);

            if (columnType.equals("DATE")) {
                value = DATE_FORMAT.format(value);
            }

            record.put(columnName, value);
        }

        return record;
    }

    private static String formatPropertyName(String property) {
        return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, property);
    }
}

database.properties

driver=com.mysql.jdbc.Driver
database=jdbc:mysql://localhost/JDBC_Tutorial
username=root
password=

JDBC_Tutorial.sql

-- phpMyAdmin SQL Dump
-- version 4.5.1
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: Jan 12, 2016 at 07:40 PM
-- Server version: 10.1.8-MariaDB
-- PHP Version: 5.6.14

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `jdbc_tutorial`
--
CREATE DATABASE IF NOT EXISTS `jdbc_tutorial` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `jdbc_tutorial`;

DELIMITER $$
--
-- Functions
--
DROP FUNCTION IF EXISTS `getAge`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `getAge` (`in_dob` DATE) RETURNS INT(11) NO SQL
BEGIN
DECLARE l_age INT;
   IF DATE_FORMAT(NOW(),'00-%m-%d') >= DATE_FORMAT(in_dob,'00-%m-%d') THEN
      -- This person has had a birthday this year
      SET l_age=DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(in_dob,'%Y');
   ELSE
      -- Yet to have a birthday this year
      SET l_age=DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(in_dob,'%Y')-1;
   END IF;
      RETURN(l_age);
END$$

DELIMITER ;

-- --------------------------------------------------------

--
-- Table structure for table `beatles`
--

DROP TABLE IF EXISTS `beatles`;
CREATE TABLE IF NOT EXISTS `beatles` (
  `id` int(11) NOT NULL,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `date_of_birth` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Truncate table before insert `beatles`
--

TRUNCATE TABLE `beatles`;
--
-- Dumping data for table `beatles`
--

INSERT INTO `beatles` (`id`, `first_name`, `last_name`, `date_of_birth`) VALUES(100, 'John', 'Lennon', '1940-10-09');
INSERT INTO `beatles` (`id`, `first_name`, `last_name`, `date_of_birth`) VALUES(101, 'Paul', 'McCartney', '1942-06-18');
INSERT INTO `beatles` (`id`, `first_name`, `last_name`, `date_of_birth`) VALUES(102, 'George', 'Harrison', '1943-02-25');
INSERT INTO `beatles` (`id`, `first_name`, `last_name`, `date_of_birth`) VALUES(103, 'Ringo', 'Starr', '1940-07-07');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'

mainClassName = 'com.oracle.jdbc.QueryApp'

repositories {
    maven  {
        url "http://repo1.maven.org/maven2"
    }
}

jar {
    baseName = 'jdbc-tutorial'
    version =  '1.0.0'
}

sourceCompatibility = 1.7
targetCompatibility = 1.7

dependencies {
    compile 'mysql:mysql-connector-java:5.1.16'
    compile 'com.google.guava:guava:18.0'
    compile 'com.google.code.gson:gson:1.7.2'
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.9'
}

परिणाम

मूल चयन

[
    {
        "firstName": "John",
        "lastName": "Lennon",
        "dateOfBirth": "1940-10-09",
        "id": 100
    },
    {
        "firstName": "Paul",
        "lastName": "McCartney",
        "dateOfBirth": "1942-06-18",
        "id": 101
    },
    {
        "firstName": "George",
        "lastName": "Harrison",
        "dateOfBirth": "1943-02-25",
        "id": 102
    },
    {
        "firstName": "Ringo",
        "lastName": "Starr",
        "dateOfBirth": "1940-07-07",
        "id": 103
    }
]

इंटरमीडिएट का चयन

[
    {
        "firstName": "John",
        "lastName": "Lennon",
        "age": 75
    },
    {
        "firstName": "Paul",
        "lastName": "McCartney",
        "age": 73
    },
    {
        "firstName": "George",
        "lastName": "Harrison",
        "age": 72
    },
    {
        "firstName": "Ringo",
        "lastName": "Starr",
        "age": 75
    }
]

3

स्तंभ नाम, दूसरा उपयोग सबसे पहले पूर्व उत्पन्न rs.getString(i)करने के बजाय rs.getString(column_name)

इसका कार्यान्वयन निम्नलिखित है:

    /*
     * Convert ResultSet to a common JSON Object array
     * Result is like: [{"ID":"1","NAME":"Tom","AGE":"24"}, {"ID":"2","NAME":"Bob","AGE":"26"}, ...]
     */
    public static List<JSONObject> getFormattedResult(ResultSet rs) {
        List<JSONObject> resList = new ArrayList<JSONObject>();
        try {
            // get column names
            ResultSetMetaData rsMeta = rs.getMetaData();
            int columnCnt = rsMeta.getColumnCount();
            List<String> columnNames = new ArrayList<String>();
            for(int i=1;i<=columnCnt;i++) {
                columnNames.add(rsMeta.getColumnName(i).toUpperCase());
            }

            while(rs.next()) { // convert each object to an human readable JSON object
                JSONObject obj = new JSONObject();
                for(int i=1;i<=columnCnt;i++) {
                    String key = columnNames.get(i - 1);
                    String value = rs.getString(i);
                    obj.put(key, value);
                }
                resList.add(obj);
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return resList;
    }

मैं ऑब्जेक्ट का उपयोग और उपयोग कैसे करूं .... मैं संपूर्ण नाम कॉलम मुद्रित करना चाहता हूं..और क्या CRUD संचालन के लिए आसानी से उपलब्ध वस्तु है ??
प्रथमेश दांवादे

@Prathameshdhanawade यह विधि JDBC ResultSet को JSON सरणी में गुप्त करने के लिए है। डेवलपर्स आमतौर पर कच्चे JDBC ResultSet का उपयोग नहीं करते हैं, वे आमतौर पर इसे जावा ऑब्जेक्ट्स की सूची में परिवर्तित करते हैं, अर्थात JSON ऑब्जेक्ट। आप देखते हैं कि रिटर्न मान JSON ऑब्जेक्ट्स की एक सरणी है। आप आसानी से एक वस्तु तक पहुंच JSONObject json = resList.get(i);सकते हैं तब आप JSON ऑब्जेक्ट में हेरफेर करने के लिए स्वतंत्र हैं json
कोडरज़

वास्तव में मुझे चित्रमय दृश्य तैयार करने के लिए वस्तु की आवश्यकता होगी। तो मैं सिर्फ उत्सुक मैं वस्तु में हेरफेर कर सकता है। Thnx।
प्रथमेश दांवादे

क्या आप कृपया "चित्रमय दृश्य" का वर्णन कर सकते हैं? या एक उदाहरण दिया?
कोडरज़

मैं स्तंभ मान प्रदर्शित करने का प्रयास कर रहा हूं: JSONObject obj = jsonList.get (1); Println (obj.getString ( "नाम") + "\ t" + obj.getString ( "कंपनी")); लेकिन "org.json.JSONException: JSONObject [" नाम "] नहीं मिला के रूप में एक त्रुटि हो रही है।"
प्रथमेश दांवादे

2

अगर किसी के पास इस कार्यान्वयन का उपयोग करने की योजना है, तो आप इसे और यह जांचना चाहते हैं

यह उस रूपांतरण कोड का मेरा संस्करण है:

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

        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.getLong(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.REAL) {
                obj.put(column_name, rs.getFloat(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.getDouble(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.CHAR) {
                obj.put(column_name, rs.getString(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.NCHAR) {
                obj.put(column_name, rs.getNString(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.LONGNVARCHAR) {
                obj.put(column_name, rs.getNString(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.LONGVARCHAR) {
                obj.put(column_name, rs.getString(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.TINYINT) {
                obj.put(column_name, rs.getByte(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.SMALLINT) {
                obj.put(column_name, rs.getShort(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.TIME) {
                obj.put(column_name, rs.getTime(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.TIMESTAMP) {
                obj.put(column_name, rs.getTimestamp(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.BINARY) {
                obj.put(column_name, rs.getBytes(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.VARBINARY) {
                obj.put(column_name, rs.getBytes(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.LONGVARBINARY) {
                obj.put(column_name, rs.getBinaryStream(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.BIT) {
                obj.put(column_name, rs.getBoolean(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.CLOB) {
                obj.put(column_name, rs.getClob(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.NUMERIC) {
                obj.put(column_name, rs.getBigDecimal(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.DECIMAL) {
                obj.put(column_name, rs.getBigDecimal(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.DATALINK) {
                obj.put(column_name, rs.getURL(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.REF) {
                obj.put(column_name, rs.getRef(column_name));
            } else if (rsmd.getColumnType(i) == java.sql.Types.STRUCT) {
                obj.put(column_name, rs.getObject(column_name)); // must be a custom mapping consists of a class that implements the interface SQLData and an entry in a java.util.Map object.
            } else if (rsmd.getColumnType(i) == java.sql.Types.DISTINCT) {
                obj.put(column_name, rs.getObject(column_name)); // must be a custom mapping consists of a class that implements the interface SQLData and an entry in a java.util.Map object.
            } else if (rsmd.getColumnType(i) == java.sql.Types.JAVA_OBJECT) {
                obj.put(column_name, rs.getObject(column_name));
            } else {
                obj.put(column_name, rs.getString(i));
            }
        }

        json.put(obj);
    }

    return json;
}
}

2

बस एक सिर के रूप में, अगर / फिर लूप एनम के लिए स्विच की तुलना में अधिक कुशल है। यदि आपके पास कच्चे एनम पूर्णांक के खिलाफ स्विच है, तो यह अधिक कुशल है, लेकिन चर के खिलाफ, यदि / तो अधिक कुशल है, कम से कम जावा 5, 6 और 7 के लिए।

Ie, किसी कारण से (कुछ प्रदर्शन परीक्षणों के बाद)

if (ordinalValue == 1) {
   ...
} else (ordinalValue == 2 {
   ... 
}

से तेज है

switch( myEnum.ordinal() ) {
    case 1:
       ...
       break;
    case 2:
       ...
       break;
}

मैं देखता हूं कि कुछ लोग मुझ पर संदेह कर रहे हैं, इसलिए मैं यहां कोड पोस्ट करूंगा कि आप खुद को अंतर देखने के लिए चला सकते हैं, आउटपुट मेरे पास जावा 7 से है। 10 enum मान के साथ निम्न कोड के परिणाम निम्नानुसार हैं। नोट करें कि यहाँ अगर / है तो एक पूर्णांक मान का उपयोग करते हुए enum के क्रमिक स्थिरांक की तुलना में, बनाम एक enum के क्रमिक मान के साथ कच्चे int ordinal मान के विरुद्ध स्विच, बनाम प्रत्येक enum नाम के साथ enum के साथ एक स्विच। यदि पूर्णांक मान के साथ / फिर दोनों अन्य स्विचों को हरा देते हैं, हालांकि अंतिम स्विच पहले स्विच की तुलना में थोड़ा तेज था, यह if / else की तुलना में तेज नहीं था।

यदि / अन्यथा 23 एमएस
लिया स्विच 45 एमएस
लिया 2 स्विच 30 एमएस
कुल मैच लिया : 3000000

package testing;

import java.util.Random;

enum TestEnum {
    FIRST,
    SECOND,
    THIRD,
    FOURTH,
    FIFTH,
    SIXTH,
    SEVENTH,
    EIGHTH,
    NINTH,
    TENTH
}

public class SwitchTest {
    private static int LOOP = 1000000;
    private static Random r = new Random();
    private static int SIZE = TestEnum.values().length;

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        int matches = 0;
        for (int i = 0; i < LOOP; i++) {
            int j = r.nextInt(SIZE);
            if (j == TestEnum.FIRST.ordinal()) {
                matches++;
            } else if (j == TestEnum.SECOND.ordinal()) {
                matches++;
            } else if (j == TestEnum.THIRD.ordinal()) {
                matches++;
            } else if (j == TestEnum.FOURTH.ordinal()) {
                matches++;
            } else if (j == TestEnum.FIFTH.ordinal()) {
                matches++;
            } else if (j == TestEnum.SIXTH.ordinal()) {
                matches++;
            } else if (j == TestEnum.SEVENTH.ordinal()) {
                matches++;
            } else if (j == TestEnum.EIGHTH.ordinal()) {
                matches++;
            } else if (j == TestEnum.NINTH.ordinal()) {
                matches++;
            } else {
                matches++;
            }
        }
        System.out.println("If / else took "+(System.currentTimeMillis() - time)+" ms");
        time = System.currentTimeMillis();
        for (int i = 0; i < LOOP; i++) {
            TestEnum te = TestEnum.values()[r.nextInt(SIZE)];
            switch (te.ordinal()) {
                case 0:
                    matches++;
                    break;
                case 1:
                    matches++;
                    break;
                case 2:
                    matches++;
                    break;
                case 3:
                    matches++;
                    break;
                case 4:
                    matches++;
                    break;
                case 5:
                    matches++;
                    break;
                case 6:
                    matches++;
                    break;
                case 7:
                    matches++;
                    break;
                case 8:
                    matches++;
                    break;
                case 9:
                    matches++;
                    break;
                default:
                    matches++;
                    break;
            }
        }
        System.out.println("Switch took "+(System.currentTimeMillis() - time)+" ms");
        time = System.currentTimeMillis();
        for (int i = 0; i < LOOP; i++) {
            TestEnum te = TestEnum.values()[r.nextInt(SIZE)];
            switch (te) {
                case FIRST:
                    matches++;
                    break;
                case SECOND:
                    matches++;
                    break;
                case THIRD:
                    matches++;
                    break;
                case FOURTH:
                    matches++;
                    break;
                case FIFTH:
                    matches++;
                    break;
                case SIXTH:
                    matches++;
                    break;
                case SEVENTH:
                    matches++;
                    break;
                case EIGHTH:
                    matches++;
                    break;
                case NINTH:
                    matches++;
                    break;
                default:
                    matches++;
                    break;
            }
        }
        System.out.println("Switch 2 took "+(System.currentTimeMillis() - time)+" ms");     
        System.out.println("Total matches: "+matches);
    }
}

ठीक है, लेकिन ठीक है .. व्यावहारिक सच्चाई यह है कि किसी भी वास्तविक उपयोग के मामले के लिए इन कोडिंग विकल्पों के बीच का अंतर इतना छोटा है कि, एक वास्तविक अनुप्रयोग में, उनके बीच प्रदर्शन अंतर सबसे अधिक संभावना छोटे होंगे। पहले अपना कोड सही करें और फिर (केवल तभी) इसे तेज़ करें (यदि इसे तेज़ करने की आवश्यकता है)।
स्कॉट

सहमत थे, लेकिन मुख्य सवाल सबसे तेज, सबसे कुशल तरीके के संबंध में था। कई शैलियाँ हैं जो कोड को पढ़ना या बनाए रखना मुश्किल बनाती हैं, लेकिन अधिक कुशल हैं, हालांकि आमतौर पर भविष्य में कुछ बिंदु पर संकलक अनुकूलन द्वारा हल किया जाता है। इसका एक उदाहरण intern()स्ट्रिंग्स के लिए उपयोग है जो जावा के अधिकांश आधुनिक संस्करणों में बड़े पैमाने पर आवश्यक नहीं हैं।
मार्कस

सहमत, लेकिन अगर तत्कालीन और स्विच-केस ब्लॉक खुद को किसी भी मामले में स्थिरता, मजबूती और पठनीयता की समस्याओं के लिए खराब समाधान हैं। आपके पास (या जिनके कोड को आप संशोधित कर सकते हैं) एनमों के लिए, समृद्ध एनुम प्रकार में निरंतर-विशिष्ट विधियों का उपयोग करने के लिए सबसे अच्छा अभ्यास अक्सर होता है, ज्यादातर समय, एक एनुम पर स्विचिंग को परिधि के साथ देखा जाना चाहिए क्योंकि बेहतर हैं वहाँ समाधान।
scottb

1

उन सभी के लिए जिन्होंने इफ-मेश के समाधान के लिए चुना है, कृपया उपयोग करें:

String columnName = metadata.getColumnName(
String displayName = metadata.getColumnLabel(i);
switch (metadata.getColumnType(i)) {
case Types.ARRAY:
    obj.put(displayName, resultSet.getArray(columnName));
    break;
...

क्योंकि आपकी क्वेरी में उपनाम के मामले में, स्तंभ नाम और स्तंभ लेबल दो अलग-अलग चीजें हैं। उदाहरण के लिए यदि आप निष्पादित करते हैं:

select col1, col2 as my_alias from table

तुम्हे मिल जाएगा

[
    { "col1": 1, "col2": 2 }, 
    { "col1": 1, "col2": 2 }
]

बजाय:

[
    { "col1": 1, "my_alias": 2 }, 
    { "col1": 1, "my_alias": 2 }
]

0
package com.idal.cib;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DBJsonConverter {

    static ArrayList<String> data = new ArrayList<String>();
    static Connection conn = null;
    static PreparedStatement ps = null;
    static ResultSet rs = null;
    static String path = "";
    static String driver="";
    static String url="";
    static String username="";
    static String password="";
    static String query="";

    @SuppressWarnings({ "unchecked" })
    public static void dataLoad(String path) {
        JSONObject obj1 = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        conn = DatabaseConnector.getDbConnection(driver, url, username,
                password);
        try {
            ps = conn.prepareStatement(query);
            rs = ps.executeQuery();
            ArrayList<String> columnNames = new ArrayList<String>();
            if (rs != null) {
                ResultSetMetaData columns = rs.getMetaData();
                int i = 0;
                while (i < columns.getColumnCount()) {
                    i++;
                    columnNames.add(columns.getColumnName(i));
                }
                while (rs.next()) {
                    JSONObject obj = new JSONObject();
                    for (i = 0; i < columnNames.size(); i++) {
                        data.add(rs.getString(columnNames.get(i)));
                        {
                            for (int j = 0; j < data.size(); j++) {
                                if (data.get(j) != null) {
                                    obj.put(columnNames.get(i), data.get(j));
                                }else {
                                    obj.put(columnNames.get(i), "");
                                }
                            }
                        }
                    }

                    jsonArray.add(obj);
                    obj1.put("header", jsonArray);
                    FileWriter file = new FileWriter(path);
                    file.write(obj1.toJSONString());
                    file.flush();
                    file.close();
                }
                ps.close();
            } else {
                JSONObject obj2 = new JSONObject();
                obj2.put(null, null);
                jsonArray.add(obj2);
                obj1.put("header", jsonArray);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    rs.close();
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        driver = "oracle.jdbc.driver.OracleDriver";
        url = "jdbc:oracle:thin:@localhost:1521:database";
        username = "user";
        password = "password";
        path = "path of file";
        query = "select * from temp_employee";

        DatabaseConnector dc = new DatabaseConnector();
        dc.getDbConnection(driver,url,username,password);
        DBJsonConverter formatter = new DBJsonConverter();
        formatter.dataLoad(path);

    }

}




package com.idal.cib;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnector {

    static Connection conn1 = null;

    public static Connection getDbConnection(String driver, String url,
            String username, String password) {
        // TODO Auto-generated constructor stub
        try {

            Class.forName(driver);

            conn1 = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn1;
    }

}

Pl अपने उत्तर में कुछ स्पष्टीकरण जोड़ें।
साहिल मित्तल

0
public static JSONArray GetJSONDataFromResultSet(ResultSet rs) throws SQLException {
    ResultSetMetaData metaData = rs.getMetaData();
    int count = metaData.getColumnCount();
    String[] columnName = new String[count];
    JSONArray jsonArray = new JSONArray();
    while(rs.next()) {
        JSONObject jsonObject = new JSONObject();
        for (int i = 1; i <= count; i++){
               columnName[i-1] = metaData.getColumnLabel(i);
               jsonObject.put(columnName[i-1], rs.getObject(i));
        }
        jsonArray.put(jsonObject);
    }
    return jsonArray;
}

-1

दूसरे तरीके से, यहाँ मैंने ArrayList और Map का उपयोग किया है, इसलिए इसकी पंक्ति के द्वारा json ऑब्जेक्ट रो को कॉल न करें लेकिन परिणाम के समाप्ति के बाद:

 List<Map<String, String>> list = new ArrayList<Map<String, String>>();

  ResultSetMetaData rsMetaData = rs.getMetaData();  


      while(rs.next()){

              Map map = new HashMap();
              for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
                 String key = rsMetaData.getColumnName(i);

                  String value = null;

               if (rsmd.getColumnType(i) == java.sql.Types.VARCHAR) {
                           value = rs.getString(key);
               } else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT)                         
                             value = rs.getLong(key);
               }                  


                    map.put(key, value);
              }
              list.add(map);


    }


     json.put(list);    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.