Lista completă a tipurilor de date JDBC

Pe lângă tipurile de date pe care le cunoașteți, JDBC vă permite să lucrați cu multe tipuri de date native pentru DBMS. Mai jos voi enumera tipurile și funcțiile pentru a le obține:

Tip Metodă
matrice getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
blob getBlob()
boolean getBoolean()
blob getBlob()
boolean getBoolean()
octeți getByte()
octeți getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Data getDate()
Dubla getDouble()
pluti getFloat()
int getInt()
Lung getLong()
NCharacterStream getNCharacterStream()
Obiect getObject()
Ref getRef()
RowId getRowId()
Mic de statura getShort()
SQLXML getSQLXML()
Şir getString()
Timp Fă-ți timp()
Timestamp-ul getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Am luat în considerare deja tipurile primitive. Să încercăm acum să lucrăm cu obiecte.

Tipul de date BLOB

Dacă doriți să salvați un obiect în baza de date, atunci cea mai ușoară modalitate de a face acest lucru este utilizarea tipului SQL BLOB. JDBC are omologul său numit Blob.

BLOB înseamnă Binary L arge Object . _ Este folosit pentru a stoca o serie de octeți. Tipul Blob din JDBC este o interfață și puteți pune (și primi) date în ea în două moduri:

  • Folosind InputStream
  • Folosind o matrice de octeți

Exemplu: coloana numărul 3 conține tipul BLOB:

Statement statement = connection.createStatement();
    ResultSet results = statement.executeQuery("SELECT * FROM user");
    results.first();

    Blob blob = results.getBlob(3);
    InputStream is = blob.getBinaryStream();

Pentru a vă crea propriul obiect Blob, trebuie să utilizați funcția createBlob() . Exemplu:

String insertQuery = “INSERT INTO images(name, image) VALUES (?, ?);
PreparedStatement statement = connection.prepareStatement(insertQuery);

// Create a Blob object and get an OtputStream from it to write data to it
Blob blob = connection.createBlob();

// Populate the Blob with data...
OutputStream os = blob.setBinaryStream(1);

// Passing Blob as query parameter
statement.setBlob(2, blob);
statement.execute();

Există două moduri de a popula un blob cu date. Prima este prin OutputSteam :

Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);

Și al doilea - prin umplerea cu octeți:

Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);

Salvarea unui obiect Java într-o bază de date

Am învățat cum să salvăm obiecte binare în baza de date: matrice de octeți, fluxuri de octeți și așa mai departe. Dar obiectele Java? Cum salvăm un obiect Java într-o bază de date?

Să presupunem că avem o clasă Employee Java care descrie un angajat al unei companii:

public class Employee {
    public Integer id;
    public String name;
    public String occupation;
    public Integer salary;
    public Date joinDate;
}

Cum putem salva un obiect din această clasă în baza de date folosind JDBC?

De fapt, știi deja tot ce trebuie să știi. Mai întâi trebuie să creați un tabel în baza de date care corespunde acestei clase. De exemplu, acesta:

CREATE TABLE employee {
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR(100),
    occupation VARCHAR(100),
    salary INT,
    join_date DATE
}

Și acum să scriem codul care va adăuga un obiect din clasa noastră Employee la bază:

public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
    	// Create and prepare a query to insert data into the table
    	String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
    	PreparedStatement statement = connection.prepareStatement(insertQuery);

    	// Populate the query with data from the Employee object
    	statement.setString(1, employee.name);
    	statement.setString(2, employee.occupation);
    	statement.setInt(3, employee.salary);
    	statement.setDate(4, employee.joinDate);

    	// Execute our query and it returns true if a new row has been added
    	int count = statement.executeUpdate();
    	return count > 0;
    }

Simplu și clar. Metoda va funcționa excelent.

Citirea unui obiect Java dintr-o bază de date

Am învățat cum să scriem un obiect în baza de date, acum să scriem codul pentru a citi obiectul din baza de date. Să începem cu codul care citește un obiect din baza de date după ID-ul său:

public static Employee getEployeeById(Connection connection, int id) throws Exception {
    	// Create and prepare a query to get an employee from the table
    	PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
    	statement.setInt(1, id);

    	// Execute our query and it returns null if there are no rows in the query result
    	ResultSet results = statement.executeQuery();
    	if (!results.first())
        	return null;

    	// Populate the Employee object with the data from the ResultSet
    	Employee employee = new Employee();
    	employee.id = results.getInt(1);
    	employee.name = results.getString(2);
    	employee.occupation = results.getString(3);
    	employee.salary = results.getInt(4);
    	employee.joinDate = results.getDate(5);
    	return employee;
}

Și dacă nu avem nevoie de un singur obiect, ci de mai multe? O astfel de cerere este, de asemenea, ușor de scris. Să luăm toți angajații companiei noastre:

public static List<Employee> getAllEployees(Connection connection) throws Exception {
	// Create and execute a query to get employees from the table
	Statement statement = connection.createStatement();
	ResultSet results = statement.executeQuery("SELECT * FROM employee");

	ArrayList<Employee> list = new ArrayList<Employee>();
	while (results.next()) {
        // Populate the Employee object with the data from the current row of the ResultSet
	        Employee employee = new Employee();
	        employee.id = results.getInt(1);
	        employee.name = results.getString(2);
	        employee.occupation = results.getString(3);
	        employee.salary = results.getInt(4);
	        employee.joinDate = results.getDate(5);

	        list.add(employee);
	}
	return list;
}

Apropo, dacă există multe astfel de metode, atunci în fiecare dintre ele va trebui să scrieți același cod pentru a converti șirul ResultSet într-un obiectangajat. Deci, acest cod poate fi mutat într-o metodă separată.

Acest lucru poate fi util mai ales dacă clasa Employee conține câmpuri complexe precum Enum, InputStream sau referințe la alte obiecte pe care dorim să le stocăm și în baza de date.