Пълен списък на типовете данни JDBC

В допълнение към типовете данни, които познавате, JDBC ви позволява да работите с много собствени типове данни за СУБД. По-долу ще изброя типовете и функциите за получаването им:

Тип Метод
масив getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
петно getBlob()
Булева стойност getBoolean()
петно getBlob()
Булева стойност getBoolean()
byteове getByte()
byteове getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Дата getDate()
Двойна getDouble()
плавам getFloat()
вътр getInt()
Дълги getLong()
NCharacterStream getNCharacterStream()
Обект getObject()
Реф getRef()
RowId getRowId()
Къс getShort()
SQLXML getSQLXML()
низ getString()
време getTime()
Времево клеймо getTimestamp()
UnicodeStream getUnicodeStream()
URL address getURL()

Вече разгледахме примитивните типове. Нека сега се опитаме да работим с обекти.

BLOB тип данни

Ако искате да запишете няHowъв обект в базата данни, тогава най-лесният начин да направите това е да използвате типа SQL BLOB. JDBC има свой аналог, наречен Blob.

BLOB означава Binary L arge Object . _ Използва се за съхраняване на масив от byteове. Типът Blob в JDBC е интерфейс и можете да поставяте (и получавате) данни в него по два начина:

  • Използване на InputStream
  • Използване на масив от byteове

Пример: колона номер 3 съдържа тип BLOB:

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

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

За да създадете свой собствен Blob обект, трябва да използвате функцията createBlob() . Пример:

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

Има два начина за попълване на Blob с данни. Първият е чрез OutputSteam :

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

И второто - чрез попълване с byteове:

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

Запазване на Java обект в база данни

Научихме How да запазваме двоични обекти в базата данни: масиви от byteове, потоци от byteове и т.н. Какво ще кажете за обектите на Java? Как да запазим Java обект в база данни?

Да кажем, че имаме Java клас Employee , който описва служител на компания:

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

Как можем да запазим обект от този клас в базата данни с помощта на JDBC?

Всъщност вие вече знаете всичко, което трябва да знаете. Първо трябва да създадете table в базата данни, която съответства на този клас. Например този:

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

А сега нека напишем codeа, който ще добави обект от нашия клас Employee към базата:

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

Просто и ясно. Методът ще работи чудесно.

Четене на Java обект от база данни

Научихме How да напишем обект в базата данни, сега нека напишем codeа за четене на обекта от базата данни. Нека започнем с codeа, който чете обект от базата данни по неговия ID:

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

И ако имаме нужда не от един обект, а от няколко? Такава молба също е лесна за писане. Нека вземем всички служители на нашата компания:

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

Между другото, ако има много такива методи, тогава във всеки от тях ще трябва да напишете един и същ code за преобразуване на низа ResultSet в обектслужител. Така че този code може да бъде преместен в отделен метод.

Това може да бъде особено полезно, ако класът Employee съдържа сложни полета като Enum, InputStream or препратки към други обекти, които също искаме да съхраняваме в базата данни.