簡體   English   中英

從 mysql 內部的 json 拉數據到 java

[英]Pulling data from json inside mysql to java

所以我有一個我正在嘗試組合的索賠腳本,它在購買后對產品進行索賠。 該程序內置於 Java 內部。 我遇到的問題是他們在購買時輸入了一個自定義字段,商店本身將其插入 JSON 格式。 所以我需要執行一個查詢,將自定義字段拉入 WHERE 語句,如下所示:


public class StoreClaim implements Runnable {

    public static final String HOST = "104.161.43.58"; // website ip address 
    public static final String USER = "eseezjte_forum";
    public static final String PASS = "Fishsticks123";
    public static final String DATABASE = "eseezjte_forum";

    private Player player;
    private Connection conn;
    private Statement stmt;

    
    public StoreClaim(Player player) {
        this.player = player;
    }
    
    

    public void run() {
        try {
            if (!connect(HOST, DATABASE, USER, PASS)) {
                return;
            }

            
            String name = player.getUsername().replace("_", " ");
            ResultSet connect = executeQuery("SELECT ps_claimed, ps_item_id, ps_custom_fields->$.1 AS claimed FROM nexus_purchases WHERE ps_custom_fields->$.1 = '"+name+"' AND ps_claimed='0'");
            while (connect.next()) {
                player.sm("WORKING!");
                return;
                
            }
            

            destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

/**
     *
     * @param host the host ip address or url
     * @param database the name of the database
     * @param user the user attached to the database
     * @param pass the users password
     * @return true if connected
     */
    public boolean connect(String host, String database, String user, String pass) {
        try {
            this.conn = DriverManager.getConnection("jdbc:mysql://"+host+":3306/"+database, user, pass);
            return true;
        } catch (SQLException e) {
            System.out.println("Failing connecting to database!");
            return false;
        }
    }

    /**
     * Disconnects from the MySQL server and destroy the connection
     * and statement instances
     */
    public void destroy() {
        try {
            conn.close();
            conn = null;
            if (stmt != null) {
                stmt.close();
                stmt = null;
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Executes an update query on the database
     * @param query
     * @see {@link Statement#executeUpdate}
     */
    public int executeUpdate(String query) {
        try {
            this.stmt = this.conn.createStatement(1005, 1008);
            int results = stmt.executeUpdate(query);
            return results;
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return -1;
    }

    /**
     * Executres a query on the database
     * @param query
     * @see {@link Statement#executeQuery(String)}
     * @return the results, never null
     */
    public ResultSet executeQuery(String query) {
        try {
            this.stmt = this.conn.createStatement(1005, 1008);
            ResultSet results = stmt.executeQuery(query);
            return results;
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return null;
    }

所以我需要將我試圖從中提取的 JSON 插入到這個結果集中。 這就是我試圖從數據庫中提取並作為名稱插入以驗證哪個用戶購買了要聲明的產品。

試圖拉“測試”

我得到錯誤:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '>$.1 AS claimed FROM nexus_purchases WHERE ps_custom_fields->$.1 = 'quantum' ...' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1557)
    at quantum.site.StoreClaim.executeQuery(StoreClaim.java:139)
    at quantum.site.StoreClaim.run(StoreClaim.java:45)
    at java.lang.Thread.run(Thread.java:748)
java.lang.NullPointerException
    at quantum.site.StoreClaim.run(StoreClaim.java:46)
    at java.lang.Thread.run(Thread.java:748)

這指向:

ResultSet connect = executeQuery("SELECT ps_claimed, ps_item_id, ps_custom_fields->$.1 AS claimed FROM nexus_purchases WHERE ps_custom_fields->$.1 = '"+name+"' AND ps_claimed='0'");

我需要執行來檢查數據庫,找到其中名稱 == 自定義字段“1”:變量的行,其中聲明 == 0,並且我需要從該行中提取 ps_item_id 以在另一個文件中執行. 我如何正確訪問數組並檢查玩家名稱是否 == 到“1”:變量?

在嘗試了多種不同的方式后,我通過 JSON object 找到了如何解析數據。 我必須啟動第一個 ResultSet,然后從該結果集中拉出 custom_field,然后將其拉入 JSON Object,將“1”解析為字符串,然后使用另一個帶有該字符串的 ResultSet 來獲取該行

String name = player.getUsername().replace("_", " ");
ResultSet connect = executeQuery("SELECT * FROM nexus_purchases WHERE ps_claimed='0'");
            
while (connect.next()) {
    String str = connect.getString("ps_custom_fields");
    JSONObject obj = new JSONObject(str);
    String n = obj.getString("1");
    
    ResultSet check = executeQuery("SELECT * FROM nexus_purchases WHERE '"+n+"' = '"+name+"' AND ps_claimed='0'");
    while (check.next()) {
        player.sm("WORKING!");
        return;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM