Springjdbc-quick-guide

提供:Dev Guides
移動先:案内検索

Spring JDBC-概要

プレーンな古いJDBCを使用してデータベースを操作している間、例外を処理したり、データベース接続を開いたり閉じたりするために不要なコードを書くのは面倒です ただし、Spring JDBC Frameworkは、接続を開いて、SQLステートメントを準備して実行し、例外を処理し、トランザクションを処理し、最後に接続を閉じることから始めて、すべての低レベルの詳細を処理します。

必要なことは、接続パラメーターを定義して、実行するSQLステートメントを指定し、データベースからデータをフェッチしながら各反復で必要な作業を行うだけです。

Spring JDBCは、データベースとインターフェースするためのいくつかのアプローチとそれに対応する異なるクラスを提供します。 このチュートリアルでは、フレームワークのJDBCテンプレートクラスを使用する従来の最も一般的なアプローチを採用します。 これは、すべてのデータベース通信と例外処理を管理する中心的なフレームワーククラスです。

JDBCテンプレートクラス

JDBCテンプレートクラスは、SQLクエリを実行し、ステートメントとストアドプロシージャ呼び出しを更新し、ResultSetの反復処理と返されたパラメーター値の抽出を実行します。 また、JDBC例外をキャッチし、それらをorg.springframework.daoパッケージで定義された汎用のより有益な例外階層に変換します。

JDBC Templateクラスのインスタンスは、一度設定されるとスレッドセーフです。 したがって、JDBCテンプレートの単一のインスタンスを構成し、この共有参照を複数のDAOに安全に挿入できます。

JDBCテンプレートクラスを使用する際の一般的な方法は、Spring構成ファイルでDataSourceを構成し、その共有DataSource BeanをDAOクラスに依存性注入することです。 JDBCテンプレートは、DataSourceのセッターで作成されます。

データアクセスオブジェクト(DAO)

DAOは、データベースインタラクションに一般的に使用される*データアクセスオブジェクト*の略です。 DAOは、データベースにデータを読み書きする手段を提供するために存在し、アプリケーションの残りの部分がアクセスするインターフェイスを介してこの機能を公開する必要があります。

Springのデータアクセスオブジェクト(DAO)のサポートにより、JDBC、Hibernate、JPA、JDOなどのデータアクセステクノロジーを一貫した方法で簡単に操作できます。

Spring JDBC-環境設定

この章では、WindowsおよびLinuxベースのシステムでSpring-AOPを設定するプロセスについて説明します。 Spring AOPは、複雑なセットアップ手順なしでいくつかの簡単な手順を実行するだけで、現在のJava環境およびMAVENと簡単にインストールおよび統合できます。 インストール中にユーザー管理が必要です。

システム要求

JDK Java SE 2 JDK 1.5 or above
Memory 1 GB RAM (recommended)
Disk Space No minimum requirement
Operating System Version Windows XP or above, Linux

Spring AOPをインストールする手順に進みましょう。

ステップ1-Javaインストールの検証

まず、システムにJava Software Development Kit(SDK)をインストールする必要があります。 これを確認するには、作業しているプラ​​ットフォームに応じて、次の2つのコマンドのいずれかを実行します。

Javaインストールが適切に行われている場合、Javaインストールの現在のバージョンと仕様が表示されます。 サンプル出力を次の表に示します。

Platform Command Sample Output
Windows

Open command console and type −

  • \> java -version*

a

Javaバージョン「1.7.0_60」

Java(TM)SEランタイム環境(ビルド1.7.0_60-b19)

Java Hotspot(TM)64ビットサーバーVM(ビルド24.60-b09、混合モード)

Linux

Open command terminal and type −

  • $ java -version*

a

Javaバージョン "1.7.0_25"

JDKランタイム環境を開く(rhel-2.3.10.4.el6_4-x86_64)

JDK 64ビットサーバーVMを開く(ビルド23.7-b01、混合モード)

このチュートリアルの読者は、iシステムにJava SDKバージョン1.7.0_60がインストールされていると想定しています。 Java SDKがない場合は、https://www.oracle.com/technetwork/java/javase/downloads/indexlから現在のバージョンをダウンロードし、インストールしてください。

ステップ2-Java環境を設定する

Javaがマシンにインストールされているベースディレクトリの場所を指すように、環境変数JAVA_HOMEを設定します。 例えば、

Platform Description
Windows Set JAVA_HOME to C:\ProgramFiles\java\jdk1.7.0_60
Linux Export JAVA_HOME=/usr/local/java-current

Javaコンパイラの場所の完全パスをシステムパスに追加します。

Platform Description
Windows Append the String "C:\Program Files\Java\jdk1.7.0_60\bin" to the end of the system variable PATH.
Linux Export PATH=$PATH:$JAVA_HOME/bin/

上記で説明したように、コマンドプロンプトからコマンド java -version を実行します。

ステップ3-Mavenアーカイブのダウンロード

[[1]] 3.3.3をダウンロードします

OS Archive name
Windows apache-maven-3.3.3-bin.zip
Linux apache-maven-3.3.3-bin.tar.gz
Mac apache-maven-3.3.3-bin.tar.gz

ステップ4-Mavenアーカイブの抽出

Maven 3.3.3をインストールするディレクトリにアーカイブを抽出します。 サブディレクトリapache-maven-3.3.3がアーカイブから作成されます。

OS Location (can be different based on your installation)
Windows C:\Program Files\Apache Software Foundation\apache-maven-3.3.3
Linux /usr/local/apache-maven
Mac /usr/local/apache-maven

ステップ5-Maven環境変数を設定する

M2_HOME、M2、MAVEN_OPTSを環境変数に追加します。

OS Output
Windows

Set the environment variables using system properties.

M2_HOME = C:\ Program Files \ Apache Software Foundation \ apachemaven-3.3.3

M2 =%M2_HOME%\ bin

MAVEN_OPTS = -Xms256m -Xmx512m

Linux

Open command terminal and set environment variables.

export M2_HOME =/usr/local/apache-maven/apache-maven-3.3.3

export M2 = $ M2_HOME/bin

export MAVEN_OPTS = -Xms256m -Xmx512m

Mac

Open command terminal and set environment variables.

export M2_HOME =/usr/local/apache-maven/apache-maven-3.3.3

export M2 = $ M2_HOME/bin

export MAVEN_OPTS = -Xms256m -Xmx512m

ステップ6-Maven Binディレクトリの場所をシステムパスに追加する

次に、システムパスにM2変数を追加します。

OS Output
Windows Append the string ;%M2% to the end of the system variable, Path.
Linux export PATH = $M2:$PATH
Mac export PATH = $M2:$PATH

ステップ7-Mavenインストールの検証

コンソールを開き、次の mvn コマンドを実行します。

OS Task Command
Windows Open Command Console c:\> mvn --version
Linux Open Command Terminal $ mvn --version
Mac Open Terminal machine:< joseph$ mvn --version

最後に、上記のコマンドの出力を確認します。これは次のようになります-

OS Output
Windows

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:C:\ Program Files \ Apache Software Foundation \ apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:C:\ Program Files \ Java \ jdk1.7.0_75 \ jre

デフォルトロケール:en_US、プラットフォームエンコーディング:Cp1252

Linux

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:/usr/local/apache-maven/apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:/usr/local/java-current/jdk1.7.0_75/jre

Mac

Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17:27:37+05:30)

Mavenホーム:/usr/local/apache-maven/apache-maven-3.3.3

Javaバージョン:1.7.0_75、ベンダー:Oracle Corporation

Javaホーム:/Library/Java/Home/jdk1.7.0_75/jre

ステップ8-Eclipse IDEのセットアップ

このチュートリアルのすべての例は、Eclipse IDEを使用して作成されています。 したがって、最新バージョンのEclipseをマシンにインストールすることをお勧めします。

Eclipse IDEをインストールするには、https://www.eclipse.org/downloads/から最新のEclipseバイナリをダウンロードします。 インストールをダウンロードしたら、バイナリ配布物を便利な場所に解凍します。 たとえば、WindowsではC:\ eclipse、Linux/Unixでは/usr/local/eclipseにあります。 最後に、PATH変数を適切に設定します。

Eclipseは、Windowsマシンで次のコマンドを実行することによって開始できます。または、eclipse.exeをダブルクリックするだけです。

%C:\eclipse\eclipse.exe

Eclipseは、Unix(Solaris、Linuxなど)マシンで次のコマンドを実行することで開始できます。

$/usr/local/eclipse/eclipse

正常に起動した後、すべてが正常であれば、次の結果が表示されます。

Eclipseホームページ

この最後の手順が完了したら、次の章で説明する最初のJDBCの例に進む準備ができています。

Spring JDBC-データソースの設定

データベース TEST にデータベーステーブル Student を作成しましょう。 MySQLデータベースを使用していると仮定します。他のデータベースを使用している場合は、それに応じてDDLおよびSQLクエリを変更できます。

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

次に、データベースアクセスを取得するように自身を構成できるように、JDBCテンプレートにDataSourceを提供する必要があります。 あなたは、次のように示されているコードの一部でXMLファイルのデータソースを設定することができます-

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

次の章では、構成されたデータベースを使用して最初のアプリケーションを作成します。

Spring JDBC-最初のアプリケーション

JDBC Templateクラスを使用したSpring JDBCフレームワークに関連する概念を理解するために、次のStudentテーブルでInsert操作とRead操作を実装する簡単な例を作成しましょう。

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

JDBCの概念を示す、シンプルなコンソールベースのSpring JDBCアプリケーションの作成に進みましょう。

プロジェクトを作成

コマンドコンソールを開き、C:\ MVNディレクトリに移動して、次の mvn コマンドを実行します。

C:\MVN>mvn archetype:generate -DgroupId = com.finddevguides -DartifactId = Student
   -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

Mavenは処理を開始し、完全なJavaアプリケーションプロジェクト構造を作成します。

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources
@ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --
-
[INFO] Generating project in Batch mode
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.1 KB/s
ec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.2 KB/
sec)
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
 maven-archetype-quickstart:1.0
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.finddevguides
[INFO] Parameter: packageName, Value: com.finddevguides
[INFO] Parameter: package, Value: com.finddevguides
[INFO] Parameter: artifactId, Value: Student
[INFO] Parameter: basedir, Value: C:\MVN
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\MVN\Student
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:17 min
[INFO] Finished at: 2017-02-19T21:11:14+05:30
[INFO] Final Memory: 15M/114M
[INFO] ------------------------------------------------------------------------

C:/MVNディレクトリに移動します。 studentという名前で作成されたJavaアプリケーションプロジェクトが表示されます(artifactIdで指定)。 POM.xmlを更新して、Spring JDBC依存関係を含めます。 Student.java、StudentMapper.java、MainApp.java、StudentDAO.java、およびStudentJDBCTemplate.javaファイルを追加します。

POM.xml

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/maven-v4_0_0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>com.finddevguides</groupId>
   <artifactId>Student</artifactId>
   <packaging>jar</packaging>
   <version>1.0-SNAPSHOT</version>
   <name>Student</name>
   <url>http://maven.apache.org</url>

   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>4.1.0.RELEASE</version>
      </dependency>

      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>4.1.4.RELEASE</version>
      </dependency>
   </dependencies>

</project>

以下は、データアクセスオブジェクトインターフェイスファイル* StudentDAO.java。*の内容です。

package com.finddevguides;

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 create
 *a record in the Student table.
  */
   public void create(String name, Integer age);
   public Student getStudent(Integer id);

  /* *
    * This is the method to be used to list down
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 void create(String name, Integer age) {
      String SQL = "insert into Student (name, age) values (?, ?)";

      jdbcTemplateObject.update( SQL, name, age);
      System.out.println("Created Record Name = " + name + " Age = " + age);
      return;
   }
   public List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate = (StudentJDBCTemplate)
         context.getBean("studentJDBCTemplate");

      System.out.println("------Records Creation--------" );
      studentJDBCTemplate.create("Zara", 11);
      studentJDBCTemplate.create("Nuha", 2);
      studentJDBCTemplate.create("Ayan", 15);

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Records Creation--------
Created Record Name = Zara Age = 11
Created Record Name = Nuha Age = 2
Created Record Name = Ayan Age = 15
------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15

Spring JDBC-クエリの作成

次の例は、Spring JDBCの助けを借りて挿入クエリを使用してクエリを作成する方法を示します。 Student Tableにいくつかのレコードを挿入します。

構文

String insertQuery = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( insertQuery, name, age);

どこで、

  • insertQuery -プレースホルダーを持つクエリを挿入します。
  • jdbcTemplateObject -データベースに学生オブジェクトを挿入するStudentJDBCTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを挿入する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 create
 *a record in the Student table.
  */
   public void create(String name, Integer age);

  /* *
     * This is the method to be used to list down
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 void create(String name, Integer age) {
      String insertQuery = "insert into Student (name, age) values (?, ?)";
      jdbcTemplateObject.update( insertQuery, name, age);
      System.out.println("Created Record Name = " + name + " Age = " + age);
      return;
   }
   public List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Records Creation--------" );
      studentJDBCTemplate.create("Zara", 11);
      studentJDBCTemplate.create("Nuha", 2);
      studentJDBCTemplate.create("Ayan", 15);

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Records Creation--------
Created Record Name = Zara Age = 11
Created Record Name = Nuha Age = 2
Created Record Name = Ayan Age = 15
------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15

Spring JDBC-読み取りクエリ

次の例では、Spring JDBCを使用してクエリを読み取る方法を示します。 Student Tableで利用可能なレコードを読み取ります。

構文

String selectQuery = "select * from Student";
List <Student> students = jdbcTemplateObject.query(selectQuery, new StudentMapper());

どこで、

  • selectQuery -学生を読むためのクエリを選択します。
  • jdbcTemplateObject -データベースから学生オブジェクトを読み取るStudentJDBCTemplateオブジェクト。
  • StudentMapper -StudentMapperは、取得した各レコードを学生オブジェクトにマップするRowMapperオブジェクトです。

Spring JDBCに関連する上記の概念を理解するために、クエリを選択する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15

Spring JDBC-クエリの更新

次の例は、Spring JDBCを使用してクエリを更新する方法を示します。 Student Tableの利用可能なレコードを更新します。

構文

String updateQuery = "update Student set age = ? where id = ?";
jdbcTemplateObject.update(updateQuery, age, id);

どこで、

  • updateQuery -クエリを更新してプレースホルダーで学生を更新します。
  • jdbcTemplateObject -データベース内の学生オブジェクトを更新するStudentJDBCTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 update
 *a record into the Student table.
  */
   public void update(Integer id, Integer age);

  /* *
     * 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);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 void update(Integer id, Integer age){
      String SQL = "update Student set age = ? where id = ?";
      jdbcTemplateObject.update(SQL, age, id);
      System.out.println("Updated Record with ID = " + id );
      return;
   }
   public Student getStudent(Integer id) {
      String SQL = "select * from Student where id = ?";
      Student student = jdbcTemplateObject.queryForObject(
         SQL, new Object[]{id}, new StudentMapper());

      return student;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("----Updating Record with ID = 2 -----" );
      studentJDBCTemplate.update(2, 20);

      System.out.println("----Listing Record with ID = 2 -----" );
      Student student = studentJDBCTemplate.getStudent(2);
      System.out.print("ID : " + student.getId() );
      System.out.print(", Name : " + student.getName() );
      System.out.println(", Age : " + student.getAge());
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

----Updating Record with ID = 2 -----
Updated Record with ID = 2
----Listing Record with ID = 2 -----
ID : 2, Name : Nuha, Age : 20

Spring JDBC-クエリの削除

次の例は、Spring JDBCを使用してクエリを削除する方法を示しています。 Student Tableで利用可能なレコードの1つを削除します。

構文

String deleteQuery = "delete from Student where id = ?";
jdbcTemplateObject.update(deleteQuery, id);

どこで、

  • deleteQuery -プレースホルダーを持つ学生を削除するクエリを削除します。
  • jdbcTemplateObject -データベース内の学生オブジェクトを削除するStudentJDBCTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを削除する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();

  /* *
     * This is the method to be used to delete
 *a record from the Student table corresponding
     * to a passed student id.
   */
   public void delete(Integer id);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
   public void delete(Integer id){
      String SQL = "delete from Student where id = ?";
      jdbcTemplateObject.update(SQL, id);
      System.out.println("Deleted Record with ID = " + id );
      return;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("----Delete Record with ID = 2 -----" );
      studentJDBCTemplate.delete(2);

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource"  ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

----Updating Record with ID = 2 -----
Updated Record with ID = 2
----Listing Record with ID = 2 -----
ID : 2, Name : Nuha, Age : 20

Spring JDBC-ストアドプロシージャの呼び出し

次の例では、Spring JDBCを使用してストアドプロシージャを呼び出す方法を示します。 ストアドプロシージャを呼び出して、Student Tableで利用可能なレコードの1つを読み取ります。 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"));

どこで、

  • jdbcCall -ストアドプロシージャを表すSimpleJdbcCallオブジェクト。

  • in -ストアドプロシージャにパラメーターを渡すSqlParameterSourceオブジェクト。

  • 学生-学生オブジェクト。

  • out -ストアドプロシージャコールの結果の出力を表すオブジェクトをマップします。

    *SimpleJdbcCall* クラスを使用して、INパラメータとOUTパラメータを使用してストアドプロシージャを呼び出すことができます。 Apache Derby、DB2、MySQL、Microsoft SQL Server、Oracle、SybaseなどのRDBMSのいずれかを使用しながら、このアプローチを使用できます。

アプローチを理解するには、次のMySQLストアドプロシージャを検討します。これは、学生IDを取得し、OUTパラメータを使用して対応する学生の名前と年齢を返します。 MySQLコマンドプロンプトを使用してTESTデータベースにこのストアドプロシージャを作成しましょう-

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に関連する上記の概念を理解するために、ストアドプロシージャを呼び出す例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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

呼び出しの実行用に記述するコードには、INパラメーターを含むSqlParameterSourceの作成が含まれます。 入力値に指定された名前を、ストアドプロシージャで宣言されたパラメーター名と一致させることが重要です。 executeメソッドはINパラメータを受け取り、ストアドプロシージャで指定された名前でキー設定された出力パラメータを含むMapを返します。

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.finddevguides.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());
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Name : Zara, Age : 11

Spring JDBC-ストアド関数の呼び出し

次の例では、Spring JDBCを使用してストアド関数を呼び出す方法を示します。 ストアド関数を呼び出して、Student Tableで利用可能なレコードの1つを読み取ります。 IDを渡し、学生名を受け取ります。

構文

SimpleJdbcCall jdbcCall = new
   SimpleJdbcCall(dataSource).withFunctionName("get_student_name");

SqlParameterSource in = new MapSqlParameterSource().addValue("in_id", id);
String name = jdbcCall.executeFunction(String.class, in);

Student student = new Student();
student.setId(id);
student.setName(name);

どこで、

  • in -パラメータをストアド関数に渡すSqlParameterSourceオブジェクト。

  • jdbcCall -ストアド関数を表すSimpleJdbcCallオブジェクト。

  • jdbcTemplateObject -データベースから呼び出されたストアド関数へのStudentJDBCTemplateオブジェクト。

  • 学生-学生オブジェクト。

    *SimpleJdbcCall* クラスを使用して、INパラメーターと戻り値を使用してストアド関数を呼び出すことができます。 Apache Derby、DB2、MySQL、Microsoft SQL Server、Oracle、SybaseなどのRDBMSのいずれかを使用しながら、このアプローチを使用できます。

アプローチを理解するには、次のMySQLストアドプロシージャを検討してください。これは、学生IDを取得し、対応する学生の名前を返します。 MySQLコマンドプロンプトを使用して、TESTデータベースにこのストアド関数を作成しましょう-

DELIMITER $$

DROP FUNCTION IF EXISTS `TEST`.`get_student_name` $$
CREATE FUNCTION `get_student_name` (in_id INTEGER)
RETURNS varchar(200)
BEGIN
DECLARE out_name VARCHAR(200);
   SELECT name
   INTO out_name
   FROM Student where id = in_id;

RETURN out_name;

DELIMITER ;

Spring JDBCに関連する上記の概念を理解するために、ストアド関数を呼び出す例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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).withFunctionName("get_student_name");

      SqlParameterSource in = new MapSqlParameterSource().addValue("in_id", id);
      String name = jdbcCall.executeFunction(String.class, in);
      Student student = new Student();
      student.setId(id);
      student.setName(name);
      return student;
   }
}

呼び出しの実行用に記述するコードには、INパラメーターを含むSqlParameterSourceの作成が含まれます。 入力値に指定された名前を、ストアド関数で宣言されたパラメーター名と一致させることが重要です。 executeFunctionメソッドは、INパラメーターを受け取り、保存された関数で指定された文字列を返します。

以下は MainApp.java ファイルの内容です

package com.finddevguides;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.finddevguides.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() );
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Name : Zara

Spring JDBC-BLOBの処理

次の例は、Spring JDBCの助けを借りて、更新クエリを使用してBLOBを更新する方法を示します。 Student Tableの利用可能なレコードを更新します。

学生テーブル

CREATE TABLE Student(
   ID INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   IMAGE BLOB,
   PRIMARY KEY (ID)
);

構文

MapSqlParameterSource in = new MapSqlParameterSource();
in.addValue("id", id);
in.addValue("image",  new SqlLobValue(new ByteArrayInputStream(imageData),
   imageData.length, new DefaultLobHandler()), Types.BLOB);

String SQL = "update Student set image = :image where id = :id";
NamedParameterJdbcTemplate jdbcTemplateObject = new NamedParameterJdbcTemplate(dataSource);
jdbcTemplateObject.update(SQL, in);

どこで、

  • in -クエリを更新するパラメータを渡すSqlParameterSourceオブジェクト。
  • SqlLobValue -SQL BLOB/CLOB値パラメーターを表すオブジェクト。
  • jdbcTemplateObject -データベース内の学生オブジェクトを更新するNamedParameterJdbcTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 update
 *a record into the Student table.
  */
   public void updateImage(Integer id, byte[] imageData);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

public class Student {
   private Integer age;
   private String name;
   private Integer id;
   private byte[] image;

   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;
   }
   public byte[] getImage() {
      return image;
   }
   public void setImage(byte[] image) {
      this.image = image;
   }
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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"));
      student.setImage(rs.getBytes("image"));
      return student;
   }
}

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.SqlLobValue;
import org.springframework.jdbc.support.lob.DefaultLobHandler;

import java.io.ByteArrayInputStream;
import java.sql.Types;

public class StudentJDBCTemplate implements StudentDAO {
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject;

   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
   }
   public void updateImage(Integer id, byte[] imageData) {
      MapSqlParameterSource in = new MapSqlParameterSource();
      in.addValue("id", id);
      in.addValue("image",  new SqlLobValue(new ByteArrayInputStream(imageData),
         imageData.length, new DefaultLobHandler()), Types.BLOB);

      String SQL = "update Student set image = :image where id = :id";
      NamedParameterJdbcTemplate jdbcTemplateObject = new
         NamedParameterJdbcTemplate(dataSource);

      jdbcTemplateObject.update(SQL, in);
      System.out.println("Updated Record with ID = " + id );
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      byte[] imageData = {0,1,0,8,20,40,95};
      studentJDBCTemplate.updateImage(1, imageData);
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Updated Record with ID = 1

データベースにクエリを実行して、格納されているbyte []を確認できます。

Spring JDBC-CLOBの処理

次の例では、Spring JDBCの助けを借りて、更新クエリを使用してCLOBを更新する方法を示します。 Student Tableの利用可能なレコードを更新します。

学生テーブル

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   DESCRIPTION LONGTEXT,
   PRIMARY KEY (ID)
);

構文

MapSqlParameterSource in = new MapSqlParameterSource();
in.addValue("id", id);
in.addValue("description",  new SqlLobValue(
   description, new DefaultLobHandler()), Types.CLOB);

String SQL = "update Student set description = :description where id = :id";
NamedParameterJdbcTemplate jdbcTemplateObject = new NamedParameterJdbcTemplate(dataSource);

jdbcTemplateObject.update(SQL, in);

どこで、

  • in -クエリを更新するパラメータを渡すSqlParameterSourceオブジェクト。
  • SqlLobValue -SQL BLOB/CLOB値パラメーターを表すオブジェクト。
  • jdbcTemplateObject -データベース内の学生オブジェクトを更新するNamedParameterJdbcTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 update
 *a record into the Student table.
  */
   public void updateDescription(Integer id, String description);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

   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;
   }
   public String getDescription() {
      return description;
   }
   public void setDescription(String description) {
      this.description = description;
   }
}

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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"));
      student.setDescription(rs.getString("description"));
      return student;
   }
}

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.SqlLobValue;
import org.springframework.jdbc.support.lob.DefaultLobHandler;

import java.io.ByteArrayInputStream;
import java.sql.Types;

public class StudentJDBCTemplate implements StudentDAO {
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject;

   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
   }
   public void updateDescription(Integer id, String description) {
      MapSqlParameterSource in = new MapSqlParameterSource();
      in.addValue("id", id);
      in.addValue("description",  new SqlLobValue(description,
         new DefaultLobHandler()), Types.CLOB);

      String SQL = "update Student set description = :description where id = :id";
      NamedParameterJdbcTemplate jdbcTemplateObject = new
         NamedParameterJdbcTemplate(dataSource);

      jdbcTemplateObject.update(SQL, in);
      System.out.println("Updated Record with ID = " + id );
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      studentJDBCTemplate.updateDescription(1,
         "This can be a very long text upto 4 GB of size.");
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Updated Record with ID = 1

データベースにクエリを実行して、保存されている説明を確認できます。

Spring JDBC-バッチ操作

次の例は、Spring JDBCを使用してバッチ更新を行う方法を示します。 1回のバッチ操作でStudentテーブルの利用可能なレコードを更新します。

構文

String SQL = "update Student set age = ? where id = ?";
int[] updateCounts = jdbcTemplateObject.batchUpdate(SQL,
   new BatchPreparedStatementSetter() {

   public void setValues(PreparedStatement ps, int i) throws SQLException {
      ps.setInt(1, students.get(i).getAge());
      ps.setInt(2, students.get(i).getId());
   }
   public int getBatchSize() {
      return students.size();
   }
});

どこで、

  • SQL -クエリを更新して、学生の年齢を更新します。
  • jdbcTemplateObject -データベースの学生オブジェクトを更新するStudentJDBCTemplateオブジェクト。
  • BatchPreparedStatementSetter -バッチエグゼキュータ、オブジェクトスチューデントおよびインデックスiのリストによって識別されるアイテムごとにPerparedStatementの値を設定します。 getBatchSize()は、バッチのサイズを返します。
  • updateCounts -更新クエリごとの更新された行カウントを含むInt配列。

Spring JDBCに関連する上記の概念を理解するために、バッチ操作を更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();

   public void batchUpdate(final List<Student> students);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import java.sql.SQLException;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL,
                                new StudentMapper());
      return students;
   }
   public void batchUpdate(final List<Student> students){
      String SQL = "update Student set age = ? where id = ?";
      int[] updateCounts = jdbcTemplateObject.batchUpdate(SQL,
         new BatchPreparedStatementSetter() {

         public void setValues(PreparedStatement ps, int i) throws SQLException {
            ps.setInt(1, students.get(i).getAge());
            ps.setInt(2, students.get(i).getId());
         }
         public int getBatchSize() {
            return students.size();
         }
      });
      System.out.println("Records updated!");
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      List<Student> initialStudents = studentJDBCTemplate.listStudents();
      System.out.println("Initial Students");

      for(Student student2: initialStudents){
         System.out.print("ID : " + student2.getId() );
         System.out.println(", Age : " + student2.getAge());
      }

      Student student = new Student();
      student.setId(1);
      student.setAge(10);

      Student student1 = new Student();
      student1.setId(3);
      student1.setAge(10);

      List<Student> students = new ArrayList<Student>();
      students.add(student);
      students.add(student1);

      studentJDBCTemplate.batchUpdate(students);

      List<Student> updatedStudents = studentJDBCTemplate.listStudents();
      System.out.println("Updated Students");

      for(Student student3: updatedStudents){
         System.out.print("ID : " + student3.getId() );
         System.out.println(", Age : " + student3.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Initial Students
ID : 1, Age : 11
ID : 3, Age : 15
Records updated!
Updated Students
ID : 1, Age : 10
ID : 3, Age : 10

Spring JDBC-オブジェクトのバッチ操作

次の例では、Spring JDBCのオブジェクトを使用してバッチ更新を行う方法を示します。 1回のバッチ操作でStudentテーブルの利用可能なレコードを更新します。

構文

String SQL = "update Student set age = :age where id = :id";
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(students.toArray());

NamedParameterJdbcTemplate jdbcTemplateObject = new NamedParameterJdbcTemplate(dataSource);

int[] updateCounts = jdbcTemplateObject.batchUpdate(SQL,batch);
System.out.println("records updated!");

どこで、

  • SQL -クエリを更新して、学生の年齢を更新します。
  • jdbcTemplateObject -データベースの学生オブジェクトを更新するStudentJDBCTemplateオブジェクト。
  • batch -オブジェクトのバッチを表すSqlParameterSourceオブジェクト。
  • updateCounts -更新クエリごとの更新された行カウントを含むInt配列。

Spring JDBCに関連する上記の概念を理解するために、バッチ操作を更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();

   public void batchUpdate(final List<Student> students);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
   public void batchUpdate(final List<Student> students){
      String SQL = "update Student set age = :age where id = :id";
      SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(students.toArray());
      NamedParameterJdbcTemplate jdbcTemplateObject = new
         NamedParameterJdbcTemplate(dataSource);

      int[] updateCounts = jdbcTemplateObject.batchUpdate(SQL,batch);
      System.out.println("Records updated!");
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      List<Student> initialStudents = studentJDBCTemplate.listStudents();
      System.out.println("Initial Students");

      for(Student student2: initialStudents){
         System.out.print("ID : " + student2.getId() );
         System.out.println(", Age : " + student2.getAge());
      }
      Student student = new Student();
      student.setId(1);
      student.setAge(15);

      Student student1 = new Student();
      student1.setId(3);
      student1.setAge(16);

      List<Student> students = new ArrayList<Student>();
      students.add(student);
      students.add(student1);

      studentJDBCTemplate.batchUpdate(students);

      List<Student> updatedStudents = studentJDBCTemplate.listStudents();
      System.out.println("Updated Students");

      for(Student student3: updatedStudents){
         System.out.print("ID : " + student3.getId() );
         System.out.println(", Age : " + student3.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Initial Students
ID : 1, Age : 10
ID : 3, Age : 10
Records updated!
Updated Students
ID : 1, Age : 15
ID : 3, Age : 16

Spring JDBC-複数バッチ操作

次の例では、Spring JDBCを使用して1回の呼び出しで複数のバッチ更新を行う方法を示します。 バッチサイズが1である複数のバッチ操作で、Studentテーブルの使用可能なレコードを更新します。

構文

String SQL = "update Student set age = ? where id = ?";
int[][] updateCounts = jdbcTemplateObject.batchUpdate(SQL,students,1,
   new ParameterizedPreparedStatementSetter<Student>() {

   public void setValues(PreparedStatement ps, Student student)
      throws SQLException {
      ps.setInt(1, student.getAge());
      ps.setInt(2, student.getId());
   }
});

どこで、

  • SQL -クエリを更新して、学生の年齢を更新します。
  • jdbcTemplateObject -データベース内の学生オブジェクトを更新するStudentJDBCTemplateオブジェクト。
  • ParameterizedPreparedStatementSetter -バッチエグゼキュータ、オブジェクトstudentのリストによって識別されるアイテムごとにPerparedStatementに値を設定します。
  • updateCounts -バッチごとの更新クエリごとに更新された行数を含むInt [] []配列。

Spring JDBCに関連する上記の概念を理解するために、複数のバッチ操作を更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();

   public void batchUpdate(final List<Student> students);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;

import java.sql.SQLException;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
   public void batchUpdate(final List<Student> students){
      String SQL = "update Student set age = ? where id = ?";
      int[][] updateCounts = jdbcTemplateObject.batchUpdate(SQL,students,1,
         new ParameterizedPreparedStatementSetter<Student>() {

         public void setValues(PreparedStatement ps, Student student)
            throws SQLException {
            ps.setInt(1, student.getAge());
            ps.setInt(2, student.getId());
         }
      });
      System.out.println("Records updated!");
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      List<Student> initialStudents = studentJDBCTemplate.listStudents();
      System.out.println("Initial Students");

      for(Student student2: initialStudents){
         System.out.print("ID : " + student2.getId() );
         System.out.println(", Age : " + student2.getAge());
      }

      Student student = new Student();
      student.setId(1);
      student.setAge(17);

      Student student1 = new Student();
      student1.setId(3);
      student1.setAge(18);

      List<Student> students = new ArrayList<Student>();
      students.add(student);
      students.add(student1);
      studentJDBCTemplate.batchUpdate(students);

      List<Student> updatedStudents = studentJDBCTemplate.listStudents();
      System.out.println("Updated Students");

      for(Student student3: updatedStudents){
         System.out.print("ID : " + student3.getId() );
         System.out.println(", Age : " + student3.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Initial Students
ID : 1, Age : 15
ID : 3, Age : 16
records updated!
Updated Students
ID : 1, Age : 17
ID : 3, Age : 18

Spring JDBC-JdbcTemplateクラス

*org.springframework.jdbc.core.JdbcTemplate* クラスは、JDBCコアパッケージの中心的なクラスです。 JDBCの使用を簡素化し、一般的なエラーの回避に役立ちます。 コアJDBCワークフローを実行し、アプリケーションコードを残してSQLを提供し、結果を抽出します。 このクラスは、SQLクエリまたは更新を実行し、ResultSetの反復を開始し、JDBC例外をキャッチし、それらを *org.springframework.dao* パッケージで定義された汎用のより有益な例外階層に変換します。

クラス宣言

以下は、org.springframework.jdbc.core.JdbcTemplateクラスの宣言です-

public class JdbcTemplate
   extends JdbcAccessor
      implements JdbcOperations

使用法

  • ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • ステップ2 *-JdbcTemplateオブジェクトメソッドを使用して、データベース操作を行います。

次の例は、JdbcTemplateクラスを使用してクエリを読み取る方法を示します。 Student Tableの利用可能なレコードを読み取ります。

構文

String selectQuery = "select * from Student";
List <Student> students = jdbcTemplateObject.query(selectQuery, new StudentMapper());

どこで、

  • selectQuery -学生を読むためのクエリを選択します。
  • jdbcTemplateObject -データベースから学生オブジェクトを読み取るStudentJDBCTemplateオブジェクト。
  • StudentMapper -StudentMapperは、取得した各レコードを学生オブジェクトにマップするRowMapperオブジェクトです。

Spring JDBCに関連する上記の概念を理解するために、クエリを選択する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15

PreparedStatementSetterインターフェイス

*org.springframework.jdbc.core.PreparedStatementSetter* インターフェースは、JdbcTemplateクラスで使用される一般的なコールバックインターフェースとして機能します。 このインターフェイスは、同じSQLを使用したバッチ内の多数の更新ごとに、JdbcTemplateクラスによって提供されるPreparedStatementの値を設定します。

実装は、必要なパラメータを設定する責任があります。 プレースホルダー付きのSQLは既に提供されています。 PreparedStatementCreatorよりもこのインターフェイスを使用する方が簡単です。 JdbcTemplateはPreparedStatementを作成し、コールバックはパラメーター値の設定のみを担当します。

インターフェイス宣言

以下は、org.springframework.jdbc.core.PreparedStatementSetterインターフェイスの宣言です-

public interface PreparedStatementSetter

使用法

  • ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • ステップ2 *-JdbcTemplateオブジェクトメソッドを使用してデータベース操作を行い、PreparedStatementSetterオブジェクトを渡してクエリのプレースホルダーを置き換えます。

次の例は、JdbcTemplateクラスとPreparedStatementSetterインターフェイスを使用してクエリを読み取る方法を示します。 Student Tableで学生の利用可能な記録を読み取ります。

構文

final String SQL = "select * from Student where id = ? ";
List <Student> students = jdbcTemplateObject.query(
   SQL, new PreparedStatementSetter() {

   public void setValues(PreparedStatement preparedStatement) throws SQLException {
      preparedStatement.setInt(1, id);
   }
},
new StudentMapper());

どこで、

  • SQL -学生を読むためのクエリを選択します。
  • jdbcTemplateObject -データベースから学生オブジェクトを読み取るStudentJDBCTemplateオブジェクト。
  • PreparedStatementSetter -クエリでパラメーターを設定するPreparedStatementSetterオブジェクト。
  • StudentMapper -StudentMapperは、取得した各レコードを学生オブジェクトにマップするRowMapperオブジェクトです。

Spring JDBCに関連する上記の概念を理解するために、クエリを選択する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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(final Integer id) {
      final String SQL = "select * from Student where id = ? ";
      List <Student> students = jdbcTemplateObject.query(
         SQL, new PreparedStatementSetter() {

         public void setValues(PreparedStatement preparedStatement) throws SQLException {
            preparedStatement.setInt(1, id);
         }
      },
      new StudentMapper());
      return students.get(0);
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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.println(", Age : " + student.getAge());
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Age : 17

Spring JDBC-ResultSetExtractorインターフェース

*org.springframework.jdbc.core.ResultSetExtractor* インターフェースは、JdbcTemplateのクエリメソッドで使用されるコールバックインターフェースです。 このインターフェイスの実装は、ResultSetから結果を抽出する実際の作業を実行しますが、例外処理を心配する必要はありません。

SQLExceptionsは、呼び出し側のJdbcTemplateによってキャッチおよび処理されます。 このインターフェイスは、主にJDBCフレームワーク自体で使用されます。 通常、RowMapperはResultSet処理のためのより単純な選択であり、ResultSet全体に対して1つの結果オブジェクトではなく、行ごとに1つの結果オブジェクトをマッピングします。

インターフェイス宣言

以下は、org.springframework.jdbc.core.ResultSetExtractorインターフェイスの宣言です-

public interface ResultSetExtractor

使用法

  • ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • ステップ2 *-ResultSetExtractorを使用して結果セットを解析しながら、JdbcTemplateオブジェクトメソッドを使用してデータベース操作を行います。

次の例は、JdbcTemplateクラスとResultSetExtractorインターフェイスを使用してクエリを読み取る方法を示します。 Student Tableで学生の利用可能な記録を読み取ります。

構文

public List<Student> listStudents() {
   String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL,
         new ResultSetExtractor<List<Student>>(){

         public List<Student> extractData(
            ResultSet rs) throws SQLException, DataAccessException {

            List<Student> list = new ArrayList<Student>();
            while(rs.next()){
               Student student = new Student();
               student.setId(rs.getInt("id"));
               student.setName(rs.getString("name"));
               student.setAge(rs.getInt("age"));
               student.setDescription(rs.getString("description"));
               student.setImage(rs.getBytes("image"));
               list.add(student);
            }
            return list;
         }
      });
   return students;
}

どこで、

  • SQL -学生を読むためのクエリを選択します。
  • jdbcTemplateObject -データベースから学生オブジェクトを読み取るStudentJDBCTemplateオブジェクト。
  • ResultSetExtractor -結果セットオブジェクトを解析するResultSetExtractorオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを選択する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import java.util.ArrayList;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL,
         new ResultSetExtractor<List<Student>>(){

         public List<Student> extractData(
            ResultSet rs) throws SQLException, DataAccessException {

            List<Student> list = new ArrayList<Student>();
            while(rs.next()){
               Student student = new Student();
               student.setId(rs.getInt("id"));
               student.setName(rs.getString("name"));
               student.setAge(rs.getInt("age"));
               student.setDescription(rs.getString("description"));
               student.setImage(rs.getBytes("image"));
               list.add(student);
            }
            return list;
         }
      });
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context =
         new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      List<Student> students = studentJDBCTemplate.listStudents();

      for(Student student: students){
         System.out.print("ID : " + student.getId() );
         System.out.println(", Age : " + student.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Age : 17
ID : 3, Age : 18

Spring JDBC-RowMapperインターフェース

*org.springframework.jdbc.core.RowMapper <T>* インターフェースは、JdbcTemplateがResultSetの行を行ごとにマッピングするために使用します。 このインターフェイスの実装は、各行を結果オブジェクトにマッピングする実際の作業を実行します。 スローされたものがJdbcTemplateの呼び出しによってキャッチおよび処理される場合は、SQLExceptions。

インターフェイス宣言

以下は org.springframework.jdbc.core.RowMapper <T> インターフェイスの宣言です-

public interface RowMapper<T>

使用法

  • ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • ステップ2 *-RowMapperインターフェイスを実装するStudentMapperオブジェクトを作成します。
  • ステップ3 *-JdbcTemplateオブジェクトメソッドを使用して、StudentMapperオブジェクトを使用しながらデータベース操作を行います。

次の例では、spring jdbcを使用してクエリを読み取る方法を示します。 StudentMapperオブジェクトを使用して、Student Tableの読み取りレコードをStudentオブジェクトにマッピングします。

構文

String SQL = "select * from Student";
List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());

どこで

  • SQL -すべての学生レコードを読み取るためのクエリを読み取ります。
  • jdbcTemplateObject -データベースから学生レコードを読み取るStudentJDBCTemplateオブジェクト。
  • StudentMapper -学生レコードを学生オブジェクトにマッピングするStudentMapperオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、StudentMapperオブジェクトを使用してクエリを読み取り、結果をマップする例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル* StudentDao.java。*の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

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 List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 17
ID : 3, Name : Ayan, Age : 18

NamedParameterJdbcTemplateクラス

*org.springframework.jdbc.core.NamedParameterJdbcTemplate* クラスは、基本的なJDBC操作のセットを持つテンプレートクラスであり、従来の「?」ではなく名前付きパラメーターを使用できます。プレースホルダー。 このクラスは、名前付きパラメーターからJDBCスタイル「?」への置換が完了すると、ラップされたJdbcTemplateに委任します。プレースホルダーは実行時に行われます。 また、値のリストを適切な数のプレースホルダーに展開できます。

インターフェイス宣言

以下は org.springframework.jdbc.core.NamedParameterJdbcTemplate クラスの宣言です-

public class NamedParameterJdbcTemplate
   extends Object
      implements NamedParameterJdbcOperations

構文

MapSqlParameterSource in = new MapSqlParameterSource();
in.addValue("id", id);
in.addValue("description",  new SqlLobValue(description, new DefaultLobHandler()), Types.CLOB);

String SQL = "update Student set description = :description where id = :id";
NamedParameterJdbcTemplate jdbcTemplateObject = new NamedParameterJdbcTemplate(dataSource);
jdbcTemplateObject.update(SQL, in);

どこで、

  • in -クエリを更新するパラメータを渡すSqlParameterSourceオブジェクト。
  • SqlLobValue -SQL BLOB/CLOB値パラメーターを表すオブジェクト。
  • jdbcTemplateObject -データベース内の学生オブジェクトを更新するNamedParameterJdbcTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを更新する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 update
 *a record into the Student table.
  */
   public void updateDescription(Integer id, String description);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

   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;
   }
   public String getDescription() {
      return description;
   }
   public void setDescription(String description) {
      this.description = description;
   }
}

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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"));
      student.setDescription(rs.getString("description"));
      return student;
   }
}

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.SqlLobValue;
import org.springframework.jdbc.support.lob.DefaultLobHandler;

import java.io.ByteArrayInputStream;
import java.sql.Types;

public class StudentJDBCTemplate implements StudentDAO {
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject;

   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
   }
   public void updateDescription(Integer id, String description) {
      MapSqlParameterSource in = new MapSqlParameterSource();
      in.addValue("id", id);
      in.addValue("description",  new SqlLobValue(
         description, new DefaultLobHandler()), Types.CLOB);

      String SQL = "update Student set description = :description where id = :id";
      NamedParameterJdbcTemplate jdbcTemplateObject =
         new NamedParameterJdbcTemplate(dataSource);

      jdbcTemplateObject.update(SQL, in);
      System.out.println("Updated Record with ID = " + id );
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      studentJDBCTemplate.updateDescription(1,
         "This can be a very long text upto 4 GB of size.");
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

Updated Record with ID = 1

データベースにクエリを実行して、保存されている説明を確認できます。

Spring JDBC-SimpleJdbcInsertクラス

*org.springframework.jdbc.core.SimpleJdbcInsert* クラスは、テーブルに簡単な挿入機能を提供するマルチスレッドの再利用可能なオブジェクトです。 基本的な挿入ステートメントを作成するために必要なコードを簡素化するメタデータ処理を提供します。 実際の挿入は、SpringのJdbcTemplateを使用して処理されています

クラス宣言

以下は org.springframework.jdbc.core.SimpleJdbcInsert クラスの宣言です-

public class SimpleJdbcInsert
   extends AbstractJdbcInsert
      implements SimpleJdbcInsertOperations

次の例では、Spring JDBCを使用してクエリを挿入する方法を示します。 SimpleJdbcInsertオブジェクトを使用して、Student Tableに1つのレコードを挿入します。

構文

jdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("Student");
Map<String,Object> parameters = new HashMap<String,Object>();

parameters.put("name", name);
parameters.put("age", age);
jdbcInsert.execute(parameters);

どこで、

  • jdbcInsert -学生テーブルにレコードを挿入するSimpleJdbcInsertオブジェクト。
  • jdbcTemplateObject -データベース内の学生オブジェクトを読み取るStudentJDBCTemplateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを挿入する例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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 create
 *a record in the Student table.
  */
   public void create(String name, Integer age);

  /* *
     * This is the method to be used to list down
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

public class StudentJDBCTemplate implements StudentDao {
   private DataSource dataSource;
   private JdbcTemplate jdbcTemplateObject;
   SimpleJdbcInsert jdbcInsert;

   public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
      this.jdbcTemplateObject = new JdbcTemplate(dataSource);
      this.jdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("Student");
   }
   public void create(String name, Integer age) {
      Map<String,Object> parameters = new HashMap<String,Object>();
      parameters.put("name", name);
      parameters.put("age", age);

      jdbcInsert.execute(parameters);
      System.out.println("Created Record Name = " + name + " Age = " + age);
      return;
   }
   public List<Student> listStudents() {
      String SQL = "select * from Student";
      List <Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Records Creation--------" );
      studentJDBCTemplate.create("Nuha", 2);

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Records Creation--------
Created Record Name = Nuha Age = 12
------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 17
ID : 3, Name : Ayan, Age : 18
ID : 4, Name : Nuha, Age : 12

Spring JDBC-SimpleJdbcCallクラス

*org.springframework.jdbc.core.SimpleJdbcCall* クラスは、ストアドプロシージャまたはストアド関数の呼び出しを表すマルチスレッドの再利用可能なオブジェクトです。 基本的なストアドプロシージャ/関数にアクセスするために必要なコードを簡素化するメタデータ処理を提供します。

指定する必要があるのは、プロシージャ/関数の名前と、呼び出しの実行時にパラメータを含むマップだけです。 指定されたパラメータの名前は、ストアドプロシージャの作成時に宣言された入出力パラメータと一致します。

クラス宣言

以下は org.springframework.jdbc.core.SimpleJdbcCall クラスの宣言です-

public class SimpleJdbcCall
   extends AbstractJdbcCall
      implements SimpleJdbcCallOperations

次の例は、Spring SimpleJdbcCallを使用してストアドプロシージャを呼び出す方法を示します。 ストアドプロシージャを呼び出して、Student Tableで利用可能なレコードの1つを読み取ります。 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"));

どこで、

  • jdbcCall -ストアドプロシージャを表すSimpleJdbcCallオブジェクト。
  • in -ストアドプロシージャにパラメーターを渡すSqlParameterSourceオブジェクト。
  • 学生-学生オブジェクト。
  • out -ストアドプロシージャコールの結果の出力を表すオブジェクトをマップします。

Spring JDBCに関連する上記の概念を理解するために、ストアドプロシージャを呼び出す例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

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

呼び出しの実行用に記述するコードには、INパラメーターを含むSqlParameterSourceの作成が含まれます。 入力値に指定された名前を、ストアドプロシージャで宣言されたパラメーター名と一致させることが重要です。 executeメソッドはINパラメータを受け取り、ストアドプロシージャで指定された名前でキー設定された出力パラメータを含むMapを返します。

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.finddevguides.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());
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Name : Zara, Age : 11

Spring JDBC-SqlQueryクラス

*org.springframework.jdbc.object.SqlQuery* クラスは、SQLクエリを表す再利用可能な操作オブジェクトを提供します。

クラス宣言

以下は org.springframework.jdbc.object.SqlQuery クラスの宣言です-

public abstract class SqlQuery<T>
   extends SqlOperation

使用法

  • *ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • *ステップ2 *-RowMapperインターフェイスを実装するStudentMapperオブジェクトを作成します。
  • *ステップ3 *-JdbcTemplateオブジェクトメソッドを使用して、SqlQueryオブジェクトの使用中にデータベース操作を行います。

次の例は、SqlQueryオブジェクトを使用してクエリを読み取る方法を示します。 StudentMapperオブジェクトを使用して、Student Tableの読み取りレコードをStudentオブジェクトにマッピングします。

構文

String sql = "select * from Student";
SqlQuery<Student> sqlQuery = new SqlQuery<Student>() {
   @Override
   protected RowMapper<Student> newRowMapper(Object[] parameters,
      Map<?, ?> context) {
      return new StudentMapper();
   }
};
sqlQuery.setDataSource(dataSource);
sqlQuery.setSql(sql);
List <Student> students = sqlQuery.execute();

どこで、

  • SQL -すべての学生レコードを読み取るためのクエリを読み取ります。
  • jdbcTemplateObject -データベースから学生レコードを読み取るStudentJDBCTemplateオブジェクト。
  • StudentMapper -学生レコードを学生オブジェクトにマッピングするStudentMapperオブジェクト。
  • SqlQuery -学生レコードを照会し、それらを学生オブジェクトにマップするSqlQueryオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、クエリを読み取り、StudentMapperオブジェクトを使用して結果をマッピングする例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル* StudentDao.java。*の内容です。

package com.finddevguides;

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
 *all the records from the Student table.
  */
   public List<Student> listStudents();
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.object.SqlQuery;

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 List<Student> listStudents() {
      String sql = "select * from Student";
      SqlQuery<Student> sqlQuery = new SqlQuery<Student>() {
         @Override
         protected RowMapper<Student> newRowMapper(Object[] parameters, Map<?, ?> context){

            return new StudentMapper();
         }
      };
      sqlQuery.setDataSource(dataSource);
      sqlQuery.setSql(sql);
      List <Student> students = sqlQuery.execute();
      return students;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("------Listing Multiple Records--------" );
      List<Student> students = studentJDBCTemplate.listStudents();

      for (Student record : students) {
         System.out.print("ID : " + record.getId() );
         System.out.print(", Name : " + record.getName() );
         System.out.println(", Age : " + record.getAge());
      }
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 17
ID : 3, Name : Ayan, Age : 18
ID : 4, Name : Nuha, Age : 12

Spring JDBC-SqlUpdateクラス

*org.springframework.jdbc.object.SqlUpdate* クラスは、SQL更新を表す再利用可能な操作オブジェクトを提供します。

クラス宣言

以下は org.springframework.jdbc.object.SqlUpdate クラスの宣言です-

public abstract class SqlUpdate<T>
   extends SqlOperation

使用法

  • ステップ1 *-構成されたデータソースを使用してJdbcTemplateオブジェクトを作成します。
  • ステップ2 *-RowMapperインターフェイスを実装するStudentMapperオブジェクトを作成します。
  • ステップ3 *-JdbcTemplateオブジェクトメソッドを使用して、SqlUpdateオブジェクトの使用中にデータベース操作を実行します。

次の例は、SqlUpdateオブジェクトを使用してクエリを更新する方法を示します。 StudentMapperオブジェクトを使用して、Student Tableの更新レコードをStudentオブジェクトにマッピングします。

構文

String SQL = "update Student set age = ? where id = ?";

SqlUpdate sqlUpdate = new SqlUpdate(dataSource,SQL);
sqlUpdate.declareParameter(new SqlParameter("age", Types.INTEGER));
sqlUpdate.declareParameter(new SqlParameter("id", Types.INTEGER));
sqlUpdate.compile();

sqlUpdate.update(age.intValue(),id.intValue());

どこで、

  • SQL -クエリを更新して生徒の記録を更新します。
  • jdbcTemplateObject -データベースから学生レコードを読み取るStudentJDBCTemplateオブジェクト。
  • StudentMapper -学生レコードを学生オブジェクトにマッピングするStudentMapperオブジェクト。
  • sqlUpdate -学生レコードを更新するSqlUpdateオブジェクト。

Spring JDBCに関連する上記の概念を理解するために、StudentMapperオブジェクトを使用してクエリを読み取り、結果をマップする例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル* StudentDao.java。*の内容です。

package com.finddevguides;

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 update
 *a record into the Student table.
  */
   public void update(Integer id, Integer age);

  /* *
     * 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);
}

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.sql.Types;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.SqlUpdate;

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 void update(Integer id, Integer age){
      String SQL = "update Student set age = ? where id = ?";

      SqlUpdate sqlUpdate = new SqlUpdate(dataSource,SQL);
      sqlUpdate.declareParameter(new SqlParameter("age", Types.INTEGER));
      sqlUpdate.declareParameter(new SqlParameter("id", Types.INTEGER));
      sqlUpdate.compile();

      sqlUpdate.update(age.intValue(),id.intValue());
      System.out.println("Updated Record with ID = " + id );
      return;
   }
   public Student getStudent(Integer id) {
      String SQL = "select * from Student where id = ?";
      Student student = jdbcTemplateObject.queryForObject(
         SQL, new Object[]{id}, new StudentMapper());

      return student;
   }
}

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

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

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      StudentJDBCTemplate studentJDBCTemplate =
         (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

      System.out.println("----Updating Record with ID = 1 -----" );
      studentJDBCTemplate.update(1, 10);

      System.out.println("----Listing Record with ID = 1 -----" );
      Student student = studentJDBCTemplate.getStudent(1);

      System.out.print("ID : " + student.getId() );
      System.out.print(", Name : " + student.getName() );
      System.out.println(", Age : " + student.getAge());
   }
}

以下は、構成ファイル 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

----Updating Record with ID = 1 -----
Updated Record with ID = 1
----Listing Record with ID = 1 -----
ID : 1, Name : Zara, Age : 10

Spring JDBC-StoredProcedureクラス

*org.springframework.jdbc.core.StoredProcedure* クラスは、RDBMSストアドプロシージャのオブジェクト抽象化のスーパークラスです。 このクラスは抽象クラスであり、サブクラスが、指定されたexecute(java.lang.Object ...)メソッドに委任する呼び出し用の型付きメソッドを提供することを目的としています。 継承されたSQLプロパティは、RDBMSのストアドプロシージャの名前です。

クラス宣言

以下は org.springframework.jdbc.core.StoredProcedure クラスの宣言です-

public abstract class StoredProcedure
   extends SqlCall

次の例では、Spring StoredProcedureを使用してストアドプロシージャを呼び出す方法を示します。 ストアドプロシージャを呼び出して、Student Tableで利用可能なレコードの1つを読み取ります。 IDを渡し、学生の記録を受け取ります。

構文

class StudentProcedure extends StoredProcedure{
   public StudentProcedure(DataSource dataSource, String procedureName){
      super(dataSource,procedureName);
      declareParameter(new SqlParameter("in_id", Types.INTEGER));
      declareParameter(new SqlOutParameter("out_name", Types.VARCHAR));
      declareParameter(new SqlOutParameter("out_age", Types.INTEGER));
      compile();
   }
   public Student execute(Integer id){
      Map<String, Object> out = super.execute(id);
      Student student = new Student();
      student.setId(id);
      student.setName((String) out.get("out_name"));
      student.setAge((Integer) out.get("out_age"));
      return student;
   }
}

どこで、

  • StoredProcedure -ストアドプロシージャを表すStoredProcedureオブジェクト。
  • StudentProcedure -StudentProcedureオブジェクトはStoredProcedureを拡張して、入力、出力変数を宣言し、結果をStudentオブジェクトにマップします。
  • 学生-学生オブジェクト。

Spring JDBCに関連する上記の概念を理解するために、ストアドプロシージャを呼び出す例を作成しましょう。 サンプルを作成するには、動作するEclipse IDEを用意し、次の手順を使用してSpringアプリケーションを作成します。

Step Description
1 Update the project Student created under chapter Spring JDBC - First Application.
2 Update the bean configuration and run the application as explained below.

以下は、データアクセスオブジェクトインターフェイスファイル StudentDAO.java の内容です。

package com.finddevguides;

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

以下は Student.java ファイルの内容です。

package com.finddevguides;

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

以下は StudentMapper.java ファイルの内容です。

package com.finddevguides;

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

定義済みのDAOインターフェイスStudentDAOの実装クラスファイル StudentJDBCTemplate.java を次に示します。

package com.finddevguides;

import java.sql.Types;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.object.StoredProcedure;

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) {
      StudentProcedure studentProcedure = new StudentProcedure(dataSource, "getRecord");
      return studentProcedure.execute(id);
   }
}
class StudentProcedure extends StoredProcedure{
   public StudentProcedure(DataSource dataSource, String procedureName) {
      super(dataSource,procedureName);
      declareParameter(new SqlParameter("in_id", Types.INTEGER));
      declareParameter(new SqlOutParameter("out_name", Types.VARCHAR));
      declareParameter(new SqlOutParameter("out_age", Types.INTEGER));
      compile();
   }
   public Student execute(Integer id){
      Map<String, Object> out = super.execute(id);
      Student student = new Student();
      student.setId(id);
      student.setName((String) out.get("out_name"));
      student.setAge((Integer) out.get("out_age"));
      return student;
   }
}

呼び出しの実行用に記述するコードには、INパラメーターを含むSqlParameterSourceの作成が含まれます。 入力値に指定された名前を、ストアドプロシージャで宣言されたパラメーター名と一致させることが重要です。 executeメソッドはINパラメータを受け取り、ストアドプロシージャで指定された名前でキー設定された出力パラメータを含むMapを返します。

以下は MainApp.java ファイルの内容です。

package com.finddevguides;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.finddevguides.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());
   }
}

以下は、構成ファイル* 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.finddevguides.StudentJDBCTemplate">
      <property name = "dataSource" ref = "dataSource"/>
   </bean>

</beans>

ソースおよびBean構成ファイルの作成が完了したら、アプリケーションを実行しましょう。 アプリケーションで問題がなければ、次のメッセージが出力されます。

ID : 1, Name : Zara, Age : 10