Springフレームワークでは、データアクセスオブジェクト(DAO)層を簡潔かつ安全に実装するために、JDBC操作を抽象化したサポートクラスを提供している。従来のJDBCでは接続の確立・SQL実行・リソース解放といった定型コードが必要だが、SpringはJdbcTemplateおよびその基底クラスであるJdbcDaoSupportを通じてこれを大幅に簡素化する。
1. モデルクラスの定義
まず、データベースに対応するエンティティとしてUserクラスを定義する。
package com.example.model;
public class User {
private int userId;
private String name;
private float money;
public int getUserId() { return userId; }
public void setUserId(int userId) { this.userId = userId; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public float getMoney() { return money; }
public void setMoney(float money) { this.money = money; }
}
2. DAOインターフェースと実装
次に、DAOのインターフェースを定義し、その実装クラスでJdbcDaoSupportを継承する。
インターフェース:
package com.example.dao;
import java.util.List;
import com.example.model.User;
public interface UserDao {
List<User> findAllUsers();
boolean addUser(String name, float balance);
}
実装クラス:
package com.example.dao.impl;
import java.util.*;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.example.dao.UserDao;
import com.example.model.User;
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
@Override
public List<User> findAllUsers() {
String sql = "SELECT id, name, money FROM tb_user";
List<Map<String, Object>> rows = getJdbcTemplate().queryForList(sql);
List<User> users = new ArrayList<>();
for (Map<String, Object> row : rows) {
User user = new User();
user.setUserId((Integer) row.get("id"));
user.setName((String) row.get("name"));
user.setMoney(((Number) row.get("money")).floatValue());
users.add(user);
}
return users;
}
@Override
public boolean addUser(String name, float balance) {
String sql = "INSERT INTO tb_user (name, money) VALUES (?, ?)";
int affectedRows = getJdbcTemplate().update(sql, name, balance);
return affectedRows > 0;
}
}
3. Springコンテキストの設定
DataSourceとDAOのBeanをXMLで定義する。ここではApache Commons DBCPを使用した接続プールを設定する。
<?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.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>
<bean id="userDao" class="com.example.dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
4. データベース準備
MySQL上にspringデータベースを作成し、以下のテーブルを定義する必要がある:
CREATE TABLE tb_user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
money FLOAT
);
5. 実行例
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = context.getBean(UserDao.class);
userDao.addUser("alice", 1000.0f);
userDao.addUser("bob", 500.0f);
for (User u : userDao.findAllUsers()) {
System.out.println("name: " + u.getName() + ", money: " + u.getMoney());
}
6. よくあるエラーと依存関係
以下のエラーは主に必要なライブラリが不足しているために発生する:
ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource→commons-dbcpとcommons-poolが必要Cannot load JDBC driver class 'com.mysql.jdbc.Driver'→ MySQLコネクタの追加が必要JdbcDaoSupportが認識されない →spring-jdbcモジュールの依存を追加
Mavenプロジェクトの依存関係(pom.xml)は以下の通り:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>