Første
JDBC serie, Planche nr. 21
Kursus Indhold

Udskrift af : JDBC

Planche 1 : JDBC

Java Database Connection

Planche 2 : Forudsætninger

Planche 3 : Forbindelse til DB

Kræver 2 ting

Planche 4 : Registrere JDBC-ODBC

Generelt er udtrykket for registrering: Det er ikke nødvendigt at realisere driveren og registrere den med DriverManager.

Planche 5 : Skabe en forbindelse

 
            String url = "jdbc:odbc:Fred";
            Connection con = DriverManager.getConnection(url, "Fernanda", "J8");
Databasenavn 'fred', bruger 'fernanda' og kodeord 'J8'

Planche 6 : Eksempel - Database

COFFEES

COF_NAME

SUP_ID

PRICE

SALES

TOTAL

Colombian

101

7.99

0

0

French_Roast

49

8.99

0

0

Espresso

150

9.99

0

0

Colombian_Decaf

101

8.99

0

0

French_Roast_Decaf

49

9.99

0

0

SUPPLIER database

SUP_ID

SUP_NAME

STREET

CITY

STATE

ZIP

101

Acme, Inc.

99 Market Street

Groundsville

CA

95199

49

Superior Coffee

1 Party Place

Mendocino

CA

95460

150

The High Ground

100 Coffee Lane

Meadows

CA

93966

Planche 7 : Eksempel - SQL

SQL til at skabe COFFEES kunne se sådan ud:
CREATE TABLE COFFEES
        (COF_NAME VARCHAR(32),
 SUP_ID INTEGER,
 PRICE FLOAT,
 SALES INTEGER,
 TOTAL INTEGER)
Skrevet i Java-kode svarer det til:
String createTableCoffees = "CREATE TABLE COFFEES " +
                "(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " +
                "SALES INTEGER, TOTAL INTEGER)";
Sendes afsted med

            Statement stmt = con.createStatement();
            stmt.executeUpdate(createTableCoffees);
executeUpdate() bruges med DDL-udtryk

Planche 8 : Opret en database (Opgave 10a)

Skriv en applikations-klasse, der opretter COFFEES-databasen Der er oprettet brugere og databaser på andante således: Kodeord ikke nødvendig...

Planche 9 : Put data i databasen

            Statement stmt = con.createStatement();
            stmt.executeUpdate(
                "INSERT INTO COFFEES " + 
                "VALUES ('Colombian', 101, 7.99, 0, 0)");
            stmt.executeUpdate("INSERT INTO COFFEES " +
                "VALUES ('French_Roast', 49, 8.99, 0, 0)");

            stmt.executeUpdate("INSERT INTO COFFEES " +
                "VALUES ('Espresso', 150, 9.99, 0, 0)");
            stmt.executeUpdate("INSERT INTO COFFEES " +
                "VALUES ('Colombian_Decaf', 101, 8.99, 0, 0)");
            stmt.executeUpdate("INSERT INTO COFFEES " +
                "VALUES ('French_Roast_Decaf', 49, 9.99, 0, 0)");

Planche 10 : Indlæg data

Skriv en ny applikationsklasse, der lægger data ind i COFFEES

Brug evt. forrige planche - men tilføj gerne flere data

Planche 11 : Hente data

SQL-statementet:
            SELECT * FROM COFFEES
Giver i et almindeligt SQL-miljø svaret:
            COF_NAME                SUP_ID  PRICE   SALES   TOTAL
            ---------------         ------  -----   -----   -----
            Colombian               101     7.99    0       0
            French_Roast             49     8.99    0       0
            Espresso                150     9.99    0       0
            Colombian_Decaf         101     8.99    0       0
            French_Roast_Decaf       49     9.99    0       0

Planche 12 : Andre SQL-udtryk

            SELECT COF_NAME, PRICE FROM COFFEES
Ville ligne noget i retning af:
             
            COF_NAME                                PRICE
            --------                ----------      -----
            Colombian                               7.99
            French_Roast                            8.99
            Espresso                                9.99
            Colombian_Decaf                         8.99
            French_Roast_Decaf                      9.99
Følgende udtryk udtrækker kun kaffe, der koster under $9,00 pundet
            SELECT COF_NAME, PRICE
            FROM COFFEES
            WHERE PRICE < 9.00
Resultat
        
            COF_NAME                                PRICE
            --------                -------         -----
            Colombian                               7.99
            French_Roast                            8.99
            Colombian Decaf                         8.99

Planche 13 : SQL i Java

Udfør forespørgsel
ResultSet rs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");
Gå frem, række efter række, via metoden next()

og læs værdierne i en række med getXXX

            String query = "SELECT COF_NAME, PRICE FROM COFFEES";
            ResultSet rs = stmt.executeQuery(query);
                            while (rs.next()) {
                            String s = rs.getString("COF_NAME");
                            Float n = rs.getFloat("PRICE");
                            System.out.println(s + "   " + n);
            }
Ventet Javaoutput:
            Colombian   7.99
            French_Roast   8.99
            Espresso   9.99
            Colombian_Decaf   8.99
            French_Roast_Decaf   9.99

Planche 14 : Kolonne-håndtering

Henter kolonner fra række med
            String s = rs.getString("COF_NAME");
eller
            String s = rs.getString(1);
            float n = rs.getFloat(2);

Planche 15 : Oversigt over getXXX-metoder

Brug af ResultSet.getXXX Metoder til at hente JDBC-typer

 

TINYINT

SMALLINT

INTEGER

BIGINT

REAL

FLOAT

DOUBLE

DECIMAL

NUMERIC

 

BIT

 

CHAR

H
A
R

VARCHAR
A
R
C
H
A
R

LONGVARCHAR

BINARY

VARBINARY

LONGVARBINARY

DATE

TIME

TIMESTAMP

getByte

X

x

x

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getShort

x

X

x

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getInt

x

x

X

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getLong

x

x

x

X

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getFloat

x

x

x

x

X

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getDouble

x

x

x

x

x

X

X

x

x

x

x

x

x

 

 

 

 

 

 

getBigDecimal

x

x

x

x

x

x

x

X

X

x

x

x

x

 

 

 

 

 

 

getBoolean

x

x

x

x

x

x

x

x

x

X

x

x

x

 

 

 

 

 

 

getString

x

x

x

x

x

x

x

x

x

x

X

X

x

x

x

x

x

x

x

getBytes

 

 

 

 

 

 

 

 

 

 

 

 

 

X

X

x

 

 

 

getDate

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

X

 

x

getTime

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

 

X

x

getTimestamp

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

x

x

X

getAsciiStream

 

 

 

 

 

 

 

 

 

 

x

x

X

x

x

x

 

 

 

getUnicodeStream

 

 

 

 

 

 

 

 

 

 

x

x

X

x

x

x

 

 

 

getBinaryStream

 

 

 

 

 

 

 

 

 

 

 

 

 

x

x

X

 

 

 

getObject

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

An "x" indicates that the getXXX method may legally be used to retrieve the given JDBC type.

An " X " indicates that the getXXX method is recommended for retrieving the given JDBC type.

Planche 16 : Hent data (Opgave 10b)

Skriv en applikations-klasse og udskriv rapport på konsol (System.out)

Planche 17 : Opdatere tabeller

        String updateString = "UPDATE COFFEES " +
                "SET SALES = 75 " + 
                "WHERE COF_NAME LIKE 'Colombian'";
        stmt.executeUpdate(updateString);
tabellen COFFEES vil nu se således ud:
        COF_NAME                SUP_ID  PRICE   SALES   TOTAL
        --------                ------  -----   -----   -----
        Colombian               101     7.99    75      0
        French_Roast            49      8.99    0       0
        Espresso                150     9.99    0       0
        Colombian_Decaf         101     8.99    0       0
        French_Roast_Decaf      49      9.99    0       0
Vælg den række, der lige er opdateret - hent værdierne i COF_NAME og SALES og udskriv værdierne:
        String query = "SELECT COF_NAME, SALES FROM COFFEES " +
                       "WHERE COF_NAME LIKE 'Colombian'";
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
                        String s = rs.getString("COF_NAME");
                        int n = rs.getInt("SALES");
                        System.out.println(n + " pounds of " + s +
                                                          " sold this week.")
        }
Det skulle give udskriften:
        75 pounds of Colombian sold this week.

Planche 18 : Alternativt

Siden WHERE begrænser valget til en forekomst af en række, kan man klare sig uden en while-løkke:
        rs.next();
        String s = rs.getString(1);
        int n = rs.getInt(2);
        System.out.println(n + " pounds of " + s + " sold this week.")
Opdater TOTAL-kolonnen

        String updateString = "UPDATE COFFEES " +
                              "SET TOTAL = TOTAL + 75 " + 
                              "WHERE COF_NAME LIKE 'Colombian'";
        stmt.executeUpdate(updateString);
        String query = "SELECT COF_NAME, TOTAL FROM COFFEES " +
                                           "WHERE COF_NAME LIKE 'Colombian'";
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
                        String s = rs.getString(1);
                        int n = rs.getInt(2);
                        System.out.println(n + " pounds of " + s + " sold to date.")
        }

Her bruges kolonnenummer-metoden istedet for kolonnenavnet.

Planche 19 : Prisnedsættelse

Skriv en applikations-klasse, der nedsætter alle priser i COFFEES med 10%

Planche 20 : Andre muligheder

Se mere i Tutorials jdbc-trail.

Planche 21 : SimpleText database

Firmaet Thought Inc, San Fransisco, USA, har lavet en SQL-database, baseret på JDBC og som bruger komma-separerede datafiler. Den er gratis, men kræver tilmelding for at downloade. Man får både klassefiler og kildetekster, og klassefilerne må videre distribueres. Se nærmere under henvisninger.


© 2000 BLA*net - Leif E. Andersen, leander@blanet.dk
Første
JDBC serie, Planche nr. 21