SpringにおけるDAOの実装とJdbcDaoSupportの活用

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.BasicDataSourcecommons-dbcpcommons-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>

タグ: Spring JDBC JdbcDaoSupport DAO MySQL

5月27日 18:01 投稿