• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - połączenie z bazą danych

Object Storage Arubacloud
0 głosów
3,781 wizyt
pytanie zadane 31 października 2016 w Java przez kolba Początkujący (270 p.)

Witam. Robię malutki program w Javie który ma tylko odczytywać jedną kolumnę z bazy danych. Gdy wszystko odpalam, wyskakuje błąd - java.lang.NullPointerException. Szukając w internecie nie mogłem znaleźć rozwiązania mojego problemu. Liczę na pomoc. Poniżej kod.

import java.sql.*;
public class DBCONNECT 
{

	private Connection con;
	private Statement st;
	private ResultSet rs;
	
	public void DBConnect()
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			
			con = DriverManager.getConnection("jdbc:mysql:host:nazwa", "login", "haslo");
			st = con.createStatement();

			
		}catch(Exception ex)
		{
			System.out.println("Blad DBConnect(): "+ex);
		}
		
	}
	
	
	public void getData()
	{
		try
		{
			String query = "Select text From javadb";
			rs = st.executeQuery(query);
			System.out.println("Tekst z bazy danych: ");
				String tekst = rs.getString("text");
				System.out.println("Tekst z bazy danych: "+tekst);
			
			
		}catch(Exception ex)
		{
			System.out.println("Blad getData(): "+ex);
		}

		
	}
	
}

 

2 odpowiedzi

0 głosów
odpowiedź 31 października 2016 przez Javowiec Pasjonat (21,560 p.)
wybrane 1 listopada 2016 przez kolba
 
Najlepsza

Przetestowałem u siebie i nie dostałem żadnego NullPointerException. Wklej stack trace z tego błędu.

Drobna uwaga:

Zanim wyciągniesz jakiś wynik z obiektu klasy ResultSet, musisz wywołać metodę next(), najlepiej w ifie:

if(rs.next()) {
      String tekst = rs.getString("text");
      System.out.println("Tekst z bazy danych: " + tekst);
}

Czemu tak się robi możesz przeczytać tutaj: ResultSet#next.

Jeszcze drobniejsza uwaga:

Wywal to z kodu:

Class.forName("com.mysql.jdbc.Driver");

Z dokumentacji można wyczytać:

Applications no longer need to explicitly load JDBC drivers using Class.forName(). Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification.

Nie robi się tego od Javy SE 6... Taki kod ma "brzydki zapach".

Do projektu musisz oczywiście dodać mysql connector (do pobrania np. stąd -> z linku Download (JAR)). Bez tego nie połączysz się z bazą danych i dostaniesz SQLException.

komentarz 1 listopada 2016 przez kolba Początkujący (270 p.)
edycja 1 listopada 2016 przez kolba

Po dodaniu stack trace`a wypisało mi się coś takiego:

java.lang.NullPointerException
	at DBCONNECT.getData(DBCONNECT.java:31)
	at BAZADANYCH.main(BAZADANYCH.java:7)
Blad getData(): java.lang.NullPointerException

Co wskazuje na linijkę:

i 31 czyli: 

		rs = st.executeQuery(query);

I w mainie wskazuje na 7 linijke:

import java.sql.*;
public class BAZADANYCH {

	public static void main(String[] arg)
	{
		DBCONNECT connect = new DBCONNECT();
		connect.getData();
	}
	
}

Nadal nie mam rozwiązania problemu.

komentarz 1 listopada 2016 przez Javowiec Pasjonat (21,560 p.)
edycja 1 listopada 2016 przez Javowiec

Powinno być:

import java.sql.*;
public class BAZADANYCH {
 
    public static void main(String[] arg)
    {
        DBCONNECT connect = new DBCONNECT();
        connect.DBConnect();
        connect.getData();
    }
     
}

Stworzyłeś metodę (DBConnect()), nie konstruktor.

Konstruktor musi mieć taką samą nazwę jak klasa i nie może zwracać typu jak metoda (bo wiadomo, że w połączeniu z new zwróci obiekt klasy, w której się znajduje), czy mieć w sobie słowo kluczowe void:

public DBCONNECT() {
      // Twój kod
}

BTW Klasy w Javie powinny być zapisywane w notacji PascalCase :)

komentarz 1 listopada 2016 przez kolba Początkujący (270 p.)

Dalej błędy: 

Blad DBConnect(): java.sql.SQLException: No suitable driver found for jdbc:mysql:host:javadb
java.lang.NullPointerException
	at DBCONNECT.getData(DBCONNECT.java:30)
	at BAZADANYCH.main(BAZADANYCH.java:8)
Blad getData(): java.lang.NullPointerException

Jeszcze raz pokażę kody źródłowe po edycjach może ktoś się jeszcze czegoś dopatrzy:

Main: 

import java.sql.*;
public class BAZADANYCH {

	public static void main(String[] arg)
	{
		DBCONNECT connect = new DBCONNECT();
		connect.DBConnect();
		connect.getData();
	}
	
}

i DBCONNECT:

import java.sql.*;
public class DBCONNECT 
{

	private Connection con;
	private Statement st;
	private ResultSet rs;
	
	public void DBConnect()
	{
		try
		{
			con = DriverManager.getConnection("jdbc:mysql:sql.orden.home.pl:javadb", "login", "haslo");
			st = con.createStatement();
			
		}catch(Exception ex)
		{
			System.out.println("Blad DBConnect(): "+ex);
		}
		
	}
	
	
	public void getData()
	{
		try
		{
			
			rs = st.executeQuery("Select text From javadb");
			System.out.println("Tekst z bazy danych: ");
			if(rs.next()) {
				String tekst = rs.getString("text");
				System.out.println("Tekst z bazy danych: "+tekst);
			}
			
			
		}catch(Exception ex)
		{
			ex.printStackTrace();
			System.out.println("Blad getData(): "+ex);
		}

		
	}
	
}

Nie mam pojęcia dlaczego innym działa a mi nie.

komentarz 1 listopada 2016 przez Javowiec Pasjonat (21,560 p.)
edycja 1 listopada 2016 przez Javowiec

Przeczytałeś mój post dokładnie?

Do projektu musisz oczywiście dodać mysql connector (do pobrania np. stąd -> z linku Download (JAR)). Bez tego nie połączysz się z bazą danych i dostaniesz SQLException.

Tutorial jak dodać JAR do projektu (od 2:42):

https://www.youtube.com/watch?v=3aYYrzl3xzk

komentarz 1 listopada 2016 przez kolba Początkujący (270 p.)
Problem jest w tym, że ja to zrobiłem.
komentarz 1 listopada 2016 przez Javowiec Pasjonat (21,560 p.)

A zamień:

"jdbc:mysql:host:nazwa"

na:

"jdbc:mysql://host/nazwa"

 

komentarz 1 listopada 2016 przez kolba Początkujący (270 p.)

Nowy błąd: 

Blad DBConnect(): com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user '01915330_maciek'@'%' to database 'javadb'
java.lang.NullPointerException
	at DBCONNECT.getData(DBCONNECT.java:29)
	at BAZADANYCH.main(BAZADANYCH.java:8)
Blad getData(): java.lang.NullPointerException

 

komentarz 1 listopada 2016 przez Javowiec Pasjonat (21,560 p.)
Udało Ci się połączyć z hostem. Upewnij się, że ta baza danych istnieje i ma dokładnie nazwę "javadb" (nazwa tabeli != nazwie bazy danych).
komentarz 1 listopada 2016 przez kolba Początkujący (270 p.)
Rozwiązane, podałem nazwę tabeli zamiast bazy danych. Zmyliło mnie to że login i nazwa bazy danych są takie same. Dzięki za pomoc.
komentarz 1 listopada 2016 przez Javowiec Pasjonat (21,560 p.)

Proszę bardzo wink

0 głosów
odpowiedź 1 listopada 2016 przez manjaro Nałogowiec (37,390 p.)
edycja 1 listopada 2016 przez manjaro

Ja to robię tak. Nie wiem czy to jest sposób bardziej czy mniej prawidłowy ale działa dobrze przy połączeniu z baza SQLite

Dołączam do tego biblioteki 

  • sqlite-jdbc-3.8.11.2.jar
  • rs2xml.jar

 

import java.sql.*;
import javax.swing.*;

public class javaconnect {
    
    Connection conn=null;
    public static Connection ConnectDb() {
        
        try {
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:biblioteka.sqlite");
            JOptionPane.showMessageDialog(null, "Połączono");
            return conn;
                                
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Nie udało się połączyć z bazą danych");
            System.exit(0);
            return null;                               
        }
     
    }
               
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,055 wizyt
pytanie zadane 15 marca 2018 w Java przez Tomek Reda Obywatel (1,110 p.)
0 głosów
3 odpowiedzi 655 wizyt
pytanie zadane 25 lutego 2016 w Java przez konradad Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 217 wizyt
pytanie zadane 23 listopada 2019 w Programowanie przez luna22 Obywatel (1,420 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...