Adatbázis alapú rendszerek
Cser Lajos, 2013.
Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben Java GUI készítése, Oracle kapcsolódás JDBC-vel A jelen anyagban egy egyszerűsített megközelítéssel vizsgáljuk egy adatbázis alapú alkalmazás Java implementációját. Számos olyan konvenciót (pl. MVC) nem tartunk be, amelyek egy nagyobb projektnél létfontosságúak a siker szempontjából – ezekért lásd bővebben az Alkalmazásfejlesztés kurzust. Eclipse-ben új projektet hozunk létre. Ezen belül új osztályt veszünk fel. Ezután importálunk néhány szükséges csomagot: import import import import
java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;
Ezután létrehozzuk a komponenseket – egy feliratot és egy gombot, GridLayout segítségével elrendezzük azokat, beállítjuk, hogy az ablak bezárásakor érjen véget a program futása. EsemenyKezelo néven létrehozunk egy osztályt, amivel a gombra kattintást kezeljük le. Létrehozásakor átadunk egy referenciát az űrlapot tartalmazó korábbi osztályra, hogy vissza tudjon hatni majd az űrlapunkra. import import import import
java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;
public class OracleExample { private JFrame ablak; private JLabel lbl; private JButton btn; private JPanel pnl; private EsemenyKezelo k; public OracleExample() { ablak = new JFrame("Ez a foablak"); lbl = new JLabel("Ez egy minta felirat"); btn = new JButton("Próba"); pnl = new JPanel(); k = new EsemenyKezelo(this); btn.addActionListener(k); pnl.setLayout(new GridLayout(2,1)); pnl.add(lbl); pnl.add(btn); ablak.add(pnl); ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ablak.pack(); ablak.setVisible(true);
1
Adatbázis alapú rendszerek
Cser Lajos, 2013.
} public void setLblText(String s) { lbl.setText(s); } public static void main(String[] args) { OracleExample oci = new OracleExample(); } }
Valamint az EsemenyKezelo osztály (implementálja az ActionListener interfészt, valamint az actionPerformed() metódust:) import import import import
java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;
public class EsemenyKezelo implements ActionListener { OracleExample c; private int sz; public EsemenyKezelo(OracleExample e) { c = e; sz = 0; } public void actionPerformed(ActionEvent e) { sz = sz + 1; c.setLblText(Integer.toString(sz, 10)); } }
Ezzel létrehoztunk egy igen egyszerű ablakos alkalmazást, amiben kezdetben egy felirat látható, valamint egy gomb, amire kattintáskor a számláló (EsemenyKezelo sz tagváltozója) inkrementálódik, és ez megjelenik az ablakban, a feliratban is:
A következő feladat, hogy kapcsolatot létesítsünk az Oracle-lel, kiolvassuk az EMP táblából az átlagbért, és megjelenítsük azt a feliratban, gombra kattintás után. Az adatbázishoz való kapcsolódáshoz a JDBC-t használjuk. Szükséges beszerezni egy megfelelő illesztőprogramot – ehhez az Oracle honlapjáról kell letöltenünk a mi szoftververziónknak megfelelő kiadást. Célszerű a thin drivert keresni. 2
Adatbázis alapú rendszerek
Cser Lajos, 2013.
Ha megvan a driver, szükséges lesz még azt a rendszerünkön regisztrálni is; ehhez a CLASSPATH környezeti változót kell kiegészítenünk a letöltött JAR fájl abszolút elérési útvonalának megadásával (némiképp körülményes és problémás út), vagy Eclipse-ben hozzá kell adnunk a letöltött JAR fájlt a projekthez (ekkor a fordításkor kényelmesen csatolódik a driver is; hasonló célt szolgál a java parancs –classpath opciója.) Project > Properties > Java Build Path > Add External JARs... Létrehozunk egy osztályt DbConnection néven, ebben lesz egy • connect() metódus a kapcsolat nyitására • lekerdez() metódus az átlagfizetés lekérésére • disconnect() metódus a kapcsolat zárására. import java.sql.*; public class DbConnection { Connection c; boolean isLive = false; public DbConnection() { } public boolean connect() { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); String url = "jdbc:oracle:thin:@localhost:1521:xe"; c = DriverManager.getConnection(url, "teszt", "jelszo"); System.out.println("ok"); } catch (Exception e) { e.printStackTrace(); } isLive = true; return true; } public String lekerdez() { if(isLive) { try { Statement stmt = c.createStatement(); ResultSet rs = stmt.executeQuery("SELECT AVG(SAL) FROM EMP"); if (rs.next()) return rs.getString(1); else return ""; } catch (SQLException e) {
3
Adatbázis alapú rendszerek
Cser Lajos, 2013. e.printStackTrace();
} } return " "; } public boolean disconnect() { if (isLive=true) try { c.close(); } catch (SQLException e) { e.printStackTrace(); } isLive = false; return true; } }
Kissé módosítunk az EsemenyKezelo osztályon. Ahhoz, hogy a lekérdezett számértéket (kb. 2073 USD) megjelenítse, létrehozunk egy DbConnection objektumot benne, megnyitjuk a kapcsolatot, és a lekerdez() metódust hívjuk. import import import import
java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.event.*;
public class EsemenyKezelo implements ActionListener { OracleExample c; private int sz; private DbConnection dbc; public EsemenyKezelo(OracleExample e) { c = e; sz = 0; dbc = new DbConnection(); dbc.connect(); } public void actionPerformed(ActionEvent e) { sz = sz + 1; c.setLblText(Integer.toString(sz, 10) + " " + dbc.lekerdez()); } }
További probléma lehet egy valós alkalmazásban az adatok bevitele az adatbázisba (UPDATE), vagy azok törlése (DELETE.) Ehhez egyrészről fel kell vennünk a GUI-n szövegbeviteli mező(ke)t, valamint a Statement objektumunk executeUpdate() metódusát használjuk.
4
Adatbázis alapú rendszerek
Cser Lajos, 2013.
C# GUI készítése, Oracle kapcsolódás .NET eszközökkel A Microsoft Visual Studio-t használjuk (a példákban a 2010-es verzió szerepel.) File > New > Project… segítségével Visual C# Windows Forms Application-t hozunk létre OracleExample néven.
A projekt létrehozása után egy grafikus szerkesztőfelületet kapunk egy üres űrlappal, amire fogd és vidd módszerrel kihelyezhetünk komponenseket (a korábbi Java programhoz hasonlóan itt is egy címkét – Label – és egy gombot – Button – helyezünk el.) Az egyes komponensekre egyszer kattintva a Properties fülön beállíthatók azok tulajdonságai (lásd oldalt.) Beállítjuk a Text tulajdonságokat. Ezután a gomb eseménykezelőjét írjuk meg (a Properties fülön a villám ikonra kattintva előhozható a teljes lista, ill. a gombra duplán kattintva automatikusan a Click eseményt írhatjuk meg.) A szerkesztőfelülethez jutunk:
5
Adatbázis alapú rendszerek
Cser Lajos, 2013.
namespace OracleExample { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } } }
Amint látható, létre is jött egy csonk az eseménykezelésre. Vegyünk fel az osztályban egy tagváltozót (int), és csináljuk meg a számlálást itt is: namespace OracleExample { public partial class Form1 : Form { private int sz = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { sz++; label1.Text = sz.ToString(); } } }
Próbáljuk ki az alkalmazást:
A következő feladat az Oracle kapcsolódás, hogy lekérdezzük a dolgozók átlagbérét. A .NET keretrendszer támogatja az Oracle-t, így nem szükséges külön drivert letölteni és regisztrálni (nincs is a JDBC DriverManager-hez hasonló szerepű összetevő, más szemléletű az architektúra.) Elegendő az adatbázis-kapcsolat létrehozására szolgáló osztály elején importálni két csomagot (a példában az egyszerűség kedvéért most mindent egy helyre ömlesztünk:) using System.Data; using System.Data.OleDb;
6
Adatbázis alapú rendszerek
Cser Lajos, 2013.
Ezután egy OleDbConnection objektumot hozunk létre. Meg kell adnunk egy kapcsolatleíró sztringet, ami elmagyarázza a rendszernek, hogy Oracle adatbázishoz kapcsolódunk, valamint hogy hol érhető el az adatbázis. (Megjegyzés. Adatforrásokat egy C# alkalmazáshoz varázsló segítségével is hozzá lehet adni, ennek ismertetésétől most eltekintünk.) Az átlagbér lekéréséhez egy OleDbCommand létrehozása szükséges. A megoldás: namespace OracleExample { public partial class Form1 : Form { private int sz = 0; private OleDbConnection dbc; private OleDbCommand cmd; private double avgber; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { sz++; label1.Text = sz.ToString(); try { String conn_str = "Provider=MSDAORA;Data Source=( DESCRIPTION = " + (ADDRESS_LIST = ( ADDRESS = ( PROTOCOL = TCP )( HOST = localhost)" + "( PORT = 1521 ) ) )( CONNECT_DATA = ( SERVER = DEDICATED ) " + (SID = xe ) );" + "User Id=teszt; Password = jelszo;"; dbc = new OleDbConnection(conn_str); dbc.Open(); cmd = dbc.CreateCommand(); cmd.CommandText = "SELECT AVG(SAL) FROM EMP"; OleDbDataReader r = cmd.ExecuteReader(); r.Read(); avgber = double.Parse(r[0].ToString()); label1.Text = sz.ToString() + " " + avgber.ToString(); dbc.Close(); } catch (Exception err) { Console.WriteLine(err.ToString()); } } } }
Adatbázisok lekérdezéséhez hasznos lehet a DataGridView komponens (húzással kihelyezhető.) Ez táblázatos formában képes egy adatforrást megjeleníteni. Az adatok lekéréséhez szükséges lesz (a kapcsolat korábban látott megnyitása után) egy OleDbDataAdapter létrehozása. Ebből ki kell nyernünk az adathalmazt egy DataSet-be, onnan kiválasztjuk a megfelelő táblát (DataTable), majd a létrehozott DataGridView adatforrásaként megadjuk azt. A korábbi button1_Click(..) metódust így egészítjük ki:
7
Adatbázis alapú rendszerek
Cser Lajos, 2013.
private void button1_Click(object sender, EventArgs e) { sz++; label1.Text = sz.ToString(); try { String conn_str = "Provider=MSDAORA;Data Source=( DESCRIPTION =" + (ADDRESS_LIST = ( ADDRESS = ( PROTOCOL = TCP )( HOST = localhost)" + "( PORT = 1521 ) ) )( CONNECT_DATA = ( SERVER = DEDICATED ) " + (SID = xe ) );" + "User Id=teszt; Password = jelszo;"; dbc = new OleDbConnection(conn_str); dbc.Open(); cmd = dbc.CreateCommand(); cmd.CommandText = "SELECT AVG(SAL) FROM EMP"; OleDbDataReader r = cmd.ExecuteReader(); r.Read(); avgber = double.Parse(r[0].ToString()); label1.Text = sz.ToString() + " " + avgber.ToString(); OleDbDataAdapter da = new OleDbDataAdapter("SELECT AVG(SAL) FROM " + "EMP", dbc); DataSet ds = new DataSet(); DataTable dt = new DataTable(); ds.Reset(); da.Fill(ds); dt = ds.Tables[0]; dataGridView1.DataSource = dt; dbc.Close(); } catch (Exception err) { Console.WriteLine(err.ToString()); } }
Ezután az eredmény:
8