JavaRush /Kurslar /All lectures for UZ purposes /Объектларни базада сақлаш

Объектларни базада сақлаш

All lectures for UZ purposes
Daraja, Dars
Mavjud

JDBC маълумот турларининг тўлиқ рўйхати

Сенга маълум бўлган маълумот турларидан ташқари, JDBC бир қатор СУБД учун махсус маълумот турлари билан ишлашга имкон беради. Қуйида мен маълумот турлари ва уларни олиш функциялари рўйхатини келтираман:

Тур Метод
Array getArray()
AsciiStream getAsciiStream()
BigDecimal getBigDecimal()
BinaryStream getBinaryStream()
Blob getBlob()
Boolean getBoolean()
Blob getBlob()
Boolean getBoolean()
Byte getByte()
Bytes getBytes()
CharacterStream getCharacterStream()
Clob getClob()
Date getDate()
Double getDouble()
Float getFloat()
Int getInt()
Long getLong()
NCharacterStream getNCharacterStream()
Object getObject()
Ref getRef()
RowId getRowId()
Short getShort()
SQLXML getSQLXML()
String getString()
Time getTime()
Timestamp getTimestamp()
UnicodeStream getUnicodeStream()
URL getURL()

Примитив турларини биз сен билан олдин кўрганмиз. Энди объектов билан ишлашни ўрганамиз.

BLOB маълумот тури

Агар сен қандайдир объектни базада сақламоқчи бўлсанг, буни амалга оширишнинг энг оддий усули — BLOB SQL туридан фойдаланиб. JDBC да унинг аналоглари бор, улар Blob деб аталади.

BLOB шундай расшифровка қилинади: Binary Large Object. У байтлар массивини сақлаш учун ишлатилади. JDBC да Blob тури интерфейс ва унга маълумотларни икки усулда жойлаштириш (ва олиш) мумкин:

  • InputStream орқали
  • Байтлар массиви орқали

Мисол: 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);
 
  // Создаем объект Blob и получаем у него OtputStream для записи в него данных
  Blob blob = connection.createBlob();
 
  // Заполняем Blob данными  …
  OutputStream os = blob.setBinaryStream(1);
 
  // Передаем Вlob как параметр запроса
  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);

Иккинчиси — байтлар орқали тўлдириш:


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

Java-объектни базада сақлаймиз

Биз бинар объектларни базада сақлашни ўргандик: байтлар массиви, байтлар оқими ва ҳоказо. Эндичи, Java-объектлари ҳақидачи? Java-объектни базада кандай сақланамиз?

Айтайлик, бизда компаниянинг ходимини тасвирлайдиган Employee Java-класси бор:


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

Бу клаcснинг объектни JDBC ёрдамида базада қандай сақлаймиз?

Аслида, буни амалга ошириш учун сен барча зарур билимларга эгасан. Авваламбор, ушбу классга мувофиқ базада жадвал яратиш керак. Масалан, шундай:


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

Энди Employee классимизнинг объектни базада қўшадиган код ёзайлик:


	public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
    	// Создаем и подготавливаем запрос на вставку данных в таблицу
    	String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
    	PreparedStatement statement = connection.prepareStatement(insertQuery);
 
    	// Заполняем запрос данными из объекта Employee
    	statement.setString(1, employee.name);
    	statement.setString(2, employee.occupation);
    	statement.setInt(3, employee.salary);
    	statement.setDate(4, employee.joinDate);
 
    	// Выполняем наш запрос, и он возвращает true, если новая строка добавилась
    	int count = statement.executeUpdate();
    	return count > 0;
    }

Жуда ҳам содда ва тушунарли. Бу метод аъло даражада ишлайди.

Java-объектни базадан ўқиймиз

Объектни базада ёзишни ўргандик, эндиликда, код ёзамиз, базадан объектни ўқиш учун. Объектни базадан унинг ID орқали ўқийдиган коддан бошлаймиз:


	public static Employee getEmployeeById(Connection connection, int id) throws Exception {
    	// Создаем и подготавливаем запрос для получения сотрудника из таблицы
    	PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
    	statement.setInt(1, id);
    	
    	// Выполняем наш запрос, и он возвращает null, если строк в результате запроса нет
    	ResultSet results = statement.executeQuery();
    	if (!results.first())
        	return null;
 
    	// Заполняем объект Employee данными из 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> getAllEmployees(Connection connection) throws Exception {
    	// Создаем и выполняем запрос для получения сотрудников из таблицы
    	Statement statement = connection.createStatement();
    	ResultSet results = statement.executeQuery("SELECT * FROM employee");
 
    	ArrayList<Employee> list = new ArrayList<Employee>();
    	while (results.next()) {
            // Заполняем объект Employee данными из текущей строки 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;
    }

Айтганча, агар шу каби методлар кўп бўлса, ҳар бирида ResultSet сатрларини Employee объектига айлантириш учун бир хил код ёзишга тўғри келади. Шу сабабли бу кодни алоҳида методга чиқарса бўлади.

Бу жуда фойдали бўлиши мумкин, агар Employee класси Enum, InputStream каби мураккаб майдонларни ёки базада сақлашни хоҳлайдиган бошқа объектларга ҳаволаларни ўз ичига олса.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION