20 berichten aan het bekijken - 1 tot 20 (van in totaal 20)
  • Q:

    Bijdrager
    verwijderd-profiel

    Externe MySQL database in Java

    Hoi,

    Ik heb als projectje een website gemaakt waar je films die je hebt gezien kunt raten, of films die je nog wilt zien kunt toevoegen aan een “to-watch” lijstje. Deze data wordt allemaal opgeslagen in de database gekoppeld aan die website.

    Nu wil ik er een Java app voor gaan maken, maar ik kan niet vinden wat ik nou eigenlijk moet gebruiken om met een externe MySQL database te communiceren.

    Iemand tips? Welke Class is hier geschikt voor (als er een class voor is…)

    Bedankt


    Bijdrager
    verwijderd-profiel

    JDBC had ik al gedownload en toegevoegd aan mn project, maar de helft van de bestanden (en dat zijn er een paar honderd) staan vol met fouten. Ik hoopte dus of er een alternatief is.
    Ik had dit rechtstreeks bij mysql.com gedownload


    Bijdrager
    Wyodor

    maar ik kan niet vinden wat ik nou eigenlijk moet gebruiken om met een externe MySQL database te communiceren.

    Dus je had het wel gevonden.


    Bijdrager
    verwijderd-profiel

    Ja, ik had wat gevonden, maar dat werkt niet.
    Dus ik heb nog niks werkends gevonden.

    OF ik doe iets verkeerd met het installeren van JDBC:
    De mappen in de “src” map van JDBC heb ik gekopieerd naar de “src” map van het java project.
    Maar echt de helft van de bestanden zit vol met fouten.

    Of ik doe het dus fout.


    Bijdrager
    TheBigZ

    In de goede oude tijd ging dat via JDBC.
    http://www.vogella.com/tutorials/MySQLJava/article.html


    Bijdrager
    verwijderd-profiel

    Ik lees dat wel even door, misschien is het dus toch wat meer werk dan die mappen kopieeren.


    Bijdrager
    verwijderd-profiel

    Ah, het waren niet de source files die ik nodig heb maar de .jar die hij als library ziet.

    Ja, het is vrijdag he.


    Bijdrager
    peterjanp

    Je kan altijd met JQuery een ajax call doen naar een extern php script (dat op je server staat). PHP kan daarna met de data handelen. Bekijk dit anders eens: http://www.w3schools.com/Php/php_ajax_database.asp


    Bijdrager
    koen

    @peterjanp: dat is javascript (en waarschijnlijk een handigere manier), maar de ts zoekt naar een Java oplossing.


    Bijdrager
    verwijderd-profiel

    JDBC werkt wel.

    Helaas is de verbinding connectie leggen traag. Kost 500ms bijna.
    En je moet de connectie sluiten voordat je een nieuwe query uitvoert.


    Geblokkeerd
    Anoniem

    Helaas is de verbinding connectie leggen traag. Kost 500ms bijna.
    En je moet de connectie sluiten voordat je een nieuwe query uitvoert.

    Da’s vreemd, je zou van alles en nog wat moeten kunnen doen op een enkele connectie.
    Kun je een voorbeeldje posten?


    Bijdrager
    verwijderd-profiel
     
     
    public class DatabaseHandler {
     
        private Connection connection;
        private Statement statement;
        private PreparedStatement preparedStatement;
        private ResultSet resultSet;
     
        private final String DB_URL;
        private final String DB_NAME;
        private final String DB_USERNAME;
        private final String DB_PASSWORD;
     
        public DatabaseHandler() throws SAXException, ParserConfigurationException, IOException, SQLException {
            String[] databaseInfo = getDatabaseInfo();
     
            this.DB_URL = databaseInfo[0];
            this.DB_NAME = databaseInfo[1];
            this.DB_USERNAME = databaseInfo[2];
            this.DB_PASSWORD = databaseInfo[3];
     
            databaseInfo = null;
        }
     
        /**
         *
         * @param user
         * @param watched
         * @return a List<Map<String, String>> with a movie in every map with
         * following information:<br />
         * - ID<br />
         * - Title<br />
         * - Link<br />
         * - Year<br />
         * - Image (link)<br />
         * - Description<br />
         * - Genre<br />
         * @throws Exception
         */
        public List getAllWatchedOrUnwatchedMoviesForUser(User user, boolean watched) throws Exception {
     
            connection = getDatabaseConnection();
     
            // variables to use in statement
            String table;
            if (watched) {
                table = "Watched";
            } else {
                table = "ToWatch";
            }
     
            // prepare statement
            preparedStatement = connection.prepareStatement(
                    "SELECT * "
                    + "FROM Movie M "
                    + "WHERE M.ID IN ( "
                    + "SELECT " + table + ".ID "
                    + "FROM " + table + " "
                    + "WHERE " + table + ".Email = ? "
                    + ") "
            );
     
            preparedStatement.setString(1, user.getEmail());
            resultSet = preparedStatement.executeQuery();
     
            List<Movie> allWatchedOrUnwatchedMovies = new ArrayList<>();
     
            while (resultSet.next()) {
     
                Map<String, String> tempMovie = new HashMap<>();
     
                tempMovie.put("ID", resultSet.getString(("ID")));
                tempMovie.put("Title", resultSet.getString("Title"));
                tempMovie.put("Link", resultSet.getString("Link"));
                tempMovie.put("Year", resultSet.getString("Year"));
                tempMovie.put("Image", resultSet.getString("Image"));
                tempMovie.put("Description", resultSet.getString("Description"));
                tempMovie.put("Genre", resultSet.getString("Genre"));
     
                allWatchedOrUnwatchedMovies.add(new Movie(tempMovie));
     
            }
     
            close();
     
            return allWatchedOrUnwatchedMovies;
     
        }
     
        /**
         *
         * @return the following info (in a String[]) needed to connect with the
         * database:<br />
         * - DB_URL<br />
         * - DB_NAME<br />
         * - DB_USERNAME<br />
         * - DB_PASSWORD<br />
         * @throws ParserConfigurationException
         * @throws SAXException
         * @throws IOException
         */
        private String[] getDatabaseInfo() throws ParserConfigurationException, SAXException, IOException {
     
            File databaseInfoFile = new File("files/dbinfo.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(databaseInfoFile);
     
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("DBInfo");
            String[] databaseInfo = new String[4];
     
            Node nNode = nList.item(0);
            Element eElement = (Element) nNode;
     
            databaseInfo[0] = eElement.getElementsByTagName("DB_URL").item(0).getTextContent();
            databaseInfo[1] = eElement.getElementsByTagName("DB_NAME").item(0).getTextContent();
            databaseInfo[2] = eElement.getElementsByTagName("DB_USERNAME").item(0).getTextContent();
            databaseInfo[3] = eElement.getElementsByTagName("DB_PASSWORD").item(0).getTextContent();
     
            return databaseInfo;
        }
     
        /**
         *
         * @return a databaseconnection
         * @throws SQLException
         */
        private Connection getDatabaseConnection() throws SQLException {
            return DriverManager.getConnection(this.DB_URL, this.DB_USERNAME, this.DB_PASSWORD);
        }
     
        //@@ find out what this does and maybe change it
        // You need to close the resultSet
        private void close() {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
     
                if (statement != null) {
                    statement.close();
                }
     
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
     
            }
        }
     
    }
     
     
     

    Elke method die met de database communiceert moet je

     
    connection = DriverManager.getConnection(this.DB_URL, this.DB_USERNAME, this.DB_PASSWORD);
     

    voor doen.
    Aan het eind moet je close(); doen.

    Doe je de close niet aan het eind, dan zou je verwachten dat je niet steeds de connectie met de database moet leggen. Dat heb ik dus ook al geprobeerd, maar dat werkt dus niet.

    Dit is de foutmelding:

     
    Mar 10, 2014 5:38:32 PM moviedatabase.GUI actionPerformed
    SEVERE: null
    java.sql.SQLException: The url cannot be null
    	at java.sql.DriverManager.getConnection(DriverManager.java:556)
    	at java.sql.DriverManager.getConnection(DriverManager.java:215)
    	at moviedatabase.DatabaseHandler.getDatabaseConnection(DatabaseHandler.java:225)
    	at moviedatabase.DatabaseHandler.<init>(DatabaseHandler.java:35)
    	at moviedatabase.GUI.showAllWatchedOrUnwatchedMoviesForAccount(GUI.java:85)
    	at moviedatabase.GUI.actionPerformed(GUI.java:198)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    	at java.awt.Component.processMouseEvent(Component.java:6505)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    	at java.awt.Component.processEvent(Component.java:6270)
    	at java.awt.Container.processEvent(Container.java:2229)
    	at java.awt.Component.dispatchEventImpl(Component.java:4861)
    	at java.awt.Container.dispatchEventImpl(Container.java:2287)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    	at java.awt.Container.dispatchEventImpl(Container.java:2273)
    	at java.awt.Window.dispatchEventImpl(Window.java:2719)
    	at java.awt.Component.dispatchEvent(Component.java:4687)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    	at java.awt.EventQueue.access$200(EventQueue.java:103)
    	at java.awt.EventQueue$3.run(EventQueue.java:694)
    	at java.awt.EventQueue$3.run(EventQueue.java:692)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    	at java.awt.EventQueue$4.run(EventQueue.java:708)
    	at java.awt.EventQueue$4.run(EventQueue.java:706)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
     

    Dit is de code waar de error komt:

     
     
    public class DatabaseHandler {
     
        private Connection connection;
        private Statement statement;
        private PreparedStatement preparedStatement;
        private ResultSet resultSet;
     
        private final String DB_URL;
        private final String DB_NAME;
        private final String DB_USERNAME;
        private final String DB_PASSWORD;
     
        public DatabaseHandler() throws SAXException, ParserConfigurationException, IOException, SQLException {
            String[] databaseInfo = getDatabaseInfo();
     
            this.DB_URL = databaseInfo[0];
            this.DB_NAME = databaseInfo[1];
            this.DB_USERNAME = databaseInfo[2];
            this.DB_PASSWORD = databaseInfo[3];
     
            databaseInfo = null;
        }
     
        /**
         *
         * @param user
         * @param watched
         * @return a List<Map<String, String>> with a movie in every map with
         * following information:<br />
         * - ID<br />
         * - Title<br />
         * - Link<br />
         * - Year<br />
         * - Image (link)<br />
         * - Description<br />
         * - Genre<br />
         * @throws Exception
         */
        public List getAllWatchedOrUnwatchedMoviesForUser(User user, boolean watched) throws Exception {
     
            connection = getDatabaseConnection();
     
            // variables to use in statement
            String table;
            if (watched) {
                table = "Watched";
            } else {
                table = "ToWatch";
            }
     
            // prepare statement
            preparedStatement = connection.prepareStatement(
                    "SELECT * "
                    + "FROM Movie M "
                    + "WHERE M.ID IN ( "
                    + "SELECT " + table + ".ID "
                    + "FROM " + table + " "
                    + "WHERE " + table + ".Email = ? "
                    + ") "
            );
     
            preparedStatement.setString(1, user.getEmail());
            resultSet = preparedStatement.executeQuery();
     
            List<Movie> allWatchedOrUnwatchedMovies = new ArrayList<>();
     
            while (resultSet.next()) {
     
                Map<String, String> tempMovie = new HashMap<>();
     
                tempMovie.put("ID", resultSet.getString(("ID")));
                tempMovie.put("Title", resultSet.getString("Title"));
                tempMovie.put("Link", resultSet.getString("Link"));
                tempMovie.put("Year", resultSet.getString("Year"));
                tempMovie.put("Image", resultSet.getString("Image"));
                tempMovie.put("Description", resultSet.getString("Description"));
                tempMovie.put("Genre", resultSet.getString("Genre"));
     
                allWatchedOrUnwatchedMovies.add(new Movie(tempMovie));
     
            }
     
            close();
     
            return allWatchedOrUnwatchedMovies;
     
        }
     
        /**
         *
         * @return the following info (in a String[]) needed to connect with the
         * database:<br />
         * - DB_URL<br />
         * - DB_NAME<br />
         * - DB_USERNAME<br />
         * - DB_PASSWORD<br />
         * @throws ParserConfigurationException
         * @throws SAXException
         * @throws IOException
         */
        private String[] getDatabaseInfo() throws ParserConfigurationException, SAXException, IOException {
     
            File databaseInfoFile = new File("files/dbinfo.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(databaseInfoFile);
     
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("DBInfo");
            String[] databaseInfo = new String[4];
     
            Node nNode = nList.item(0);
            Element eElement = (Element) nNode;
     
            databaseInfo[0] = eElement.getElementsByTagName("DB_URL").item(0).getTextContent();
            databaseInfo[1] = eElement.getElementsByTagName("DB_NAME").item(0).getTextContent();
            databaseInfo[2] = eElement.getElementsByTagName("DB_USERNAME").item(0).getTextContent();
            databaseInfo[3] = eElement.getElementsByTagName("DB_PASSWORD").item(0).getTextContent();
     
            return databaseInfo;
        }
     
        /**
         *
         * @return a databaseconnection
         * @throws SQLException
         */
        private Connection getDatabaseConnection() throws SQLException {
            return DriverManager.getConnection(this.DB_URL, this.DB_USERNAME, this.DB_PASSWORD);
        }
     
        //@@ find out what this does and maybe change it
        // You need to close the resultSet
        private void close() {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
     
                if (statement != null) {
                    statement.close();
                }
     
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
     
            }
        }
     
    }
     
     
     

    Wat er anders is in deze code:

    1. private Connection connection; —> private Connection connection = getDatabaseConnection();

    2. in de method getAllWatchedOrUnwatchedMoviesForUser():
    connection = getDatabaseConnection() —-> weggehaald

    3. in de method getAllWatchedOrUnwatchedMoviesForUser():
    In de method close(); —–>
    if (connection != null) {
    connection.close();
    }
    weggehaald

    Ik had zelf al gemeten hoelang getDatabaseConnection(); duurt, dat is zeker 500ms. Dat lijkt kort, maar om telkens zo lang te wachten doet niet goed aan de gebruikerservaring.

    PS: Ik heb totaal geen ervaring met JAVA, dit is het eerste wat ik heb gemaakt. Als er dingen anders/beter opgelost kunnen worden zeg het dan.:)


    Bijdrager
    verwijderd-profiel

    En dan heb ik nog een off-topic vraagje:

    terwijl ik naar iets aan het zoeken was las ik ergens dat je niks op je JFrame moet zetten, maar alles in een JPanel op je JFrame. Nu zet ik gewoon alles (JTextArea, JButton etc.) direct op het JFrame. Wat is het nadeel daarvan?


    Geblokkeerd
    Anoniem

    Begin ‘ns met een simpel voorbeeldje, met twee queries op een connectie (ik heb echt geen zin een hele lap java door te spitten)


    Geblokkeerd
    Anoniem

    terwijl ik naar iets aan het zoeken was las ik ergens dat je niks op je JFrame moet zetten, maar alles in een JPanel op je JFrame.

    Geen idee wat er bedoeld wordt zonder te weten waar het precies over ging. Een JFrame heeft altijd een JPanel als content pane, en alles wat je met add in een JFrame zet, komt terecht in die JPanel. Die JPanel is standaard aanwezig.


    Bijdrager
    koen
     
    java.sql.SQLException: The url cannot be null
     

    Dat lijkt me toch een duidelijke aanwijzing.:wink:


    Bijdrager
    verwijderd-profiel

    De url blijft exact hetzelfde. Op een of andere manier kan een connection maar 1 query uitvoeren


    Bijdrager
    koen

    Je weet zeker dat de url niet nul is ?


    Geblokkeerd
    Bento
    Dr. op 07 maart 2014

    Ja, ik had wat gevonden, maar dat werkt niet.
    Dus ik heb nog niks werkends gevonden.

    OF ik doe iets verkeerd met het installeren van JDBC:
    De mappen in de “src” map van JDBC heb ik gekopieerd naar de “src” map van het java project.
    Maar echt de helft van de bestanden zit vol met fouten.

    Of ik doe het dus fout.

    Je spreekt jezelf tegen:

    Dr. op 07 maart 2014

    JDBC had ik al gedownload en toegevoegd aan mn project, maar de helft van de bestanden (en dat zijn er een paar honderd) staan vol met fouten. Ik hoopte dus of er een alternatief is.
    Ik had dit rechtstreeks bij mysql.com gedownload

    Misschien moet je even goed lezen en duidelijk zijn in wat je bedoelt. Dit kan dus niet.

20 berichten aan het bekijken - 1 tot 20 (van in totaal 20)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.