CodeGym/Kursy Java/All lectures for PL purposes/Zapisywanie obiektów do bazy danych

Zapisywanie obiektów do bazy danych

Dostępny

Pełna lista typów danych JDBC

Oprócz typów danych, które znasz, JDBC umożliwia pracę z wieloma rodzimymi typami danych dla systemu DBMS. Poniżej wymienię typy i funkcje, aby je uzyskać:

Typ metoda
szyk getArray()
AsciiStream getAsciiStream()
Duży dziesiętny getBigDecimal()
strumień binarny getBinaryStream()
kropelka getBlob()
logiczne getBoolean()
kropelka getBlob()
logiczne getBoolean()
bajty getByte()
bajty getBytes()
Strumień znaków getCharacterStream()
grudka getClob()
Data pobierzDate()
Podwójnie getDouble()
platforma getFloat()
int getInt()
Długi getLong()
Strumień znaków getNCharacterStream()
Obiekt getObject()
Ref getRef()
Identyfikator wiersza getRowId()
krótki getShort()
SQLXML getSQLXML()
Strunowy pobierzString()
Czas uzyskać czas()
Znak czasu pobierz znacznik czasu()
UnicodeStream getUnicodeStream()
Adres URL pobierzURL()

Rozważaliśmy już typy pierwotne. Spróbujmy teraz pracować z obiektami.

Typ danych BLOB

Jeśli chcesz zapisać jakiś obiekt do bazy danych, to najłatwiejszym sposobem na to jest użycie typu SQL BLOB. JDBC ma swój odpowiednik o nazwie Blob.

BLOB oznacza duży obiekt binarny . _ _ Służy do przechowywania tablicy bajtów. Typ Blob w JDBC jest interfejsem i możesz w nim umieszczać (i odbierać) dane na dwa sposoby:

  • Korzystanie ze strumienia wejściowego
  • Korzystanie z tablicy bajtów

Przykład: kolumna numer 3 zawiera typ BLOB:

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

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

Aby utworzyć własny obiekt Blob, musisz użyć funkcji createBlob() . Przykład:

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

Istnieją dwa sposoby wypełniania obiektu Blob danymi. Pierwszy jest przez OutputSteam :

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

A drugi - poprzez wypełnienie bajtami:

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

Zapisywanie obiektu Java w bazie danych

Nauczyliśmy się zapisywać obiekty binarne w bazie danych: tablice bajtów, strumienie bajtów i tak dalej. A co z obiektami Java? Jak zapisać obiekt Java w bazie danych?

Załóżmy, że mamy klasę Java dla pracowników , która opisuje pracownika firmy:

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

Jak możemy zapisać obiekt tej klasy w bazie danych za pomocą JDBC?

Właściwie wiesz już wszystko, co powinieneś wiedzieć. Najpierw musisz utworzyć tabelę w bazie danych, która odpowiada tej klasie. Na przykład ten:

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

A teraz napiszmy kod, który doda obiekt naszej klasy Employee do bazy:

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

Proste i jasne. Metoda świetnie się sprawdzi.

Odczytywanie obiektu Java z bazy danych

Nauczyliśmy się pisać obiekt do bazy danych, teraz napiszmy kod, który odczyta obiekt z bazy danych. Zacznijmy od kodu, który odczytuje obiekt z bazy danych po identyfikatorze:

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

A jeśli potrzebujemy nie jednego przedmiotu, ale kilku? Taka prośba jest również łatwa do napisania. Zbierzmy wszystkich pracowników naszej firmy:

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

Nawiasem mówiąc, jeśli istnieje wiele takich metod, to w każdej z nich będziesz musiał napisać ten sam kod do konwersji ciągu ResultSet na obiektpracownik. Tak więc ten kod można przenieść do osobnej metody.

Może to być szczególnie przydatne, jeśli klasa Employee zawiera złożone pola, takie jak Enum, InputStream lub odniesienia do innych obiektów, które również chcemy przechowywać w bazie danych.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy