مثال Spring JdbcTemplate

Spring JdbcTemplate هي الفئة الأكثر أهمية في حزمة Spring JDBC.

Spring JdbcTemplate

  • تنتج JDBC الكثير من الشفرة القياسية، مثل فتح/إغلاق اتصال بقاعدة بيانات، ومعالجة استثناءات SQL وما إلى ذلك. إنه يجعل الشفرة ضخمة للغاية وصعبة القراءة.
  • تنفيذ JDBC في إطار Spring يهتم بالعمل مع العديد من العمليات على مستوى منخفض (فتح/إغلاق الاتصالات، تنفيذ استعلامات SQL، وما إلى ذلك).
  • بفضل هذا، عند العمل مع قاعدة البيانات في إطار Spring، نحتاج فقط إلى تحديد معلمات الاتصال من قاعدة البيانات وتسجيل الاستعلام الخاص بـ SQL، وبقية العمل يتم تنفيذه بواسطة Spring.
  • تحتوي JDBC في Spring على عدة فئات (عدة نهج) للتفاعل مع قاعدة البيانات. الأكثر شيوعًا من بينها هو استخدام فئة JdbcTemplate. هذه هي الفئة الأساسية التي تدير معالجة جميع الأحداث والاتصالات بقاعدة البيانات.
  • تنفذ فئة JdbcTemplate الاستعلامات SQL، وتتكرر عبر ResultSet وتسترد القيم المطلوبة، وتحدث التعليمات واستدعاءات الإجراءات، وتتعامل مع الاستثناءات وتترجمها إلى الاستثناءات المحددة في حزمة org.springframwork.dao.
  • حالات فئة JdbcTemplate هي آمنة للاستخدام في المواضيع المتعددة. هذا يعني أنه من خلال تكوين نسخة واحدة من فئة JdbcTemplate, يمكننا استخدامها في العديد من كائنات DAO.
  • عند استخدام JdbcTemplate, في معظم الأحيان يتم تكوينه في ملف تكوين Spring. بعد ذلك, يتم تنفيذه باستخدام الفئة الفرعية في فئات DAO.

مثال على JdbcTemplate في Spring

لنلقي نظرة على برنامج مثال على JdbcTemplate في Spring. أنا استخدم قاعدة بيانات Postgresql هنا, ولكن يمكنك استخدام أي قاعدة بيانات ذات صلة أخرى مثل MySQL و Oracle. كل ما تحتاجه هو تغيير تكوينات قاعدة البيانات ويجب أن يعمل. أولاً وقبل كل شيء, نحتاج إلى بعض البيانات التجريبية للعمل عليها. الاستعلامات SQL التالية ستنشئ جدولًا وتملأه ببعض البيانات لنستخدمها.

create table people (
id serial not null primary key,
first_name varchar(20) not null,
last_name varchar(20) not null,
age integer not null
);

insert into people (id, first_name, last_name, age) values
(1, 'Vlad', 'Boyarskiy', 21),
(2,'Oksi', ' Bahatskaya', 30),
(3,'Vadim', ' Vadimich', 32);

تظهر الصورة أدناه هيكلية المشروع النهائية في بيئة Eclipse.

تبعيات Maven لـ Spring JDBC

نحتاج إلى الاعتماديات التالية – spring-core، spring-context، spring-jdbc و postgresql. إذا كنت تستخدم قاعدة بيانات علاقية أخرى مثل MySQL ، فيرجى إضافة اعتماديات برنامج تشغيل Java المقابلة لها. هنا ملف pom.xml النهائي.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.journaldev.spring</groupId>
	<artifactId>JdbcTemplate</artifactId>
	<version>1.0-SNAPSHOT</version>
	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
		<postgres.version>42.1.4</postgres.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>${postgres.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.framework}</version>
		</dependency>
	</dependencies>

</project>

تكوين مصدر البيانات لـ Spring

الخطوة التالية هي إنشاء فئة تكوين Spring لتعريف كائن DataSource. أنا استخدم التكوين المبني على الجافا ، يمكنك أيضًا القيام بذلك باستخدام ملف تكوين الفول الربيع الخاص بالفئة.

package com.journaldev.spring.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ComponentScan("com.journaldev.spring")
@PropertySource("classpath:database.properties")
public class AppConfig {

	@Autowired
	Environment environment;

	private final String URL = "url";
	private final String USER = "dbuser";
	private final String DRIVER = "driver";
	private final String PASSWORD = "dbpassword";

	@Bean
	DataSource dataSource() {
		DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
		driverManagerDataSource.setUrl(environment.getProperty(URL));
		driverManagerDataSource.setUsername(environment.getProperty(USER));
		driverManagerDataSource.setPassword(environment.getProperty(PASSWORD));
		driverManagerDataSource.setDriverClassName(environment.getProperty(DRIVER));
		return driverManagerDataSource;
	}
}
  • @Configuration – يشير إلى أن هذه الفئة هي تكوين لسياق Spring.
  • @ComponentScan(“com.journaldev.spring”)- يحدد الحزمة التي سيتم مسحها للعثور على فئات المكونات.
  • @PropertySource(“classpath:database.properties”)- يشير إلى أن الخصائص ستتم قراءتها من ملف database.properties.

محتوى ملف database.properties معروض أدناه.

driver=org.postgresql.Driver
url=jdbc:postgresql://127.0.0.1:5432/school
dbuser=postgres
dbpassword=postgres

إذا كنت تستخدم MySQL أو قاعدة بيانات علاقية أخرى ، فيرجى تغيير التكوينات السابقة وفقًا لذلك.

فئات نموذج Spring JDBC

الخطوة التالية هي إنشاء فئات النموذج لتعيين جدول قاعدة البيانات الخاص بنا.

package com.journaldev.model;

public class Person {
	private Long id;
	private Integer age;
	private String firstName;
	private String lastName;

	public Person() {
	}

	public Person(Long id, Integer age, String firstName, String lastName) {
		this.id = id;
		this.age = age;
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
				+ '\'' + '}';
	}
}

لجلب البيانات من قاعدة البيانات ، نحتاج إلى تنفيذ واجهة RowMapper. تحتوي هذه الواجهة على طريقة واحدة فقط mapRow(ResultSet resultSet, int i) ، والتي ستعيد نسخة واحدة من فئة النموذج الخاصة بنا (مثل Person).

package com.journaldev.model;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class PersonMapper implements RowMapper<Person> {

	public Person mapRow(ResultSet resultSet, int i) throws SQLException {

		Person person = new Person();
		person.setId(resultSet.getLong("id"));
		person.setFirstName(resultSet.getString("first_name"));
		person.setLastName(resultSet.getString("last_name"));
		person.setAge(resultSet.getInt("age"));
		return person;
	}
}

فئات Spring JDBC DAO

الخطوة النهائية هي إنشاء فئات DAO لتعيين فئة النموذج الخاصة بنا إلى جدول قاعدة البيانات باستخدام استعلامات SQL. سنقوم أيضًا بتكوين مصدر البيانات باستخدام تعليق @Autowired وتعريف بعض واجهات البرمجة التطبيقية.

package com.journaldev.spring.dao;

import java.util.List;

import com.journaldev.model.Person;

public interface PersonDAO {
	Person getPersonById(Long id);

	List<Person> getAllPersons();

	boolean deletePerson(Person person);

	boolean updatePerson(Person person);

	boolean createPerson(Person person);
}
package com.journaldev.spring.dao;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import com.journaldev.model.Person;
import com.journaldev.model.PersonMapper;

@Component
public class PersonDAOImpl implements PersonDAO {

	JdbcTemplate jdbcTemplate;

	private final String SQL_FIND_PERSON = "select * from people where id = ?";
	private final String SQL_DELETE_PERSON = "delete from people where id = ?";
	private final String SQL_UPDATE_PERSON = "update people set first_name = ?, last_name = ?, age  = ? where id = ?";
	private final String SQL_GET_ALL = "select * from people";
	private final String SQL_INSERT_PERSON = "insert into people(id, first_name, last_name, age) values(?,?,?,?)";

	@Autowired
	public PersonDAOImpl(DataSource dataSource) {
		jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public Person getPersonById(Long id) {
		return jdbcTemplate.queryForObject(SQL_FIND_PERSON, new Object[] { id }, new PersonMapper());
	}

	public List<Person> getAllPersons() {
		return jdbcTemplate.query(SQL_GET_ALL, new PersonMapper());
	}

	public boolean deletePerson(Person person) {
		return jdbcTemplate.update(SQL_DELETE_PERSON, person.getId()) > 0;
	}

	public boolean updatePerson(Person person) {
		return jdbcTemplate.update(SQL_UPDATE_PERSON, person.getFirstName(), person.getLastName(), person.getAge(),
				person.getId()) > 0;
	}

	public boolean createPerson(Person person) {
		return jdbcTemplate.update(SQL_INSERT_PERSON, person.getId(), person.getFirstName(), person.getLastName(),
				person.getAge()) > 0;
	}
}

تم تأشير فئة PersonDAOImpl بتعليق @Component وفي هذه الفئة لدينا حقل بنوع JdbcTemplate. عند استدعاء بناء هذه الفئة ، سيتم حقن نسخة من DataSource فيها ويمكننا إنشاء نسخة من JdbcTemplate. بعد ذلك ، يمكننا استخدامه في طرقنا.

برنامج اختبار Spring JdbcTemplate

مشروعنا المثالي لنموذج JdbcTemplate للربيع جاهز، لنقم باختبار ذلك باستخدام فئة اختبار.

package com.journaldev;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.journaldev.model.Person;
import com.journaldev.spring.config.AppConfig;
import com.journaldev.spring.dao.PersonDAO;

public class Main {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		PersonDAO personDAO = context.getBean(PersonDAO.class);

		System.out.println("List of person is:");

		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		System.out.println("\nGet person with ID 2");

		Person personById = personDAO.getPersonById(2L);
		System.out.println(personById);

		System.out.println("\nCreating person: ");
		Person person = new Person(4L, 36, "Sergey", "Emets");
		System.out.println(person);
		personDAO.createPerson(person);
		System.out.println("\nList of person is:");

		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		System.out.println("\nDeleting person with ID 2");
		personDAO.deletePerson(personById);

		System.out.println("\nUpdate person with ID 4");

		Person pperson = personDAO.getPersonById(4L);
		pperson.setLastName("CHANGED");
		personDAO.updatePerson(pperson);

		System.out.println("\nList of person is:");
		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		context.close();
	}
}

الصورة أدناه توضح الناتج الذي يتم إنتاجه عند تنفيذ البرنامج أعلاه. ستختلف النتيجة بناءً على البيانات العينية وعلى التشغيل المتعدد، الفكرة هنا هي التعلم كيفية استخدام Spring JdbcTemplate من خلال برنامج مثال. هذا كل ما يتعلق بـ Spring JdbcTemplate، يمكنك تنزيل المشروع النهائي من الرابط أدناه.

تنزيل مشروع مثال Spring JdbcTemplate

المرجع: مستندات واجهة برمجة التطبيق

Source:
https://www.digitalocean.com/community/tutorials/spring-jdbctemplate-example