Professional Documents
Culture Documents
Adatbazis Kliens Alkalmazas Netbeansben
Adatbazis Kliens Alkalmazas Netbeansben
hu
Az adatbzis
Az adatbzis nem bonyolult, de a clnak megfelel.
Adatbzis ltrehozsa
CREATE DATABASE
WITH OWNER
ENCODING =
TABLESPACE
citizensdb
= citizen
'UTF8'
= pg_default;
Tblk ltrehozsa
A cities tbla
A citizens tbla
CREATE TABLE citizens
(
citizen_id serial NOT NULL,
citizen_name character varying(64) NOT NULL,
citizen_city_id integer NOT NULL,
CONSTRAINT citizens_pkey PRIMARY KEY (citizen_id),
Forrs: http://www.doksi.hu
A projektek ltrehozsa
A programhoz kt projektet hozunk ltre: a f alkalmazst, s az adatbzishoz kttt vezrlinket
tartalmaz programknyvtrat. Ezeket azrt tesszk kln programknyvtrba, hogy
jrafelhasznlhatak legyenek ms projektekben is.
A f projekt
File->New Project. Categories listadobozban kijelljk a General-t, a Projects listadobozban a Java
Application-t. Next. A Project Name szvegdobozba berjuk hogy Citizens, kikapcsoljuk a Create
Main Class-t, s Finish.
Elsknt a PostgreSQL JDBC Driver-t kell beletenni a projektnkbe. Menjnk be a DB project
Properties-be, Libraries, Add JAR/Folder. Keressk meg a postgresql-jdbc.jar-t, s adjuk hozz. (Ez
nlam Fedora 8-on a /usr/share/java mappban volt.) OK. Innentl a DB projektnk kpes
kapcsoldni postgresql adatbzishoz.
A Source Packages-be hozzunk ltre egy j csomagot, a neve citizens. A csomagba hozzunk ltre
kt JFrame Class-t, az egyiknek a neve CitizensFrame, a msiknak CitiesFrame.
Most mst nem fogunk csinlni, a tbbihez mr szksg van az j vezrlinkre.
A programknyvtr ltrehozsa
File->New Project. Categories listadobozban kijelljk a General-t, a Projects listadobozban a Java
Class Library-t. Next. A Project Name szvegdobozba berjuk hogy DB, s Finish.
Ezutn mg mindig a Citizens projekt marat az aktv, ez nem baj, berakjuk hozz fggsgnek a
DB-t. A Citizens projekten jobbgomb->Properties. A Categories listadobozban vlasszuk ki a
Librariest. Jobboldalt Add Project, vlasszuk ki a DB projektnk fknyvtrt, s OK. Mostantl a
Citizens projektnk fgg a DB-tl, ha valamit vltoztatunk a DB-ben, jra fogja fordtani a DB-t is,
s a Citizens-t is. Ezrt maradhat nyugodtan a Citizens f projektnek.
Ehhez a projekthez is adjuk hozz a PostgreSQL JDBC Drivert.
A DB projektben a Source Packages-hez hozzunk ltre egy db nev Java Package-t.
Ezzel a kt alap projektnket el is ksztettk.
host
Forrs: http://www.doksi.hu
felhasznlnv
jelsz
adatbzisnv
kapcsolat
Csinljunk ngy String tpus vltozt, rgtn az osztly fejlc utn, valamint egy Connection
tpust (java.sql.Connection).
public class DBConnection {
private
private
private
private
private
String host;
String username;
String password;
String dbName;
Connection connection;
A Connection-t els krben valsznleg alhzza pirossal, ez azrt van, mert mg nem
importltuk. A Connection-n hobbgomb->Fix Imports, s ksz.
Ksztsk el a kapcsolds/jrakapcsolds/bonts metdusainkat.
public void connect() {
if(host != null && dbName != null && username != null && password != null)
{
disconnect();
try {
Class.forName("org.postgresql.Driver");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
try {
String url = "jdbc:postgresql://" + host + "/" + dbName;
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
connection = DriverManager.getConnection(url, props);
} catch(SQLException e) {
e.printStackTrace();
}
}
}
public void reconnect() {
disconnect();
connect();
}
public void disconnect() {
try {
if(connection != null && !connection.isClosed()) {
connection.close();
}
} catch(SQLException e) {
e.printStackTrace();
}
}
Forrs: http://www.doksi.hu
Elvileg ha lenyitogatjtok a Projects ablakban a DBConnection osztlyt, ott van Bean Patterns, s
hozz lehet adni ezeket a tulajdonsgokat, megcsinlja a get/set metdusokat is alapbl, de lltlag
NetBeans 6-bl ki fogjk szedni ezt a Bean dolgot, hogy ttervezzk, mert rgi, meg nemj, ezrt
csinltuk inkbb kzzel.
Csinlunk egy isOpen metdust, ezzel vizsgljuk a DBResultSet-ben, hogy nyitott-e a kapcsolat.
public boolean isOpen() {
try {
if(connection != null && !connection.isClosed()) {
return true;
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return false;
}
Most nhny sz arrl, mrt csinltuk ilyen automata csatlakozsosra az egszet. A connect
Forrs: http://www.doksi.hu
metdusban megnzi hogy minden be van-e lltva, ha igen, akkor megprbl csatlakozni. A set
metdusokban is mindig jracsatlakozunk automatikusan. Ez azrt kell, mert a DBConnection
osztlyunkat ki szeretnnk tenni form-ra, s ott grafikus felletbl tudjuk ilyen tulajdonsgok
prbeszdablakban lltgatni ezeket a dolgokat, a get/set metdusokon keresztl. Ezzel a mdszerrel
rgtn kapcsoldni is fog az osztlyunk, ha minden adatot megadtunk.
DBConnection.java-n jobbgomb->Tools->Add to palette, s adjuk hozz a Beans szekcihoz, vagy
ahova akarjuk. Innentl az osztlyunkat rhzhatjuk a form-okra, mint a gombot, stb. A
DBConnection osztlyunk egy lthatatlan bean lesz, az Other Components-nl fog megjelenni a
formon. Ha a palettrl rhzzuk a form-ra, kell hogy csinljon egy dBConnection1 nev pldnyt
belle, s a properties ablakban tudjuk lltgatni a tulajdonsgokat. Emiatt kellett a get/set
metdusokba beletenni a connect()-et, stb hogy ilyenkor is kapcsoldjon, ha itt lltgatjuk. Ki is
lehet prblni: ha mindent belltunk, csatlakozik.
Egyelre a DBConnection-el nem foglalkozunk tbbet, megcsinljuk a DBResultSet osztlyunkat.
A DBResultSet osztly
Ebben az osztlyban fogjuk trolni a lekrdezsek eredmnyeit. Ebbl fognak tpllkozni a
vezrlink is.
A db csomagban hozzunk lrte egy DBResultSet Java Class-t. Ehhet is kell a Serializable interfsz,
hogy tudjuk bean knt hasznlni.
public class DBResultSet implements Serializable {
a kapcsolat
az sql parancs
az eredmnyhalmaz
private
private
private
private
DBConnection connection;
String command;
ResultSet resultSet;
Statement statement;
A zrs egyrtelm.
private void close() {
try {
if(resultSet != null) {
Forrs: http://www.doksi.hu
resultSet.close();
resultSet = null;
}
if(statement != null) {
statement.close();
statement = null;
}
} catch(SQLException e) {
e.printStackTrace();
}
}
Ez is:
private void reopen() {
close();
open();
}
Ezzel a nagy rsz meg is van. A kvetkezkben az zenetkldst csinljuk meg a kt osztly kztt.
Forrs: http://www.doksi.hu
DBConnectionOpenedEvent
DBConnectionChangedEvent
DBConnectionClosedEvent
Ezutn tesznk a DBConnection-be egy EventListenerList vltozt, ebbe fogjuk trolni azokat a
DBResultSet-eket, amik kapcsolatban vannak a DBConnection-en, teht akiket rtesteni kell, ha
vmi vltozs trtnik.
private EventListenerList eventListenerList = new EventListenerList();
Htravannak mg az zenetkld metdusok. Egy, ami minden listenernek kld egy bizonyos
zenetet, valamint mindhrom zenetre kln egy-egy.
Forrs: http://www.doksi.hu
DBResultSetOpened
DBResultSetChanged
DBResultSetDataChanged
DBResultSetClosed
Forrs: http://www.doksi.hu
Ugyangy, itt is kell EventListener lista, mert a DBResultSet is fog zeneteket kldeni a hozz
kapcsolt vezrlkhz.
private EventListenerList eventListenerList = new EventListenerList();
Az tbbi metdus ugyanaz, vagy hasonl mint a DBConnection esetben, csak itt ngy fle zenetet
kldnk.
public void addActionListener(ActionListener aListener) {
eventListenerList.add(ActionListener.class, aListener);
}
public void removeActionListener(ActionListener aListener) {
eventListenerList.remove(ActionListener.class, aListener);
}
public void fireActionEvent(ActionEvent aEvent) {
ActionListener listeners[] =
eventListenerList.getListeners(ActionListener.class);
for(int i = 0; i < listeners.length; i++) {
listeners[i].actionPerformed(aEvent);
}
}
public void fireDBResultSetOpenedEvent() {
fireActionEvent(new DBResultSetOpenedEvent(this,
ActionEvent.ACTION_PERFORMED));
}
public void fireDBResultSetChangedEvent() {
fireActionEvent(new DBResultSetChangedEvent(this,
ActionEvent.ACTION_PERFORMED));
}
public void fireDBResultSetDataChangedEvent() {
fireActionEvent(new DBResultSetDataChangedEvent(this,
ActionEvent.ACTION_PERFORMED));
}
public void fireDBResultSetClosedEvent() {
fireActionEvent(new DBResultSetClosedEvent(this,
ActionEvent.ACTION_PERFORMED));
Forrs: http://www.doksi.hu
A close metdusba.
fireDBResultSetClosedEvent();
A setConnection metdus picit nagyobb trst ignyel. Ha mr volt kapcsolat eltte, abbl ki kell
venni, hogy tbbet ne zengessen, ha mr nem is hozz tartozik a DBResultSet.
if(connection != null) {
connection.removeActionListener(this);
}
A modellek
Ebben a lersban kt modellt fogok adatbzishoz ktni:
Kell pr szt szlnunk a java vezrlkrl, s modellekrl. A vezrlket, s a bennk trolt adatot
sztszedtk kt rszre, a vezrl csak megjelent, az adatot valjban a modell trolja. Egyszer
plda: csinlok kt szvegmezt, mindegyiknek ugyanazt a modellt adom meg (ugyanazt a
pldnyt). Ha a modellben tlltom a szveget, mindkt szvegmezben meg fog vlzotni. Minden
tpus vezrlnek meg van a sajt modellje. Ebbl kvetkezik, hogy neknk a megfelel modellt
kell sszektni az adatbzissal, a vezrl akkor mr onnan fogja kapni az adatot.
A DBDocument osztly
Ez az osztlyunk lesz az adatbzishoz kttt szvegmezk forrsa. Az osztly helye a db
csomagban lesz. Ahogy a DBResultSet, a PlainDocument-bl lesz szrmaztatva, s esemnyeket is
fogadhat.
public class DBDocument extends PlainDocument implements ActionListener {
Csinlunk kt vltozt:
Kell egy refresh metdus, ami a DBResultSet alapjn frissti az adatot. A fireInsertUpdate a
modellhez csatolt vezrlknek kld zenetet, hogy vltozott a megjelentend adat, ez alapbl
Forrs: http://www.doksi.hu
megvan, gy mkdik a modell/view architektra. Neknk csak az adatbzis zeneteket kell kln
megrni.
public void refresh() {
if(resultSet != null && resultSet.isOpen()) {
ResultSet rs = resultSet.getResultSet();
try {
String value = rs.getString(column);
try {
remove(0, getLength());
insertString(0, value, null);
fireInsertUpdate(new DefaultDocumentEvent(0,
value.length(), DocumentEvent.EventType.CHANGE));
} catch(BadLocationException e) {
e.printStackTrace();
}
} catch(SQLException e) {
e.printStackTrace();
}
}
}
Forrs: http://www.doksi.hu
refresh();
}
if(event.getActionCommand().equals("DBRESULTSET_DATACHANGED")) {
refresh();
}
if(event.getActionCommand().equals("DBRESULTSET_CLOSED")) {
try {
insertString(0, "", null);
} catch(BadLocationException e) {
e.printStackTrace();
}
}
}
A prbaalkalmazs
Elszr tegynk adatokat az adatbzisba, legalbb egy vrost, s egy embert. Ez mindenkppen
kell, mivel a DBResultSet megnyitsnl bentvan egy next(), automatikusan lp az els rekordra,
hogy legyen mit megjelenteni. Ezt majd ksbb kivesszk, egyelre gy knyelmes.
Nyissuk meg a Citizens projekt CitizensFrame fjljt, tervez nzetben. A palettrl tegynk a
form-ra egy DBConnection, egy DBResultSet ,egy DBDocument s egy JTextField vezrlt. A
JTextField-et helyezzk el ahogy akarjuk, a msik hrom DB osztly az Instpector-ban az Other
Components-nl lesz, mivel nem lthat komponensek. A pldnyok nevei dBConnection1,
dBResultSet1 stb, automatikusan adja, t lehet utna nevezni.
lltgassuk be a komponensek tulajdonsgait.
DBConnection:
database = citizens
host = ht ez pp ami
username = citizen
password = citizen
DBResultSet:
DBDocument:
column = citizen_name
resultSet = dBResultSet1
JTextField:
document = dBDocument1
Ha minden jl megy, akkor a tervez nzetben mr meg is jelent az els polgrunk neve.
Forrs: http://www.doksi.hu
Rekordmveletek hozzadsa
Mozgs mveletek
Ehhez kell ngy metdus a DBResultSet osztlyba.
public void first() {
try {
resultSet.first();
} catch(SQLException e) {
e.printStackTrace();
}
fireDBResultSetDataChangedEvent();
}
public void prev() {
try {
resultSet.previous();
} catch(SQLException e) {
e.printStackTrace();
}
fireDBResultSetDataChangedEvent();
}
public void next() {
try {
resultSet.next();
} catch(SQLException e) {
e.printStackTrace();
}
fireDBResultSetDataChangedEvent();
}
public void last() {
try {
resultSet.last();
} catch(SQLException e) {
e.printStackTrace();
}
fireDBResultSetDataChangedEvent();
}
Hogy hasznlni is tudjuk ket, tegynk egy JToolBar-t a CitizensFrame-re. Tegynk r ngy
JButtont, nevezzk t ket firstButton, prevButton, nextButton, lastButton-ra. A gombokon
jobbgomb->Events->Action->actionPerformed, ez hozzadja a forrshoz a gombhoz tartoz
metdust, ami vgrehajtdik, ha megnyomjuk. A ngy metdusba termszetesen a mozgs
Forrs: http://www.doksi.hu
Ha tesznk be tbb adatot a citizens tblba, s kiprbljuk, tudunk mozogni a rekordok kztt.
A frissts gomb nem j rekord mdban az aktulis adatokat fogja felrni az adatbzisba
(vltoztats).
Forrs: http://www.doksi.hu
ResultSet rs = resultSet.getResultSet();
try {
if(!rs.isBeforeFirst() && !rs.isAfterLast()) {
try {
rs.updateString(column, getText(0, getLength()));
} catch(BadLocationException e) {
e.printStackTrace();
}
}
} catch(SQLException e) {
e.printStackTrace();
}
}
}
Ezutn a DBResultSet osztly update metdust kell megrni, ami elkldi az zenetet minden
vezrlnek, s az j adatokat visszarja az adatbzisba.
public void update() {
fireDBResultSetDataUpdateEvent();
try {
resultSet.updateRow();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
Ki lehet prblni, ha trjuk a polgrunk nevt, s megnyomjuk az update gombot, frisslni fog az
adatbzisban. Az if els fele az j rekord, felveszi az adatbzisba, majd kikapcsolja a toggleButtont.
Most csinljuk meg a trlst, ez a legegyszerbb. A DBResultSet-be kell egy delete metdus.
public void delete() {
try {
resultSet.deleteRow();
} catch(SQLException e) {
e.printStackTrace();
}
fireDBResultSetDataChangedEvent();
}
Ezutn a delButton actionPerformed metdusa. Ebbe ugye illene egy rkrdezs hogy tnyleg
akarjuk-e trlni, most kimarad.
Forrs: http://www.doksi.hu