Spring JDBC - Saklanan Prosedürü Çağırma

Aşağıdaki örnek, Spring JDBC kullanılarak bir saklı yordamın nasıl çağrılacağını gösterecektir. Depolanmış bir yordamı çağırarak Öğrenci Tablosundaki mevcut kayıtlardan birini okuyacağız. Bir kimlik vereceğiz ve bir öğrenci kaydı alacağız.

Sözdizimi

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("getRecord");
SqlParameterSource in = new MapSqlParameterSource().addValue("in_id", id);
Map<String, Object> out = jdbcCall.execute(in);

Student student = new Student();
student.setId(id);
student.setName((String) out.get("out_name"));
student.setAge((Integer) out.get("out_age"));

Nerede,

  • jdbcCall - Saklanan bir yordamı temsil eden SimpleJdbcCall nesnesi.

  • in - Depolanmış yordama bir parametre iletmek için SqlParameterSource nesnesi.

  • student - Öğrenci nesnesi.

  • out - Depolanan yordam çağrısı sonucunun çıktısını temsil edecek harita nesnesi.

SimpleJdbcCallsınıf, GİRİŞ ve ÇIKIŞ parametreleriyle bir saklı yordamı çağırmak için kullanılabilir. Bu yaklaşımı Apache Derby, DB2, MySQL, Microsoft SQL Server, Oracle ve Sybase gibi RDBMS'lerden herhangi biri ile çalışırken kullanabilirsiniz.

Yaklaşımı anlamak için, öğrenci kimliğini alan ve OUT parametrelerini kullanarak karşılık gelen öğrencinin adını ve yaşını döndüren aşağıdaki MySQL saklı yordamı göz önünde bulundurun. MySQL komut istemini kullanarak bu saklı yordamı TEST veritabanında oluşturalım -

DELIMITER $$

DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$
CREATE PROCEDURE `TEST`.`getRecord` (
IN in_id INTEGER,
OUT out_name VARCHAR(20),
OUT out_age  INTEGER)
BEGIN
   SELECT name, age
   INTO out_name, out_age
   FROM Student where id = in_id;
END $$

DELIMITER ;

Spring JDBC ile ilgili yukarıda bahsedilen kavramları anlamak için, saklı yordamı çağıracak bir örnek yazalım. Örneğimizi yazmak için, yerinde çalışan bir Eclipse IDE'ye sahip olalım ve bir Spring uygulaması oluşturmak için aşağıdaki adımları kullanalım.

Adım Açıklama
1 Spring JDBC - First Application bölümünde oluşturulan öğrenci projesini güncelleyin .
2 Fasulye yapılandırmasını güncelleyin ve uygulamayı aşağıda açıklandığı gibi çalıştırın.

Veri Erişim Nesnesi arayüz dosyasının içeriği aşağıdadır StudentDAO.java.

package com.tutorialspoint;

import java.util.List;
import javax.sql.DataSource;

public interface StudentDAO {
   /** 
      * This is the method to be used to initialize
      * database resources ie. connection.
   */
   public void setDataSource(DataSource ds);
   
   /** 
      * This is the method to be used to list down
      * a record from the Student table corresponding
      * to a passed student id.
   */
   public Student getStudent(Integer id);  
}

Aşağıdakilerin içeriği Student.java dosya.

package com.tutorialspoint;

public class Student {
   private Integer age;
   private String name;
   private Integer id;

   public void setAge(Integer age) {
      this.age = age;
   }
   public Integer getAge() {
      return age;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getName() {
      return name;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public Integer getId() {
      return id;
   }
}

Aşağıdakilerin içeriği StudentMapper.java dosya.

package com.tutorialspoint;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}

Uygulama sınıfı dosyası aşağıdadır StudentJDBCTemplate.java tanımlı DAO arayüzü StudentDAO için.

package com.tutorialspoint;

import java.util.List;
import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

public class StudentJDBCTemplate implements StudentDAO {
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject;
   
   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
      this.jdbcTemplateObject = new JdbcTemplate(dataSource);
   }
   public Student getStudent(Integer id) {
      SimpleJdbcCall jdbcCall = new 
         SimpleJdbcCall(dataSource).withProcedureName("getRecord");

      SqlParameterSource in = new MapSqlParameterSource().addValue("in_id", id);
      Map<String, Object> out = jdbcCall.execute(in);

      Student student = new Student();
      student.setId(id);
      student.setName((String) out.get("out_name"));
      student.setAge((Integer) out.get("out_age"));
      return student;      
   }
}

Çağrının yürütülmesi için yazdığınız kod, IN parametresini içeren bir SqlParameterSource oluşturmayı içerir. Giriş değeri için sağlanan adı, saklı yordamda belirtilen parametre adıyla eşleştirmek önemlidir. Yürütme yöntemi, IN parametrelerini alır ve saklı yordamda belirtildiği gibi adla anahtarlanmış tüm çıkış parametrelerini içeren bir Harita döndürür.

Aşağıdakilerin içeriği MainApp.java dosya.

package com.tutorialspoint;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tutorialspoint.StudentJDBCTemplate;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate = 
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");
      
      Student student = studentJDBCTemplate.getStudent(1);
      System.out.print("ID : " + student.getId() );
      System.out.print(", Name : " + student.getName() );
      System.out.println(", Age : " + student.getAge()); 
   }
}

Yapılandırma dosyası aşağıdadır Beans.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

   <!-- Initialization for data source -->
   <bean id = "dataSource" 
      class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
      <property name = "url" value = "jdbc:mysql://localhost:3306/TEST"/>
      <property name = "username" value = "root"/>
      <property name = "password" value = "admin"/>
   </bean>

   <!-- Definition for studentJDBCTemplate bean -->
   <bean id = "studentJDBCTemplate" 
      class = "com.tutorialspoint.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource" />    
   </bean>
      
</beans>

Kaynak ve bean yapılandırma dosyalarını oluşturmayı tamamladığınızda uygulamayı çalıştırmamıza izin verin. Uygulamanızda her şey yolundaysa, aşağıdaki mesajı yazdıracaktır.

ID : 1, Name : Zara, Age : 11