Documente Academic
Documente Profesional
Documente Cultură
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:
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.