CodeGym/Java tanfolyam/All lectures for HU purposes/Objektumok mentése az adatbázisba

Objektumok mentése az adatbázisba

Elérhető

A JDBC adattípusok teljes listája

Az ismert adattípusokon kívül a JDBC lehetővé teszi, hogy számos natív adattípussal dolgozzon a DBMS-hez. Az alábbiakban felsorolom a típusokat és a hozzájuk tartozó funkciókat:

típus Módszer
sor getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
folt getBlob()
Boolean getBoolean()
folt getBlob()
Boolean getBoolean()
bájtok getByte()
bájtok getBytes()
Karakterfolyam getCharacterStream()
Clob getClob()
Dátum getDate()
Kettős getDouble()
úszó getFloat()
int getInt()
Hosszú get Long()
NCharacterStream getNCharacterStream()
Tárgy getObject()
Ref getRef()
RowId getRowId()
Rövid getShort()
SQLXML getSQLXML()
Húr getString()
Idő getTime()
Időbélyeg getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

A primitív típusokat már figyelembe vettük. Most próbáljunk meg tárgyakkal dolgozni.

BLOB adattípus

Ha el akarunk menteni valamilyen objektumot az adatbázisba, akkor ennek legegyszerűbb módja az SQL BLOB típus használata. A JDBC-nek megvan a megfelelője, Blob.

A BLOB a Binary L arge Object rövidítése . Egy bájttömb tárolására szolgál. A JDBC Blob típusa egy interfész, és kétféle módon helyezhet el (és fogadhat) adatokat:

  • Az InputStream használata
  • Egy bájttömb használatával

Példa: a 3. számú oszlop a BLOB típust tartalmazza:

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

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

Saját Blob objektum létrehozásához a createBlob() függvényt kell használnia . Példa:

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();

Kétféleképpen tölthet fel egy Blobot adatokkal. Az első az OutputSteamen keresztül történik :

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

És a második - bájtokkal való kitöltéssel:

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

Java objektum mentése adatbázisba

Megtanultuk, hogyan lehet bináris objektumokat menteni az adatbázisba: bájttömböket, bájtfolyamokat stb. Mi a helyzet a Java objektumokkal? Hogyan menthetünk el egy Java objektumot adatbázisba?

Tegyük fel, hogy van egy Employee Java osztályunk , amely egy vállalat alkalmazottját írja le:

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

Hogyan menthetünk el egy ilyen osztályú objektumot az adatbázisba JDBC használatával?

Valójában már mindent tudsz, amit tudnod kell. Először létre kell hoznia egy táblát az adatbázisban, amely megfelel ennek az osztálynak. Például ez:

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

És most írjuk meg azt a kódot, amely hozzáadja az Employee osztály egy objektumát az alaphoz:

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;
    }

Egyszerű és világos. A módszer nagyszerűen fog működni.

Java objektum beolvasása adatbázisból

Megtanultuk, hogyan kell objektumot írni az adatbázisba, most írjuk meg a kódot, hogy kiolvassuk az objektumot az adatbázisból. Kezdjük azzal a kóddal, amely beolvas egy objektumot az adatbázisból az azonosítója alapján:

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;
}

És ha nem egy tárgyra van szükségünk, hanem többre? Egy ilyen kérést is könnyű megírni. Szerezzük meg cégünk összes alkalmazottját:

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;
}

Mellesleg, ha sok ilyen módszer létezik, akkor mindegyikbe ugyanazt a kódot kell írnia a ResultSet karakterlánc objektummá konvertálásáhozmunkavállaló. Tehát ez a kód áthelyezhető egy külön metódusba.

Ez különösen akkor lehet hasznos, ha az Employee osztály olyan összetett mezőket tartalmaz, mint az Enum, InputStream, vagy hivatkozások más objektumokra, amelyeket szintén az adatbázisban szeretnénk tárolni.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései