Sunteți pe pagina 1din 8

UNIVERSITATEA HYPERION DIN BUCURETI

FACULTATEA DE TIINE EXACTE I INGINERETI


Specializarea AUTOMATIC I INFORMATIC APLICAT

PROGRAMARE APLICAT N JAVA


Baza de date creata cu pgAdmin III cu aplicatie in Java

Lector univ.dr.ing. Cornel Eugen Ene


Daniel Catalin
An III
2016
Utilizam pgAdmin III pentru a crea baze de date i tabele
pgAdmin este un instrument care ne ajut la lucru cu
PostgreSQL. Acesta ne permite s cream baze de date,
tabele si de a manipula datele.

Dup ace am creat o baza de date observam faptul ca:


acest intreg process destul de lung si este identic cu executia unei
interogari:
CREATE TABLE people
01
02 (
03 id serial NOT NULL,
04 name character(20),
05 surname character(20),
06 age integer,
07 CONSTRAINT people_pkey PRIMARY KEY (id)
08 )
09 WITH (
10 OIDS=FALSE
11 );
12 ALTER TABLE people
13 OWNER TO postgres;
Putem folosi Instrumentul de interogare (Query tool) click Tools > Query
tool sau simplu CTRL+E.
Putem folosi( Query tool)sa adaugam date in table in felul urmator:
insert into people (name, surname,
1
age) values ('Bruce','Scott',65);
2 insert into people (name, surname, age) values ('John','Doe',40);
3 insert into people (name, surname, age) values ('Jane','Doe',35);

Conectarea la Postgres

Creati o interfata numita DbContract in a .db package, si puneti acest cod in:
DbContract.java
1 package com.javacodegeeks.examples.db;
2
3 public interface DbContract {
public static final String HOST
4
= "jdbc:postgresql://localhost:5432/";
5 public static final String DB_NAME = "try_postgre";
6 public static final String USERNAME = "postgres";
7 public static final String PASSWORD = "password";
8}
Daca dorim un user si o parola se va tine seama de codul DRY (Dont Repeat
Yourself),si nu de WET (Write Everything Twice).
Acum se va efectua testul cu Baza de Date prin Java:

TestConnection.java
01 package com.javacodegeeks.examples;
02
03 import java.sql.Connection;
04 import java.sql.DriverManager;
05 import java.sql.SQLException;
06
07 import com.javacodegeeks.examples.db.DbContract;
08
09 public class TestConnection {
10
11
12 public static void main(String[] args) {
13 try {
14 Class.forName("org.postgresql.Driver");
15 Connection c = DriverManager.getConnection(
16 DbContract.HOST+DbContract.DB_NAME,
17 DbContract.USERNAME,
18 DbContract.PASSWORD);
19
20 System.out.println("DB connected");
21
22 } catch (ClassNotFoundException | SQLException e) {
23 e.printStackTrace();
24 }
25
26 }
27
28 }
Nu uitai s adugai driverele necesare n cale, altfel conexiunea nu va avea
succes i codul nu va funciona. Dac gazda, numele bazei de date, numele
de utilizator i parola sunt corecte, iar driverele sunt adugate, rezultatul ar
fi:
1 DB conectat
n caz contrar, va arunca o PSQLException.
Acum, avem de gnd s simplificam un pic treaba cu Postres prin crearea
unei clase helper numit PostgresHelper. Il punem n dbpackage i punem
acest cod n ea:PostgresHelper.java
01 package com.javacodegeeks.examples.db;
02
03 import java.sql.Connection;
04 import java.sql.DriverManager;
05 import java.sql.SQLException;
06
07 public class PostgresHelper {
08
09 private Connection conn;
10 private String host;
11 private String dbName;
12 private String user;
13 private String pass;
14
15 //we don't like this constructor
16 protected PostgresHelper() {}
17
public PostgresHelper(String host, String dbName, String
18
user, String pass) {
19 this.host = host;
20 this.dbName = dbName;
21 this.user = user;
22 this.pass = pass;
23 }
24
public boolean connect() throws SQLException,
25
ClassNotFoundException {
26 if (host.isEmpty() || dbName.isEmpty() ||
user.isEmpty() || pass.isEmpty()) {
throw new SQLException("Database credentials
27
missing");
28 }
29
30 Class.forName("org.postgresql.Driver");
31 this.conn = DriverManager.getConnection(
32 this.host + this.dbName,
33 this.user, this.pass);
34 return true;
35 }
36 }
Metoda connect() este cea care creeaza conectarea cu Baza de Date.Daca
conexiunea s-a realizat cu success apare ca adevarata daca nu devine o
SQLException.
Ca sa o utilizezi creeaza o clasa denumita ca Main si pune acest cod in el:
Main.java
01 package com.javacodegeeks.examples;
02
03 import java.sql.SQLException;
04
05 import com.javacodegeeks.examples.db.DbContract;
06 import com.javacodegeeks.examples.db.PostgresHelper;
07
08 public class Main {
09
10 public static void main(String[] args) {
11
12 PostgresHelper client = new PostgresHelper(
13 DbContract.HOST,
14 DbContract.DB_NAME,
15 DbContract.USERNAME,
16 DbContract.PASSWORD);
17
18 try {
19 if (client.connect()) {
20 System.out.println("DB connected");
21 }
22
23 } catch (ClassNotFoundException | SQLException e) {
24 e.printStackTrace();
25 }
26
27 }
28
29 }
Putei vedea pe liniile 12-16 modul n care instana este creat, i modul n
care conexiunea se face pe linia 19. Acreditrile sunt OK, acesta va arta
aceeai ieire ca prima clasa.
Selectarea datelor n PostgreSQL
Pentru a executa interogri SQL, vom crea o metoda numita execQuery() n
clasa noastr de PostgreHelper:

1 public ResultSet execQuery(String query) throws SQLException {


2 return this.conn.createStatement().executeQuery(query);
3}
Add this to the class, and after doing that, add this piece of code after the
connection is made at Main class:
01 ResultSet rs = client.execQuery("SELECT * FROM people");
02
03 while(rs.next()) {
04
05 System.out.printf("%d\t%s\t%s\t%d\n",
06 rs.getInt(1),
07 rs.getString(2),
08 rs.getString(3),
09 rs.getInt(4));
10 }
Metoda doar executa instruciunea SQL care este transmisa ca parametru, i
poate arunca o SQLException, dac parametrul nu este o declaraie SQL
valabila.Rezultatul va fi:
11 Bruce Scott 65
22 John Doe 40
33 Jane Doe 35
The same would happen if you pass a query like "SELECT * FROM people
WHERE surname = 'Doe'":
12 John Doe 40
23 Jane Doe 35

Inserind in PostgreSQL
Acum v-om scrie o metoda pentru a insera date intr-o Baza de date facuta in
Postgres.Aceasta metoda va fi insert(),si adaugata la PostgresHelper :
public int insert(String table, Map values) throws SQLException
01
{
02
03 StringBuilder columns = new StringBuilder();
04 StringBuilder vals = new StringBuilder();
05
06 for (String col : values.keySet()) {
07 columns.append(col).append(",");
08
09 if (values.get(col) instanceof String) {
vals.append("'").append(values.get(col)).append("'
10
, ");
11 }
12 else vals.append(values.get(col)).append(",");
13 }
14
15 columns.setLength(columns.length()-1);
16 vals.setLength(vals.length()-1);
17
String query = String.format("INSERT INTO %s (%s) VALUES
18
(%s)", table,
19 columns.toString(), vals.toString());
20
21 return this.conn.createStatement().executeUpdate(query);
22 }
Aceasta metoda presupune doi parametrii. Primul este un ir, tabelul unde
am v-om introduce datele. Cellalt este instanta aMap care hri numele de
coloane (siruri de caractere) la valori (obiecte), care va fi adugat la masa.
Prin utilizarea StringBuilders creeaz un ir de caractere, pentru toate
numele de coloan, i un altul pentru valori, pune fiecare valoare a irului
ntre ghilimele simple ('i').
Dup aceea, am asigurai-v c pentru a terge ultima virgula din ambele
siruri de caractere, prin micorarea duratei ambele StringBuilders 1. Apoi, am
executat interogarea executeUpdate().
Pentru a testa acest lucru, am scris acest cod dup ce conexiunea este
fcuta n clasa principala:
1 Map vals = new HashMap();
2
3 vals.put("id", 4);
4 vals.put("name", "Aldo");
5 vals.put("surname", "Ziflaj");
6 vals.put("age", 19);
7 if (client.insert("people", vals) == 1) {
8 System.out.println("Record added");
9}
Putei pune datele dumneavoastr n loc de a mea la HashMap. Dac ID-ul 4
nu este duplicat, vei vedea nregistrare adugat. n caz contrar, va fi
aruncat o SQLException.

Aceast metod ar aduga numai o nregistrare n tabelul specificat. Dac


dorii s adugai o list a acestora, putei crea o metod similar, ex.
insertList(), pentru a apela metoda insert() la fiecare element din
list/matrice.

S-ar putea să vă placă și