package sample; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import entity.Employee; /** * JDBC版従業員DataAccessObject */ public class JdbcEmployeeDAO { /** * JDBCコネクション */ private Connection connection; /** * コンストラクタ * @param connection JDBCコネクション */ public JdbcEmployeeDAO(Connection connection){ this.connection = connection; } /** * 指定したIDの従業員を取得する * @param id 従業員ID * @param lock 行ロックを行うかどうか * @return * @throws SQLException */ public Employee get(int id, boolean lock) throws SQLException{ String sql = "SELECT * FROM EMPLOYEES WHERE ID = ?"; if( lock ){ sql += " FOR UPDATE"; } // ステートメントオブジェクトを生成 PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, id); // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(); Employee emp = null; if(rs.next()){ //従業員オブジェクトを生成(部門オブジェクトは省略) emp = new Employee(new Integer(rs.getInt("ID")), rs.getString("NAME"), new Integer(rs.getInt("SALARY")), new Integer(rs.getInt("DEPARTMENT_ID")), null); } // データベースから切断 stmt.close(); return emp; } /** * 部門名に対応する従業員のリストを取得する * @param departmentName 部門名 * @param lock 行ロックを行うかどうか * @return List * @throws SQLException */ public List getListByDepartmentName(String departmentName, boolean lock) throws SQLException{ String sql = "SELECT EMPLOYEES.* FROM EMPLOYEES" +" INNER JOIN DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.ID" +" WHERE DEPARTMENTS.NAME = ?"; if( lock ){ sql += " FOR UPDATE"; } // ステートメントオブジェクトを生成 PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, departmentName); // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(); List list = new ArrayList(); // 検索された行数分ループ while(rs.next()){ //従業員オブジェクトを生成(部門オブジェクトは省略) Employee emp = new Employee(new Integer(rs.getInt("ID")), rs.getString("NAME"), new Integer(rs.getInt("SALARY")), new Integer(rs.getInt("DEPARTMENT_ID")), null); list.add(emp); } // データベースから切断 stmt.close(); return list; } /** * 従業員を挿入する * @param emp 従業員 * @throws SQLException */ public void insert(Employee emp) throws SQLException{ String sql = "INSERT INTO EMPLOYEES (ID, NAME, SALARY, DEPARTMENT_ID)" +" VALUES(?, ?, ?, ?)"; // ステートメントオブジェクトを生成 PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, emp.getId().intValue()); stmt.setString(2, emp.getName()); stmt.setInt(3, emp.getSalary().intValue()); stmt.setInt(4, emp.getDepartmentId().intValue()); //ステートメントの実行 stmt.execute(); // データベースから切断 stmt.close(); } /** * 従業員を削除する * @param emp 従業員 * @throws SQLException */ public void delete(Employee emp) throws SQLException{ String sql = "DELETE FROM EMPLOYEES WHERE ID = ?"; // ステートメントオブジェクトを生成 PreparedStatement stmt = connection.prepareStatement(sql); stmt.setInt(1, emp.getId().intValue()); //ステートメントの実行 stmt.execute(); // データベースから切断 stmt.close(); } /** * 従業員を更新する * @param emp 従業員 * @throws SQLException */ public void update(Employee emp) throws SQLException{ String sql = "UPDATE EMPLOYEES SET" +" NAME = ?, SALARY = ?, DEPARTMENT_ID = ?" +" WHERE ID = ?"; // ステートメントオブジェクトを生成 PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, emp.getName()); stmt.setInt(2, emp.getSalary().intValue()); stmt.setInt(3, emp.getDepartmentId().intValue()); stmt.setInt(4, emp.getId().intValue()); //ステートメントの実行 stmt.execute(); // データベースから切断 stmt.close(); } /** * サンプルコードメイン * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ Connection con = null; try { // ドライバクラスをロード Class.forName("org.gjt.mm.mysql.Driver"); // データベースへ接続 String url = "jdbc:mysql:///ogis"; con = DriverManager.getConnection(url,"root",null); con.setAutoCommit(false); JdbcEmployeeDAO dao = new JdbcEmployeeDAO(con); //IT部門の従業員を取得 List list = dao.getListByDepartmentName("IT", true); //給与を1000円値上げ Iterator ite = list.iterator(); while(ite.hasNext()){ Employee emp = (Employee) ite.next(); int salary = emp.getSalary().intValue(); emp.setSalary( new Integer(1000 + salary) ); //従業員の更新 dao.update(emp); } //コミット con.commit(); } catch (Exception e) { //ロールバック if(con != null){ con.rollback(); } e.printStackTrace(); }finally{ //コネクションは常に閉じる if(con != null){ con.close(); } } } }