Permalänk
Medlem

Java - Mysql

Hej Sweclockers!

Jag håller på att programmera lite i Java men sitter fast. Ska göra en applet som arbetar mot en mysql server. Servern fungerar bra och har det add-on det behöver likså JDK:n

Men, min kod:

import java.applet.Applet;
import java.awt.Graphics;
import java.util.Vector;
import java.sql.*;

public class databas extends Applet implements Runnable {
public Thread worker;
public Vector queryResults;
public String message = "Initializing";

public synchronized void start() {
// Every time "start" is called we create a worker thread to
// re-evaluate the database query.
if (worker == null) {
message = "Connecting to database";
worker = new Thread(this);
worker.start();
}
}

/**
* The "run" method is called from the worker thread. Notice that
* because this method is doing potentially slow databases accesses
* we avoid making it a synchronized method.
*/

public void run() {
String url = "jdbc:mysql://localhost:3306/cdcol";
String query = "select * from cds";

try {
Class.forName("com.mysql.jdbc.Driver");
} catch(Exception ex) {
setError("Can't find Database driver class: " + ex);
return;
}

try {
Vector results= new Vector();
Connection con = DriverManager.getConnection(url,
"hej", "hej");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("titel");
float f = rs.getFloat("jahr");
String text = s + " " + f;
results.addElement(text);
}

stmt.close();
con.close();

setResults(results);

} catch(SQLException ex) {
setError("SQLException: " + ex);
}
}

/**
* The "paint" method is called by AWT when it wants us to
* display our current state on the screen.
*/

public synchronized void paint(Graphics g) {
// If there are no results available, display the current message.
if (queryResults == null) {
g.drawString(message, 5, 50);
return;
}

// Display the results.
g.drawString("Prices of coffee per pound: ", 5, 10);
int y = 30;
java.util.Enumeration enuma = queryResults.elements();
while (enuma.hasMoreElements()) {
String text = (String)enuma.nextElement();
g.drawString(text, 5, y);
y = y + 15;
}
}

/**
* This public method is used to record an error message for
* later display.
*/

public synchronized void setError(String mess) {
queryResults = null;
message = mess;
worker = null;
// And ask AWT to repaint this applet.
repaint();
}

/**
* This public method is used to record the results of a query, for
* later display.
*/

public synchronized void setResults(Vector results) {
queryResults = results;
worker = null;
// And ask AWT to repaint this applet.
repaint();
}
}

Den resulterar bara i:
Note: C:\.....\JCreator Pro\MyProjects\databas\src\databas.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Process completed.

Kör jag med -Xlint:unchecked får jag:
C:\.....\JCreator Pro\MyProjects\databas\src\databas.java:48: warning: [unchecked] unchecked call to addElement(E) as a member of the raw type java.util.Vector
results.addElement(text);
^
1 warning

Process completed.

Program mot Mysql är första ggn för mig så det är utanför min kunskapsnivå, därför är den mesta av koden från internet redan. Jag har hittat några exempel men aldrig någon med en paint funktion innan vilket är viktigt för mig då jag tänkte använda den till att rita ut lite och som en applet:)
Hoppas någon kan hjälpa, någon som kanske redan kan hur man gör Java mot Mysql

Visa signatur

"En vis man sa en gång"

Permalänk

Kan ej java men läs detta: http://www.rgagnon.com/javadetails/java-0521.html

Funkar det eller itne? Det ser ut som du bara får en varning

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Kan vara så, men tar jag bort varningen får jag ju,
C:\.....\JCreator Pro\MyProjects\databas\src\databas.java:48: warning: [unchecked] unchecked call to addElement(E) as a member of the raw type java.util.Vector
results.addElement(text);
^
1 warning

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem

Sen Java 1.5 har vi tillgång till generics, vilket skulle lösa ditt problem. Från Java 1.6 har du också tillgång till en foreach-loop som gör att du slipper använda enumeratorer direkt på dina kollektioner. Vidare borde du inte använda Vector, då ArrayList() är ett bättre val. Vector är en gammal, synkroniserad, typ av lista som bör lämnas orörd numera.

Problemet uppstår i att du gör en cast på ett Object från din Vector, vilket är en "unsafe operation". Så här hade jag gjort:

import java.applet.Applet; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import java.sql.*; public class databas extends Applet implements Runnable { public Thread worker; public List<String> queryResults = null; public String message = "Initializing"; public synchronized void start() { // Every time "start" is called we create a worker thread to // re-evaluate the database query. if (worker == null) { message = "Connecting to database"; worker = new Thread(this); worker.start(); } } /** * The "run" method is called from the worker thread. Notice that * because this method is doing potentially slow databases accesses * we avoid making it a synchronized method. */ public void run() { String url = "jdbc:mysql://localhost:3306/cdcol"; String query = "select * from cds"; try { Class.forName("com.mysql.jdbc.Driver"); } catch(Exception ex) { setError("Can't find Database driver class: " + ex); return; } try { queryResults = new ArrayList<String>(); Connection con = DriverManager.getConnection(url, "hej", "hej"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String s = rs.getString("titel"); float f = rs.getFloat("jahr"); String text = s + " " + f; queryResults.add(text); } stmt.close(); con.close(); handleResults(); } catch(SQLException ex) { setError("SQLException: " + ex); } } /** * The "paint" method is called by AWT when it wants us to * display our current state on the screen. */ public synchronized void paint(Graphics g) { // If there are no results available, display the current message. if (queryResults == null || queryResults.size() == 0) { g.drawString(message, 5, 50); return; } // Display the results. g.drawString("Prices of coffee per pound: ", 5, 10); int y = 30; for (String text : queryResults) { g.drawString(text, 5, y); y += 15; } } /** * This public method is used to record an error message for * later display. */ public synchronized void setError(String mess) { queryResults = null; message = mess; worker = null; // And ask AWT to repaint this applet. repaint(); } /** * This public method is used to record the results of a query, for * later display. */ public synchronized void handleResults() { worker = null; // And ask AWT to repaint this applet. repaint(); } }

Se de fetmarkerade avsnitten speciellt.

Permalänk
Medlem

Från och med Java 1.5 måste du tala om vilken typ vectorn ska innehålla: Google.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Värt att säga kanske, använder JDK 1.6.0_18
Fick inte

Citat:

Ursprungligen inskrivet av bjornie
[B] Sen Java 1.5 har vi tillgång till generics, vilket skulle lösa ditt problem. Från Java 1.6 har du också tillgång till en foreach-loop som gör att du slipper använda enumeratorer direkt på dina kollektioner. Vidare borde du inte använda Vector, då ArrayList() är ett bättre val. Vector är en gammal, synkroniserad, typ av lista som bör lämnas orörd numera.

Problemet uppstår i att du gör en cast på ett Object från din Vector, vilket är en "unsafe operation". Så här hade jag gjort:

att funka heller.
Testade du den koden och fick den att funka?

Tack

Edit:
foreach (String text : queryResults) {
g.drawString(text, 5, y);
y += 15;
}

ska det vara kolon?

Edit:
Hittade felet där, ska väl vara bara for (String text : queryResults) {
g.drawString(text, 5, y);
y += 15;
}

men nytt fel

if (queryResults == null || queryResults.Length() == 0) {
g.drawString(message, 5, 50);
return;
}
cannot find symbol variable Length

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Phod
Från och med Java 1.5 måste du tala om vilken typ vectorn ska innehålla:

Nej, det måste man inte, men det är för det mesta en stor fördel om man gör det.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av badboll
Nej, det måste man inte, men det är för det mesta en stor fördel om man gör det.

Ge gärna exempel, aldrig använt vector själv

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem
Citat:

Edit:
foreach (String text : queryResults) {
g.drawString(text, 5, y);
y += 15;
}

ska det vara kolon?

Edit:
Hittade felet där, ska väl vara bara for (String text : queryResults) {
g.drawString(text, 5, y);
y += 15;
}

men nytt fel

if (queryResults == null || queryResults.Length() == 0) {
g.drawString(message, 5, 50);
return;
}
cannot find symbol variable Length

Heh, lite slarvfel

queryResults.size() ska det vara! Och som sagt skulle det vara for (...) och inte foreach (...)

Permalänk
Medlem

Japp, nu fick vi programmeringen att lyckas, nu är det bara något annat skumt fel... xD

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av bjornie
Heh, lite slarvfel

queryResults.size() ska det vara! Och som sagt skulle det vara for (...) och inte foreach (...)

Tack

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem

Jag har inte arbetat mycket alls med Applets, men det brukar vara säkerhetsspärrar för att koppla upp mot andra domäner eller till klientens dator - dessa kan man komma runt genom att sätta nya security policies som det så fint heter. Hur man gör det, får vi hoppas någon annan har koll på - eller så får du googla.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av We4sZ
Ge gärna exempel, aldrig använt vector själv

Man anger en typ för att kunna ha koll på vad man stoppat in i samlingen. Om man inte gör det, så kommer alla element i samlingen betraktas som varandes av typen Object, vilket vanligtvis inte är till så stor hjälp. Jag säger "samlingen" eftersom det inte är specifikt för Vector, utan alla klasser som ingår i Java Collections Framework.

En fördel med en otypad samling är att man kan stoppa in vad som helst i den:

List list = new ArrayList(); list.add("Kalle"); // en String list.add(12); // autoboxas till en Integer list.add(new Date());

Men när man plockar ut dem (med t.ex. list.get()) så får man alltid tillbaka ett Object. Vill man vara säker på att man bara hämtar ut och jobbar på strängarna i listan, får man ta till grepp liknande:

for (Object o : list) { if (o instanceof String) { String s = (String)o; // gör nåt med s } }

Om man istället specifikt vill ha en samling av strängar, så kan man sedan Java 5 "typa" listan till att bara acceptera just strängar så här:

List<String> list = new ArrayList<String>(); list.add("Kalle"); // går bra list.add(12); // ger kompileringsfel, Integer är inte en String list.add(new Date()); // ger kompileringsfel, Date är inte en String

Då kommer man också få just en String tillbaka när man hämtar ett värde ur listan.

Permalänk
Medlem

Jo fast.. Det funkar fin fint att jobba mot databasen om man bara har en class och bara en funktion, typ
import java.sql.*;

public class Jdbc11 {
public static void main(String args[]){
try {
Statement stmt;

//Register the JDBC driver for MySQL.
Class.forName("com.mysql.jdbc.Driver");

//Define URL of database server for
// database named mysql on the localhost
// with the default port number 3306.
String url =
"jdbc:mysql://localhost:3306/mysql";

//Get a connection to the database for a
// user named root with a blank password.
// This user is the default administrator
// having full privileges to do anything.
Connection con =
DriverManager.getConnection(
url,"hej", "hej");

//Display URL and connection information
System.out.println("URL: " + url);
System.out.println("Connection: " + con);

//Get a Statement object
stmt = con.createStatement();

//Create the new database
stmt.executeUpdate(
"CREATE DATABASE JunkDB");
//Register a new user named auser on the
// database named JunkDB with a password
// drowssap enabling several different
// privileges.
con.close();
}catch( Exception e ) {
e.printStackTrace();
}//end catch
}//end main
}//end class Jdbc11

då kan man lätt skapa en databas

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av badboll
Man anger en typ för att kunna ha koll på vad man stoppat in i samlingen. Om man inte gör det, så kommer alla element i samlingen betraktas som varandes av typen Object, vilket vanligtvis inte är till så stor hjälp. Jag säger "samlingen" eftersom det inte är specifikt för Vector, utan alla klasser som ingår i Java Collections Framework.

Tack

Visa signatur

"En vis man sa en gång"

Permalänk
Medlem
Citat:

Applets are divided into two categories: trusted and untrused. Trusted applets are not subject to any security restrictions and can therefore open connections to any host at will; untrusted applets are subject to the security restrictions described below.

When an applet is loaded a check is first made to see if an applet by that name (the value of the CODE attribute in the APPLET tag) exists in the classpath (if none was explicitly set, then just the internal default classpath is used); if so, the applet found in the classpath is loaded. Applets loaded this way are considered trusted. If no applet by the requested name is found in the classpath then it is loaded from the location specified by the combination of urls used to load the page containing the applet and in the CODEBASE attribute. Applets loaded this way are considered untrusted.

Since trusted applets have no security restrictions imposed on them they will also be ignored for the rest of this document. From now on all applets are assumed to be untrusted. Furthermore, since where an applet was loaded from plays a central role in determining which host(s) it can connect to, the host that served the applet will be referred to in the following as the originating host.

Here now are the security restrictions imposed on untrusted applets.

Säger mig inte så mycket
Min engelska...xD
Men det kan ju vara något sånt som är felet

Visa signatur

"En vis man sa en gång"