כשכותבים בדיקת יחידה (Unit test) לקוד שקשור לבסיס נתונים, צריך לאתחל את בסיס הנתונים לאיזה שהוא מצב ידוע ויציב לפני כל בדיקה.
מול MySQL, אפשר להשתמש בmysql עצמו כדי ליבא סקריפט SQL מוכן, אבל זה לא נחמד במיוחד:
צריך לפתוח תהליך חדש, ויש כל מני בעיות מעצבנות עם זה (בג’אווה למשל, חובה לקרוא את הפלט של התהליך, אחרת הוא יתקע בכתיבה לפלט הסטנדרטי כשיתמלא הבאפר).
הרבה יותר נחמד יהיה ליבא את הקובץ ישירות מתוך ג’אווה, בשימוש בJDBC, לא?
הנה קוד שעושה בדיוק את זה, הוא מקבל זרם קלט (InputStream) שיכול להיות כל דבר, וגם Connection JDBC שחיברתם מבעוד מועד, וקולט את הSQL לתוך בסיס הנתונים.
הקוד מתמודד עם הפלט הסטנדרטי של mysqldump.

public static void importSQL(Connection conn, InputStream in) throws SQLException
{
        Scanner s = new Scanner(in);
        s.useDelimiter(“(;(\r)?\n)|(–\n)”);
        Statement st = null;
        try
        {
                st = conn.createStatement();
                while (s.hasNext())
                {
                        String line = s.next();
                        if (line.startsWith(“/*!”) && line.endsWith(“*/”))
                        {
                                int i = line.indexOf(‘ ‘);
                                line = line.substring(i + 1, line.length() - ” */”.length());
                        }

                        if (line.trim().length() > 0)
                        {
                                st.execute(line);
                        }
                }
        }
        finally
        {
                if (st != null) st.close();
        }
}

2 תגובות ל “יבוא SQL ישירות מתוך קוד ג’אווה”

  1. Boris Shtrasman ISRAEL Debian GNU/Linux Mozilla Firefox 2.0.0.14 כותב/ת

    ומה לגבי שימוש ב bufferedinputstream ו bufferedstream (הרבה יותר מהיר ויעיל ) .

  2. עמרי ISRAEL Debian GNU/Linux Mozilla Firefox 3.0.1 כותב/ת

    1. שכנע אותי שקריאה של קובץ פעם אחת בדיוק היא “הרבה יותר מהירה ויעילה” כשמשתמשים בBufferedInputStream (עם מספרים).
    2. אף אחד לא מונע ממך להעביר לפונקציה BufferedInputStream.

השאר תגובה

FireStats icon Powered by FireStats