DAO

import jp.co.itboost.scheduler.common.DAOTemplate;
import java.sql.*;
import java.util.LinkedHashMap;

/**
 * User用DAOクラス
 * @author ITBoost
 */
public class UserDAO extends DAOTemplate {
    /**
     * テーブル名
     */
    private final static String USER_TABLE_NAME = "schedule_user";

    /**
     * DAOで管理するデータベースのデータソース名を返す
     * @return データソース名
     */
    public String getDataSourceName() {
        return "jdbc/strutsdev";
    }    


    /**
     * 指定されたsqlを元にUserオブジェクトを生成する
     * @param sql 任意のSQL
     * @return Userオブジェクト
     */
    private User getUser(String sql) {
        Connection con = null;
        try {
            con = createConnection();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (!rs.next()) return null;
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setPassword(rs.getString("password"));
            user.setMailAddress(rs.getString("mailaddress"));
            return user;
        } catch (SQLException ex) {
            System.out.println("in UserDAO:SQLException! sql=" + sql);
            ex.printStackTrace();
        } finally {
            closeConnection(con);
        }
        return null;
    }

    /**
     * ユーザ情報をデータベースからロードする
     * @param id ユーザID
     * @return Userオブジェクト
     */
    public User load(int id) {
        String sql =
            "select id, name,password,mailaddress from "
                + USER_TABLE_NAME
                + " where id="
                + id;
        return getUser(sql);
    }

    /**
     * ユーザ情報をデータベースに新規保存する
     * @param user Userオブジェクト
     */
    public void create(User user) {
        String sql =
            "insert into "
                + USER_TABLE_NAME
                + " (id, name,password,mailaddress) values(?,?,?,?)";
        Connection con = null;
        try {
            con = createConnection();
            con.setAutoCommit(false);
            int id = getNextId(con, USER_TABLE_NAME);
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setInt(1, id);
            stmt.setString(2, user.getName());
            stmt.setString(3, user.getPassword());
            stmt.setString(4, user.getMailAddress());
            stmt.executeUpdate();
            con.commit();
        } catch (SQLException ex) {
            System.out.println("in UserDAO:SQLException! sql=" + sql);
            ex.printStackTrace();
        } finally {
            closeConnection(con);
        }
    }

    /**
     * データベースのユーザ情報を更新する
     * @param user Userオブジェクト
     */
    public void store(User user) {
        String sql =
            "update "
                + USER_TABLE_NAME
                + " set name=?, password=? ,mailaddress=? where id=?";
        Connection con = null;
        try {
            con = createConnection();
            int id = user.getId();
            PreparedStatement stmt = con.prepareStatement(sql);
            stmt.setString(1, user.getName());
            stmt.setString(2, user.getPassword());
            stmt.setString(3, user.getMailAddress());
            stmt.setInt(4, id);
            stmt.executeUpdate();

        } catch (SQLException ex) {
            System.out.println("in UserDAO:SQLException! sql=" + sql);
            ex.printStackTrace();
        } finally {
            closeConnection(con);
        }
    }

    /**
     * ユーザIDとパスワードを指定して合致するユーザ情報を取り出す
     * @param id ユーザID
     * @param password パスワード
     * @return Userオブジェクト
     */
    public User findByIdAndPassword(int id, String password) {
        String sql =
            "select id,name,password,mailaddress from "
                + USER_TABLE_NAME
                + " where id="+id+" and password='"+escapeSQL(password)+"'";        
        return getUser(sql);
    }

    /**
     * ユーザIDと名前の一覧を取り出す
     * @return keyに名前, valueにユーザIDが入ったLinkedHashMapオブジェクト
     */
    public LinkedHashMap findAllIdAndName() {
        String sql = "select id, name from "+USER_TABLE_NAME+" order by id";
        Connection con = null;
		LinkedHashMap ret = new LinkedHashMap();
		try {
			con = createConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while(rs.next()) {
                ret.put(rs.getString("name"), new Integer(rs.getInt("id")));
			}
		} catch (SQLException ex) {
            System.out.println("in UserDAO:SQLException! sql=" + sql);
            ex.printStackTrace();
        } finally {
            closeConnection(con);
        } 
        return ret;
    }
}