5.2. nodaļa: Datubāzes un JDBC

Mērķi

  • Aprakstīt relāciju datubāzu vispārīgās īpašības
  • Aprakstīt Codd'a 3 likumus relāciju datubāzu projektēšanai
  • Saprast, kas ir konekcija ar datubāzi
  • Veidot SQL pieprasījumus
  • Izvilkt informāciju no datubāzes ar dialogveida rīku
  • Raksturot JDBC
  • Izskaidrot, kā izmantojot JDBC veidoto abstrakcijas slāni var datubāzes piekļuves fasādi portēt uz citu platformu
  • Aprakstīt 5 galvenos uzdevumus, kuri saistīti ar JDBC programmētāja interfeisu
  • Aprakstīt prasības JDBC draiverim un tā attiecības ar JDBC draiveru pārvaldnieku

Ievadjautājumi

  • Relāciju datubāzes ir visuresošas IS izstrādē. Programmatūras un datubāzu integrācija ļauj nodrošināt jebkādas informācijas pastāvīgu saglabāšanu
  • Kādus informācijas veidus programmēšanas projekts padara par pastāvīgiem - t.i. tie dzīvo arī pēc aplikācijas darba beigām.
  • Kā pieslēgties datubāzei gan ar dialogveida rīku, gan no Javas programmas? Kā Java izmanto konkrētās datubāzes piegādātāja interfeisus (API)?
  • Kādi ir galvenie JDBC abstrakcijas slāņa jēdzieni?
  • Kādas problēmas varētu rasties, pārejot no vienas datubāzu sistēmas uz citu? Kāds tam sakars ar JDBC?

Relāciju datubāzu sistēmas

  • Uzdevums - informācijas pārvaldība
  • E.F.Codd'u uzskata par relāciju DB modeļa izgudrotāju, kurš minējis 12-daļīgu pārbaudi, vai sistēmu var uzskatīt par relāciju datubāzu sistēmu (RDBMS), sk. "The Practical SQL Handbook", Emerson, et al. 1989.

Relāciju datubāzu sistēmas kritēriji

  • Reprezentē visu datubāzē esošo informāciju tabulu veidā
  • Datu loģiskā reprezentācija ir neatkarīga no to fiziskās glabāšanas parametriem
  • Datu strukturēšanai, pieprasījumu veidošanai un mainīšanai lieto augsta līmeņa valodu
  • Atbalsta relāciju operācijas ("selektus" un "džoinus") un kopu operācijas (piemēram, kopu šķēlumu un starpību)
  • Atbalsta skatus, kuri dod alternatīvu datu meklēšanas iespēju tabulās
  • Dod iespēju atšķirt nezināmas vērtības no "null", "0" un tukšām vērtībām, kuras ir zināmas
  • Atbalsta mehānismus integritātei, autorizācijai, transakcijām un atkopšanai

Tabulas

Pirmais Codd'a kritērijs - datiem jāglabājas tabulās. Tabulām ir rindiņas un kolonnas. Palielinot ierakstu skaitu, pievienojas jaunas rindas. Piemērs "Adresu tabula"

VārdsAdreseTelefons
PūksAugšiela 1017349576
SivēnsParka iela 17234348

Rindas sauc arī par ierakstiem un kolonnas - par laukiem. Vienu no laukiem var pasludināt par primāro atslēgu, kurš unikāli identificē ierakstu.

Datu neatkarība

Otrais Codd'a kritērijs norāda, ka datu loģiskais un fiziskais glabāšanas veids eksistē neatkarīgi viens no otra.

  • Lietotājs uzskata datubāzu sistēmu kā loģisku datu reprezentāciju
  • Lietotājam nav jāzin, kā dati tiek glabāti

Lietotāju neinteresē tas, kā mašīnas atmiņā glabājas datubāzes dati. Daudzas relāciju datubāzu sistēmas, piemēram, izmanto B-kokus - īpašas kokveida meklēšanai piemērotas datu struktūras, kurās katrai B-koka virsotnei atbilst viena "lappuse uz diska" - informācijas gabals - daži kilobaiti, kuru var sevišķi efektīvi ielādēt operatīvajā atmiņā. Lietotājs par to var nezināt un sekmīgi programmēt šo datubāzi.

Pieprasījumu valoda

Trešais Codd'a kritērijs datubāzu sistēmai - visaptveroša, augsta līmeņa valoda, lai sazinātos ar datubāzi.

  • Valoda SQL (Structured Query Language) - visizplatītākā šāda valoda
  • To veidoja IBM, ap 1981 piedāvājot pirmo produktu: SQL/DS
  • Nav standartizēta; ap 1988 veidojās ISO-ANSI standarta projekts SQLam, bet tas nav ieviesies kā standarts
  • SQLam ir "mazākais kopsaucējs" - vienkāršākās datu manipulācijas komandas
  • Oracle un Sybase dialekti ir pamatīgi papildināti ar citām komandām

SQL komandas

SELECT
Atlasa 0 vai vairāk ierakstus no nosauktās tabulas (vai vairākām tabulām)
INSERT
Pievieno jaunu ierakstu tabulai
DELETE
Izdzēš vienu vai vairākus ierakstus no tabulas
UPDATE
Modificē vienu vai vairākus laukus norādītajos ierakstos
CREATE
Izveido jaunu, tukšu tabulu ar norādītajiem lauku vārdiem un tipiem
DROP
Izdzēš tabulu no datubāzes

Komanda SELECT

Šī komanda atbalsta šādas iespējas:

  • Sastiķējumus (joins)
  • DISTINCT - tikai atšķirīgu rindu atlasi
  • ORDER BY - sakārtošanas kritērijus
  • Regulāras izteiksmes: LIKE 'SIVĒN%'
  • Dažādu kolonnu salīdzināšanu WHERE apakšizteiksmēs

SELECT formālā sintakse:

SELECT [table.]column [ , [table.]column  ... ]
FROM table [ , table ...]
[ WHERE [table.]column OPERATOR VALUE
[ AND | OR [table.]column OPERATOR VALUE] ... ]
[ ORDER BY [table.]column [DESC] [, [table.]column [DESC] ]
  • OPERATOR var būt <, >, =, <=, >=, <>, LIKE
  • VALUE var būt literāļa vērtība vai kolonnas nosaukums

SELECT piemēri

SELECT first_name, last_name FROM emp_details 
    WHERE dept = 'finance'
SELECT first_name, last-name FROM emp_details
    WHERE dept = 'finance'
	ORDER BY last_name, first_name DESC
SELECT DISTINCT first_name, last_name FROM emp_details
    WHERE dept = 'finance'
	ORDER BY last_name, first_name DESC
SELECT first_name, last_name FROM emp_details
    WHERE dept = 'finance' AND last_name LIKE '_ughes'
SELECT emp_details.first_name, epm_details.last_name, 
        project_details.project
    FROM emp_details, project_details
	WHERE emp_details.emp_id = project_details.emp_id
	ORDER BY emp_details.last_name, emp_details.first_name

Komanda INSERT

Norādām kolonnu jeb lauku vārdu sarakstu un atbilstoši tam - jaunā ieraksta vērtības. Dažreiz SQL sintakse ļauj kolonnu vārdus nerakstīt, ja vērtību skaits precīzi atbilst kolonnu skaitam un secībai, bet tas ir ļoti slikts stils.

INSERT INTO table_name ( column [ , column ]... )
VALUES (value [, value]...)

Piemērs:

INSERT INTO emp_details ( first_name, last_name, dept, salary)
    VALUES ('David', "Hughes', 'I.T.S', '12345')

Komanda DELETE

DELETE FROM table_name
    WHERE column OPERATOR VALUE
	[ AND | OR column OPERATOR value ] ...

Piemērs:

DELETE FROM emp_details WHERE emp_id = '12345'

Komanda UPDATE

UPDATE table_name SET column=value [ , column=value ...]
    WHERE column OPERATOR VALUE
	[AND | OR column OPERATOR value ] ...

Piemērs:

UPDATE emp_details SET salary=300 WHERE emp_id = '1234'

Šai komandai ir jānorāda konkrētas literāļu vērtības, kuras ir jāieraksta datubāzē (nevar norādīt kolonnu nosaukumus):

JDBC interfeisu ievads

  • JDBC ir abstrakcijas slānis, kurš ļauj lietotājam, neriskējot ar smagām sekām nākotnē, izvēlēties, kuru datubāzi lietot
  • JDBC ļauj rakstīt pieprasījumus konkrētam interfeisam (API)
  • JDBC atbalsta ANSI SQL-2 savietojamas datubāzes, bet to var lietot arī citām datubāzēm

Divi JDBC komponenti

  • Interfeiss, kurš implementējams datubāzu sistēmu veidotājiem (draiveru rakstītājiem)
  • Interfeiss, kuru izmanto Javas aplikāciju rakstnieki

Interfeiss JDBC draveriem

Katram draiverim ir jāimplementē sekojošie interfeisi:

  • java.sql.Connection
  • java.sql.Statement
  • java.sql.PreparedStatement
  • java.sql.CallableStatement
  • java.sql.ResultSet
  • java.sql.Driver

Katram datubāzes draiverim vajag implementēt vēl arī java.sql.Driver interfeisu, kuru izmanto vispārīgā java.sql.DriverManager klase, kad tai jāatrod draiveris konkrētai datubāzei, izmantojot URL sintaksē rakstītu "konekcijas stringu". JDBC ir veidots pēc ODBC (Open Database Connectivity); tādēļ JDBC ar ODBC var viegli sadarboties.

Javas aplikācija un draiveri

Javas aplikācija var piekļūt dažādām datubāzēm ar dažādiem draiveriem; draiveri ir vai nu specializēti priekš JDBC, vai arī tiek izmantots JDBC-ODBC tilts:

Dažādi draiveri

JDBC lietotāja uzdevumi

  • Izveidot JDBC draivera instanci (piemēram, ar konstruktoru vai ar Class.forName(drivername).newInstance() izsaukumu. Vajadzības gadījumā draiveri inicializēt vai reģistrēt.
  • Norādīt datubāzes URLu un, izmantojot to, atvērt konekciju
  • Norādīt komandu jeb pieprasījumu jeb vaicājumu (query)

JDBC plūsma

Javas aplikācijā izveidojas hierarhija ar apmēram šādiem objektiem (no viena augstāka līmeņa objekta var būt atkarīgi vairāki zemāka līmeņa objekti)

  1. DriverManager
  2. Driver
  3. Connection
  4. Statement, PreparedStatement, CallableStatement
  5. ResultSet
  • DriverManager var strādāt ar vairākiem draiveriem
  • URL stringu padod DriverManager un iegūst konekciju. Vienam un tam pašam draiverim (pat vienai un tai pašai datubāzei var izveidot vairākas konekcijas vienlaikus)
  • Konekcijai var nosūtīt SQL komandas un vaicājumus
  • Komandas (piemēram, INSERT INTO, UPDATE vai DELETE) vienkārši izpildās. Vaicājumi (piemēram, SELECT) atgriež rezultātkopu

Pakotne java.sql

Ar JDBC ir saistīti sekojoši interfeisi

  • java.sql.Driver
  • java.sql.Connection
  • java.sql.Statement
  • java.sql.PreparedStatement
  • java.sql.CallableStatement
  • java.sql.ResultSet
  • java.sql.ResultSetMetaData
  • java.sql.DatabaseMetaData

Datubāzu sistēmas MySQL sagatavošana darbam

  • Atarhivēt MySQL distribūcijas ZIP failu un palaist setup.exe. Izvēlēties kā instalācijas vietu noklusēto direktoriju c:/mysql.
  • Piereģistrēt MySQL serveri kā NT servisu:
    c:/mysql>mysqld-nt --install
    
  • Tiem, kuriem patīk grafisks dialoga interfeiss ar MySQL datubāzi, var izvēlēties kādu rīku (piemēram, MySQL Front), kuri aprakstīti te: http://mysqlfront.venturemedia.de/. Tomēr ērtuma un elastības ziņā nekas nespēj aizstāt standartisko DOS komandrindas rīku c:/mysql/bin/mysql.exe
  • DOS komandrindā piestartējiet mysql.exe un pārliecinieties, ka rodas prompts: mysql>. Ierakstiet tur sekojošas komandas:
CREATE DATABASE demo;
USE demo; 
CREATE TABLE cilveks (id INT, vards CHAR(25), uzvards CHAR(25));
INSERT INTO cilveks (id,vards,uzvards) VALUES (1,"BILL","CLINTON");
INSERT INTO cilveks (id,vards,uzvards) VALUES (1,"AL","GORE");
SELECT * FROM cilveks;
quit

Piekļuvi datubāzei "demo" administrē citā datubāzē "mysql" - izmainot tajā tabulas "db" un "user". Tabulā "user" var pievienot jaunus lietotājus ar parolēm, bet tabulā "db" var uzlikt katram lietotājam atbilstošas privilēģijas.

Ja esat aizmirsuši, kādas datubāzes un tabulas Jūsu MySQL instalācijā ir saliktas, palaidiet citu programmu mysqlshow ar un bez argumentiem. Konkrēti - DOS komandrindā izpildiet šādas komandas, lai pārliecinātos, ka tiešām radusies datubāze "demo" un tajā ir tabula "cilveks".

mysqlshow
mysqlshow demo

JDBC piemērs

import java.sql.*;

public class DBTest {	  
    public static void main(String[] args) throws Exception {
        String drivername = "org.gjt.mm.mysql.Driver";
	    Class.forName(drivername).newInstance();
	    String url = "jdbc:mysql://localhost/demo?user=root";
	    Connection con = DriverManager.getConnection(url);
		Statement st = con.createStatement(); 
		ResultSet rs = st.executeQuery("select * from cilveks"); 
		while (rs.next()) {
			int id = rs.getInt("id"); 
			String vards = rs.getString("vards"); 
			String uzvards = rs.getString("uzvards");
			System.out.println("id = " + id 
				+ ", vards = " + vards
				+ ", uzvards = " + uzvards); 
		}
	}
}

Lai šo piemēru varētu palaist, ir nepieciešams JDBC draiveris priekš MySQL. Ieteicams izmantot "oficiālo" MySQL draiveri "MySQL Connector/J", kuru var dabūt šeit: http://www.mysql.com/downloads/api-jdbc.html. Tas pirms programmas palaišanas jāpievieno savam CLASSPATH:

set CLASSPATH=mysql-connector-java-2.0.14-bin.jar;.
java DBTest

MySQL datubāzes sagatavošana darbam

  • Uzinstaleet MySQL - atpakot un palaist "setup.exe".
  • Palaist "c:\mysql\bin\mysqld.exe" - datubāzes serveri.
  • Palaist turpat "mysql.exe" - datubāzes klientu.
  • Rakstīt šādas komandas:
    use mysql;
    select * from user;
    insert into user values (
        "localhost", "dzonis", PASSWORD("dzonis"), 
        "Y","Y","Y","Y","Y","Y","Y",
        "Y","Y","Y","Y","Y","Y","Y")
    
  • Aizvērt gan "mysqld", gan "mysql".
  • Atvērt "mysqld" (WinNT un Win2000 gadījumā - pārstartēt MySQL servisu) un palaist šādu komandu:
    mysql -u dzonis -p
    Enter Password: dzonis
    
  • Izdot "mysql" promptā šādas komandas:
    create database biblioteka;
    use biblioteka;
    create table gramata (
        id INT, 
        autors CHAR(30), 
        nosaukums CHAR(30), 
        lappuses INT); 
    insert into gramata values (1, "Kaudzites", 
        "Mernieku Laiki", 300);
    ...
    select * from gramata; 
    

Datubāzu sistēmas Oracle sagatavošana darbam

  • Savam Oracle DB adminam jāpalūdz izveidot lietotāja konts jeb shēma. To admins dara apmēram šādi:
    create user
    javatest
    identified by javatest;
    grant connect to
    javatest;
    grant resource to
    javatest;
    
  • Pajautājam Oracle servera "host:port:sid" - mašīnu, porta numuru un Oracle apakšsistēmas identifikatoru. Tas varētu būt, piemēram, šāds:
    olimpus.alise.lv:1521:itndev01
    
  • Ar SQL Plus pieslēdzamies savai shēmai - login lodziņā ir jāievada 3 stringi: "User Name" (shēmas vārds), "Password" (parole, kura sākumā varētu sakrist ar shēmas vārdu), "Host String" (tas pats SIDs, piemēram ITNDEV01).
  • Izveidojam dialogveidā mazu tabuliņu:
    CREATE TABLE cilveks (id INT, vards CHAR(25), uzvards CHAR(25));
    INSERT INTO cilveks (id, vards, uzvards) VALUES (1, 'Bill', 'Clinton');
    SELECT * FROM cilveks;
    
  • Programmā DBTest.java, metodē main() izmainīt pirmās 4 rindiņas. Rakstīt tur apmēram sekojošo:
    String drivername = "oracle.jdbc.OracleDriver";
    Class.forName(drivername).newInstance();
    String url = "jdbc:oracle:thin:@olimpus.alise.lv:1521:itndev01";
    Connection con = DriverManager.getConnection(url, "javatest", "javatest");
    
    Lietotāja vārda un paroles "javatest" vietā Jums būtu jāraksta pašiem savas shēmas vārds un atbilstošā parole.
  • Lai šo programmu varētu palaist, ir jāpievieno savam CLASSPATH mainīgajam draiveris classes12.jar. Vispārīgi runājot, draiveri varētu ieteikt Oracle speciālists. Pagaidām to var dabūt no sekojoša URL: http://www.liis.lv/izvtesti/zip/classes12.jar.

JDBC draivera instances izveidošana

Pirms sākt komunicēt ar datubāzi, izmantojot draiveri, šo draiveri vajag ielādēt atmiņā. Komanda

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

uzvedas līdzīgi kā komanda

new org.gjt.mm.mysql.Driver();

Šis draiveris nav jāpiešķir mainīgajam, bet tas, ja JVM to izvēlēsies, apstrādās visus pieprasījumus, kuri veidojas no DB konekcijām uz atbilstošo datubāzi.

JDBC draiveru ielādēšana

  • Vienlaikus aplikācijas atmiņā var atrasties vairāki draiveri
  • Vairāki no ielādētajiem draiveriem var vienlaikus konektēties pie tās pašas datubāzes
  • Draiveru prioritāti var norādīt sistēmas īpašībā:
jdbc.drivers = com.imaginary.sql.msql.MsqlDriver:Acme.db.driver

Ielādēšana caur jdbc.drivers

JDBC izmanto pirmo atrasto draiveri, pārskatot tos sekojošā secībā:

  1. Visus draiverus, kuri norādīti jdbc.drivers sarakstā
  2. Visus citus draiverus, kuri ir ielādējušies atmiņā
  3. Draiverus, kuru kodu ielādēja (piemēram, dinamiski) no neuzticama avota, izlaižam. Izņēmums ir gadījumos, kad pats konekcijas kods nāk no tā paša avota.

Draivera reģistrēšanās

  • Draiveris statiska koda blokā inicializē savu instanci
  • Tad, kad viņa konstruktors atklāti vai slēpti tiek izsaukts, piereģistrējas pie draiveru pārvaldnieka.

Datubāzes norādīšana

Jānorāda URLs, kurš parasti ir sekojošā izskatā:

jdbc:subprotocol:subname

Piemēram, to iegūst ar šādu piešķiršanu:

String url = new String("jdbc:msql://" + serverName + ":1112/demo"); 

TCP portus klausošamies datubāzēm parasti var noskaidrot noklusēto porta numuru. Bieži vien konekciju stringu sintakse ir sarežģītāka un ir jāmeklē dokumentācijā.

Konekcijas atvēršana

Connection con = DriverManager.getConnection(url);
  • Draiveru pārvaldnieks mēģina atrast draiveri, kurš spēj pievienoties norādītajam URLam
  • Ja izveidojas konekcija, tiek atgriezts Connection objekts
  • Connection objekts reprezentē sesiju ar konkrētu datubāzi

Draiveru pārvaldniekā metode getConnection(url) izsauc driver.connection(url) priekš "driver" instancēm, kuras ir ielādētas aplikācijā (augšminētajā prioritāšu secībā). Ja draiveris var pieslēgties datubāzei, tas atgriež "Connection" objektu. Ja draiveris nevar - tas atgriež "null" un draiveru pārvaldnieks ķeras pie nākamā draivera, utt.

Pieprasījuma jeb vaicājuma (query) nosūtīšana

Lai sūtītu pieprasījumus datubāzei, no konekcijas ir jādabū "Statement":

try {
    stmt = con.createStatement();
}
catch (SQLException e) {
    System.out.println(e.getMessage()); 
}
  • Lai nosūtītu INSERT, UPDATE vai DELETE komandu, jālieto stmt.executeUpdate("...") komanda, kura atgriež "int" - komandas iespaidoto rindiņu skaitu
  • Lai nosūtītu SELECT komandu, jālieto stmt.executeQuery("...") komanda, kura atgriež ResultSet - tabulveida objektu tālākai apstrādei

Rezultātu savākšana

  • Vaicājuma rezultāti glabājas kā 0 vai vairāk rindas ResultSet objektā.
  • ResultSet objekts satur "iebūvētu iteratoru", kurš sākotnēji norāda uz nenolasāmu vietu "pirms pirmās rindas"
  • ResultSet.next metode pavirzās uz nākamo rindu; atgriež "false", ja rindu vairs nav. Pirmais "next()" izsaukums padara pirmo rindu par tekošo, otrais - otro rindu, utt.
  • Dažādas "getXxx()" metodes ļauj piekļūt dažādiem laukiem
while (rs.next()) {
    System.out.println("Customer: " + rs.getString(2)); 
	System.out.println("Id: "  + rs.getString(1)); 
	System.out.println(""); 
}

Metodes getXxx()

Klasē ResultSet ir dažādas metodes "getXxx()":

MetodeAtgrieztais tips
getBinaryStream()java.io.InputStream
getBoolean()boolean
getByte()byte
getBytes()byte[]
getDate()java.sql.Date
getDouble()double
getFloat()float
getInt()int
getLong()long
getShort()short
getString()java.lang.String
getTime()java.sql.Time

Preparētie pieprasījumi (Prepared Statements)

  • Lai izsauktu to pašu SQL pieprasījumu (iespējams ar dažādiem parametriem), izmantojiet PreparedStatement objektu
  • Preparēts pieprasījums ir ātrdarbīgāks, jo tas ir prekompilēts.
  • Preparētā pieprasījumā ierakstāmos parametrus apzīmē ar (?) simboliem.

Piemērs

Connection con = DriverManager.getConnection(url); 
java.sql.PreparedStatement pstmt = 
    con.prepareStatement
    ("UPDATE table3 SET m = ? WHERE x = ?"); 
// Nododam 2 parametrus. Viens no tiem ciklā mainās
pstmt.setString(1, "Hi"); 
for (int i = 0; i < 10; i++) {
    pstmt.setInt(2,i);
    int j = pstmt.executeUpdate();
    System.out.println(j + " rindas pamainītas, kad i = " + i); 
}

Dažādās setXxx() metodes

MetodeSQL tips
setBinaryStream()LONGVARBINARY
setBoolean()BIT
setByte()TINYINT
setBytes()VARBINARY vai LONGVARBINARY
setDate()DATE
setDouble()DOUBLE
setFloat()FLOAT
setInt()INTEGER
setLong()BIGINT
setShort()SMALLINT
setString()VARCHAR vai LONGVARCHAR
setTime()TIME

Storētās procedūras

String createProcedure = "create procedure SHOW_SUPPLIERS " +
			 "as " +
			 "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
			 "from SUPPLIERS, COFFEES " +
			 "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
			 "order by SUP_NAME";

(Procedūrām datubāzē var būt arī ieejas un izejas parametri.) Šādu String mainīgajā ierakstītu procedūru var pievienot datubāzei, vienkārši aizsūtot JDBC konekcijai izpildāmu komandu:

Statement stmt = con.createStatement();
stmt.executeUpdate(createProcedure);

Šo procedūru var izpildīt, izmantojot JDBC interfeisus no CallableStatement:

CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();

Beigās "rs" piepildīsies ar vajadzīgajiem datiem.

exercise37: Latviešu burtu pārbaude

  • Izveidot savā Oracle shēmā (teiksim ar SQL Plus) tabulu "vardi":
    vards CHAR(30)num INT
  • Pārveidot WordCompare.java no 35. uzdevuma tā, lai šī klase nerakstītu datus par vārdiem un parādīšanās reižu skaitu failā, bet gan datubāzes tabulā "vardi".
  • Rakstīšanu datubāzē veikt ar PreparedStatement, piemēram,
    pstmt = con.PrepareStatement("INSERT INTO vardi (vards, num) VALUES (?,?)"); 
    pstmt.setString(1, key); 
    pstmt.setInt(2, value); 
    
  • Izveidot citu Javas aplikāciju, kura nolasa no šīs datubāzu tabulas un drukā uz standartizvades HTML tabulu ar šiem vārdiem un to parādīšanās reižu skaitu "Baltic Windows" kodējumā. Faila izskats ir apmēram sekojošs:
    <html>
    <head>
    <title>"Mērnieku laiku" vārdi</title>
    <meta http-equiv="Content-type" content="text/html; charset=windows-1257" />
    </head>
    <body>
    <table border="1">
    <tr><td>Abas</td><td>1</td></tr>
    ...
    </table>
    </body>
    </html>
    
  • Ja visi vārdi ir pareizi noglabājušies un nolasīti, tad Jūsu uzdevums ir sekmīgi beidzies. Ja kaut kas slikts noticis ar latviešu burtiem, tad varat mēģināt kādu no sekojošām stratēģijām:
    • Sakonfigurēt Oracle serveri tā, lai tas atbalstītu unikoda burtus (Visticamāk, ka šajā jomā viss iespējamais jau ir izdarīts. Turpretī MySQL vispār neatbalsta Unikodu, tāpēc šai datubāzu sistēmai šī pieeja atkrīt.)
    • Metožu PreparedStatement.setString() un ResultSet.getString() vietā mēģināt lietot metodes setBytes() un getBytes(). Parūpēties, lai baitu masīvi tiktu iegūti no stringiem un pārveidoti atpakaļ par stringiem, izmantojot "Cp1257" kodējumu.

exercise38: DB API priekš biznesa komponentēm

Mūsu CMS projektā (sk. 36. uzdevumu) ir klase User, kuras kods ir apmēram šāds:

public class User {

    private String firstName;
    private String lastName;
    private Directory directory;

    public User (String fName, String lName) {
        firstName = fName;
        lastName = lName;
    }

    ...

Pievienot klasei User arī "private int id" lauku - unikālu šī lietotāja identifikatoru.

Izveidot publisku klasi Database. Implementēt šajā klasē metodes:

public Database() throws SQLException

Konstruktors piekonektējas datubāzei ar Jūsu shēmas vārdu.

public void close() throws SQLException

Aizver datubāzes konekciju (objekts Database kļūst nelietojams)

public void addUserToDB(int id, String fName, String lName, int directory_id) 
    throws DublicateIDException

Metodes uzvedība: tā pievieno lietotāju ar norādīto id'u, vārdu, uzvārdu un direktorijas id'u datubāzes tabulai "user" ar atbilstošiem datu laukiem. Ja lietotājs ar tādu id'u tur jau ir priekšā, tad met izņēmumu.

public void deleteUser(int id) throws RecordNotFoundException

Izmet ierakstu; ja tāda nav, tad rada izņēmumu

public void updateUser(int id, String fName, StringlName, int directory_id)
    throws RecordNotFoundException

Izlabo ierakstu atbilstošajam id'am

public User getUser(int id) throws RecordNotFoundException

Atgriež no DB vajadzīgo lietotāju, uzkonstruē objekta instanci un inicializē visus viņa mainīgos

Izveidot klasē "Database" metodi "main()", kura izsauc un notestē visas šīs metodes.


Lapa mainīta 2004-12-02 22:00:22