|
[ Boyka @ 14.08.2012. 18:20 ] @
| Posle nesto vise od godinu dana C#.net-a presao sam na Javu, evo vec 2 meseca, skontao sam da je mnoogo stvari apsolutno isto ili slicno i da se mnoogo brzo uci drugi jezik, pa tako i JDBC, ono sto mi je malo cudno jeste uloga ovog jdbc driver-a, takodje sam primetio da je JDBC jednostavniji od ADO.net-a koji cini mi se ima mnogo vise ADO.net klasa...
Ono sto hocu je da mi neko ispise najjednostavniji primer ubacivanja podataka iz tekstfilda ili stringa u bazu...
Ja sam nesto ovako pokusao, ali mi izbacuje Exception sa porukom da je problem u jdbc driver-u?
Code:
public void actionPerformed(ActionEvent arg0)
{
Connection con = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver"); //ovo me malo buni i tu pokazuje gresku
con = DriverManager.getConnection("jdbc:mysql://localhost/mojasema","root","123");
st = con.createStatement();
String sql = "insert into ljudi(Ime_Prezime,Maticni_Broj)values("+textField.getText()+","+textField_1.getText()+")";
st.executeQuery(sql);
JOptionPane.showMessageDialog(null, "Uspesno ubaceno!");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, e);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,e);
}
}
Ja sam ovde u con stringu isao ovako
("ime server//naziv baze,user name, password")
Da nije mozda problem u portu, jer ja koristim port 3307, a ne default 3306... to sam u visual studiu uvek morao menjati..
[Ovu poruku je menjao Boyka dana 15.08.2012. u 10:03 GMT+1] |
[ nemnesic @ 14.08.2012. 18:50 ] @
copy/paste celu Exception.
[ Boyka @ 14.08.2012. 21:10 ] @
Citat: nemnesic:
copy/paste celu Exception.
? Zasto bih kopirao izuzetke?
[ nemnesic @ 14.08.2012. 21:17 ] @
?...da bi znao koko da ti pomognem...jer kazes da ti " izbacuje Exception sa porukom da je problem u jdbc driver-u" a to moze da bude zbog 100 razloga
[ megabaja @ 14.08.2012. 21:41 ] @
Jedan bivši kolega kaže: stacktrace or it didn't happen :)
[ bantu @ 15.08.2012. 07:28 ] @
Vjerovatno ti jar file sa mysql driver-om nije na classpath-u. Ali sve će ti biti jasno ako svoj kod zamjeniš ovim i pratiš console output.
Code:
public void actionPerformed(ActionEvent arg0) {
Connection con = null;
Statement st = null;
try {
Class.forName("com.mysql.jdbc.Driver"); //ovo me malo buni i tu pokazuje gresku
con = DriverManager.getConnection("jdbc:mysql://localhost/mojasema","root","123");
st = con.createStatement();
String sql = "insert into ljudi(Ime_Prezime,Maticni_Broj)values("+textField.getText()+","+textField_1.getText()+")";
st.executeQuery(sql);
JOptionPane.showMessageDialog(null, "Uspesno ubaceno!");
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, e);
}
}
[ Boyka @ 15.08.2012. 08:56 ] @
Console Exception:
Code:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at JDBC_vezba$2.actionPerformed(JDBC_vezba.java:60)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Koliko vidim putanja do baze nije ispravna
[ Dragan @ 15.08.2012. 10:50 ] @
Kao sto ti je neko vec rekao, fali ti MySQL driver (jar) ili nije na classpath-u. Moras da ga skines odnekud i stavis na classpath, tj. objasnis gde se nalazi.
Ova linija u stack trace-u (exception) ti to kaze:
Citat: java.lang.ClassNotFoundException: com.mysql.jdbc.Drive
[ Boyka @ 15.08.2012. 12:24 ] @
Citat: Dragan:
Kao sto ti je neko vec rekao, fali ti MySQL driver (jar) ili nije na classpath-u. Moras da ga skines odnekud i stavis na classpath, tj. objasnis gde se nalazi.
Ova linija u stack trace-u (exception) ti to kaze:
Citat: java.lang.ClassNotFoundException: com.mysql.jdbc.Drive
Aaa konektor mi teba jel? Ovo > http://dev.mysql.com/downloads/connector/j/
trebao mi je i za c#, sad cu da probam...
[ kljunovi @ 16.08.2012. 09:24 ] @
Pored nedostata drajvera moraces da obratis kako ubacujes stvari u bazu. Da razliujes tipove podataka.
npr ako su ti Ime_Prezime i Maticni_Broj verdnosti stringa moraces da string vrednsoti stavis izmedju ' '
"insert into ljudi(Ime_Prezime,Maticni_Broj)values("+ "'"+ textField.getText()+"'"+","+"'"+textField_1.getText()+"'"+")";
drugi je meni laksi da koristis PreparedStatement, eno ti neki primer
public boolean addResultMetrics(Connection conn, String recordId, String metricsId, String schemeId, String classId, Integer year, Double count, Double fraction) {
try {
PreparedStatement stmt = conn
.prepareStatement("insert into MARC21RECORD_METRICS (RECORDID, CFMETRICSID, CFCLASSSCHEMEID, CFCLASSID, CFYEAR, CFCOUNT, CFFRACTION) values (?, ?, ?, ?, ?, ?, ?)");
stmt.setString(1, recordId);
stmt.setString(2, metricsId);
stmt.setString(3, schemeId);
stmt.setString(4, classId);
stmt.setInt(5, year);
stmt.setDouble(6, count);
if(fraction != null)
stmt.setDouble(7, fraction);
else
stmt.setNull(7, Types.DOUBLE);
stmt.executeUpdate();
stmt.close();
return true;
} catch (SQLException e) {
log.fatal(e);
log.fatal("Cannot add resultMetrics: " + recordId + " and " + metricsId);
}
return false;
}
[ Boyka @ 16.08.2012. 10:46 ] @
Provalio sam za taj PreparedStatement radi veoma slično kao u C#-u com.Parameters.AddWithValue("ime kolone",odakle ubacuje, textbox);
[ dule_ns @ 16.08.2012. 11:31 ] @
Inače, ovo:
Code: String sql = "insert into ljudi(Ime_Prezime,Maticni_Broj)values("+textField.getText()+","+textField_1.getText()+")";
nemoj nikad ni slučajno da radiš. Ni kod inserta, ni kod selecta, nikad.
Nego ako koristiš JDBC onda preparedstatemet + postavljanje parametara.
[ ByteCode @ 16.08.2012. 13:39 ] @
Citat: dule_ns:
Inače, ovo:
Code: String sql = "insert into ljudi(Ime_Prezime,Maticni_Broj)values("+textField.getText()+","+textField_1.getText()+")";
nemoj nikad ni slučajno da radiš. Ni kod inserta, ni kod selecta, nikad.
Nego ako koristiš JDBC onda preparedstatemet + postavljanje parametara.
Sve je to lepo, samo kazi coveku zasto nikada. Elem u pitanju je mogucnost da neko naprvi SQL inject napad, znaci onaj textField.getText() vrati string tipa Code: "); drop table ljudi ; --"
A moze da bude bilo kakvo vrsljanje po bazi.
Druga stvar na koju bi ti skrenuo paznju jeste da ta vrsljanja sa bazom ne radis u event handleru zato sto to blokira GUI, ako se desi situacija tipa conection time out cela aplikacija se zamrzla kompletno. Za takve stvari uzmi pogledaj SwingWorker.
[ dule_ns @ 16.08.2012. 14:46 ] @
@ByteCode
Naravno, u pravu si.
Ima tu još oko "zatvaranja" resursa (tu recimo primer od @kljunovi ne valja, trebalo bi u finally bloku da zatvara preparedstatement) ali mi je ovo palo u oči a prilično je opasno.
U svakom slučaju slažem se da je poželjno i obrazložiti.
[ vatri @ 21.08.2012. 11:48 ] @
Brate jesi li se uspio konektovati?
Meni kad upisem
"java MySQLDemo"
izbaci ovu gresku:
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
A kad pokusam
"java -classpath *.jar MySQLDemo"
kaze
Error: Could not find or load main class MySQLDemo
Ne kontam kako sad odjednom ne nalazi ovu glavnu klasu?
Pretpostavljam da je problem u putanjama, ali ne znam ni sta da "guglam" , a kamoli kako da popravim ovo.
[ bantu @ 21.08.2012. 12:35 ] @
Probaj ovako:
Code:
java -classpath .;mysql-connector-TACAN-NAZIV-ARHIVE.jar;AKO-IMAS-JOS-ARHIVA.jar MySQLDemo
[ vatri @ 21.08.2012. 17:50 ] @
Probao sam sad ovo:
Code: java -classpath .;mysql-connector-java-5.1.21-bin.jar MySQLDemo
I izbaci mi ono usage pa upustva za upotrebu java komande.
[ nemnesic @ 21.08.2012. 18:00 ] @
moras da ubacis punu putanju do "mysql-connector-java-5.1.21-bin.ja"
i stavi to izmedju ""
Code: java -classpath .;"path/to/jar/mysql-connector-java-5.1.21-bin.jar" MySQLDemo
Citat: vatri:
Probao sam sad ovo:
Code: java -classpath .;mysql-connector-java-5.1.21-bin.jar MySQLDemo
I izbaci mi ono usage pa upustva za upotrebu java komande.
[ vatri @ 21.08.2012. 18:13 ] @
Probao ovo:
Code: java -classpath .;"/home/boris/Desktop/Java/MySQLDemo/mysql-connector-java-5.1.21-bin.jar" MySQLDemo
i ista stvar - izbaci ono usage.
[ vatri @ 21.08.2012. 23:03 ] @
Evo konacno nadjoh rjesenje - samo treba znati kako i sta "guglati":
http://stackoverflow.com/quest...0/importing-external-jar-files
Znaci ja sam kompajlirao program bez ukljucivanja jdbc jar fajla u putanju.
@bantu: umjesto toga sto si ti stavljao (u parametru -cp) ";" treba staviti ":" na Linux sistemu.
Code:
javac -cp .:/home/boris/Desktop/Java/MySQLDemo/mysql-connector-java-5.1.21-bin.jar MySQLDemo.java
java -cp .:/home/boris/Desktop/Java/MySQLDemo/mysql-connector-java-5.1.21-bin.jar MySQLDemo
[Ovu poruku je menjao vatri dana 22.08.2012. u 00:30 GMT+1]
[ bantu @ 22.08.2012. 07:37 ] @
Pa da, kompajlirao si je bez mysql biblioteke jer drajver instanciras dinamički tokom runtime-a putem refleksije. To i jeste neka prednost jdbc-a tako je koncipiran da ne moraš da mjenjaš ni jednu liniju koda ako hoćeš da promjeniš bazu na koju se konektuješ, samo promjeniš drajver i obezbjediš da ti je odgovarajući konektor na classpathu i to ti je to.
[ vatri @ 22.08.2012. 08:36 ] @
Mozda nisam razumljivo napisao, ali proradilo je tek kad sam kompajlirao SA drajverom.
[ bantu @ 23.08.2012. 07:20 ] @
Trebalo bi da možeš da kompajliraš bez mysql arhive, naravno ukoliko ne koristiš neku klasu ili nešto mysql specifično.
Pogledaj importe ukoliko importujes samo java.sql.* klase, onda nebi trbao da imaš problema pri kompajliranju jer su ti paketi sastavni dio standardne java biblioteke. Ukoliko ipak koristiš nešto tipa com.mysql.* onda moraš da imaš i mysql arhivu na classpathu i pri kompajliranju.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|