JDBC - CRUD 구현하기

  • 전체적 구조는 이전 포스트 참고
  • 에러가 발생될 경우가 많아서, try catch 문이 아주 많이 사용됐다.
  • Retrieve는 Role객체를 반환해 주지만, Create,Update,Delete는 몇개가 수행되었는지 숫자정보가 반환된다.
  • CRUD 공통으로 jdbcDriver => Connection => PreparedStatement 객체를 부르고, Retrieve는 결과 객체를 받아야하기 때문에 ResultSet 객체를 추가로 부른다.
  • 전체코드는 아주 맨 아래에…

Create

  • RoleDao.java

    • jdbcDriver 불러서 dburl, dbuser, dbpwd 넣어 Connection 객체를 불러오고,

      Class.forName("com.mysql.jdbc.Driver");
      Connection conn = DriverManager.getConnection(dburl,dbuser,dbpasswd);
      
    • Connection 객체에서 preparedStatement 메소드 안에 sql명령어를 넣어서 PreparedStatement 객체를 가져오고

      String sql="INSERT INTO role (role_id,description) VALUES(?,?)";
      PreparedStatement ps= conn.prepareStatement(sql);
      
    • PreparedStatement 객체에서 setInt(), setString()를 해서 위 sql명령어의 ?,?의 값을 넣어준다.

      ps.setInt(1, role.getRoleId());
      ps.setString(2,role.getDescription());
      
    • executeUpdate하면, 쿼리문이 수행되고, 몇개가 처리됐는지 알려주는 숫자가 반환된다.

    public int addRole(Role role) {
        int insertCount =0;
        //드라이버 로드
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        String sql="INSERT INTO role (role_id,description) VALUES(?,?)";
        //여기 try catch문, dburl dbUser, dbpasswd는 클래스 변수로 선언됐다. 전체 코드는 맨아래에
        try(Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
            PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setInt(1, role.getRoleId());
            ps.setString(2,role.getDescription());
            insertCount = ps.executeUpdate();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
        return insertCount;
    }
    
  • JDBCExam4.java

    • RoleDao 객체를 불러서 addRole로 mysql 테이블에 정보를 추가한다.
    package kr.or.connect.jdbcexam;
    import kr.or.connect.jdbcexam.dao.RoleDao;
    import kr.or.connect.jdbcexam.dto.Role;
    public class JDBCExam2 {
        public static void main(String[] args) {
            int roleId = 501;
            String description = "CTO";
            Role role = new Role(roleId, description);
            RoleDao dao = new RoleDao();
            int insertCount = dao.addRole(role);
            System.out.println(insertCount);
        }
    }
    

Retrieve - One Item

  • RoleDao.java

    • DriverManager 객체에서 getConnection(dburl, dbuser, dbpwd)로 Connection 객체를 부른다.

      Class.forName("com.mysql.jdbc.Driver");
      conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
      
    • Connection 객체의prepareStatement(쿼리문)으로 PreparedStatement 객체를 얻는다.

      String sql = "SELECT role_id,description FROM role WHERE role_id=?";
      PreparedStatement ps = Connection.prepareStatement(sql);
      
    • PreparedStatement 객체에서 setInt()로 위 sql명령어의 ?의 값을 넣어준다.

      ps.setInt(1,roleId);
      
    • PreparedStatement 객체의 executeQuery로 ResultSet 객체를 얻는다.

      • 쿼리문이 select일 때, executeQuery 하면 ResultSet이 리턴된다.
      rs = ps.executeQuery();
      
    • ResultSet객체의 next()로 정보를 빼와 Role 객체에 넣어주고, Role객체를 리턴해준다.

      if(rs.next()) {
          int id=  rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다.
          String description = rs.getString(2);
          role = new Role(id,description);
      }
      
    • finally는 항상 실행된다. 객체가 있는지 확인하고 사용이 끝났으면 꼭 다 닫아준다.

    public Role getRole(Integer roleId) {
        Role role = null;
        Connection conn =null;
        PreparedStatement ps =null;
        ResultSet rs = null;
        try {
            //load the driver to memory?
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            //? 에 다른게 들어갈 수 있다. set 으로 설정할 수 있음
            String sql = "SELECT  role_id,description FROM role WHERE role_id =?";
            ps=conn.prepareStatement(sql);
            ps.setInt(1, roleId);
            rs = ps.executeQuery();
            // 있으면, 객체 리턴. 없으면  false리턴
            if(rs.next()) {
                int id=  rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다.
                String description = rs.getString(2);
                role = new Role(id,description);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return role;
    }
    
  • JDBCExample1.java

    • RoleDao 객체를 불러서 getRole로 Role객체를 받아온다.
    package kr.or.connect.jdbcexam;
    import kr.or.connect.jdbcexam.dao.RoleDao;
    import kr.or.connect.jdbcexam.dto.Role;
    public class JDBCExam1 {
        public static void main(String[] args) {
            RoleDao dao = new RoleDao();
            Role role = dao.getRole(100);
            System.out.println(role);
        }
    }
    

Retrieve - All Items

  • RoleDao.java

    • 위 Retrieve - One이랑 거의 다 같고 , mysql 테이블에 저장된 모든 행을 List<Role>에 받는다.

      • 모든 리스트를 가져온다. 쿼리문은 다음과 같다.

        String sql = "SELECT description,role_id FROM role order by role_id desc";
        
      • 리스트를 빼서 어레이리스트에 다음과 같이 넣어준다.

        while(rs.next()) {
            String description = rs.getString(1);
            int id=rs.getInt("role_id");
            Role role = new Role(id,description);
            list.add(role);
        }
        
    • getRoles() 전체 코드

    public List<Role> getRoles(){
        List<Role> list = new ArrayList<>();
        try {
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        String sql = "SELECT description,role_id FROM role order by role_id desc";
        try(Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            PreparedStatement ps = conn.prepareStatement(sql)){
            //try문 안에 또 try문이 있다.
            try(ResultSet rs = ps.executeQuery()){
                while(rs.next()) {
                    String description = rs.getString(1);
                    int id=rs.getInt("role_id");
                    Role role = new Role(id,description);
                    list.add(role);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }catch(Exception ex) {
            ex.printStackTrace();
        }
        return list;
    }
    
  • JDBCExam3.java

    • RoleDao 객체를 불러서 getRoles로 Role 객체들이 담긴 어레이리스트를 받는다.
    package kr.or.connect.jdbcexam;
    import java.util.List;
    import kr.or.connect.jdbcexam.dao.RoleDao;
    import kr.or.connect.jdbcexam.dto.Role;
    public class JDBCExam3 {
        public static void main(String[] args) {
            RoleDao dao=new RoleDao();
            List<Role> list = dao.getRoles();
            for(Role role : list) {
                System.out.println(role);
            }
        }
    }
    

Update

  • RoleDao.java

    • jdbc DriverManager를 불러와 getConnection() 메소드로 Connection 객체를 불러온다. (db에 접속)

      Class.forName("com.mysql.jdbc.Driver");
      Connection conn=DriverManager.getConnection(dburl,ubuser,dbpwd);
      
    • Connection 객체에서 prepareStatement(쿼리문) 메소드로 PreparedStatement 객체를 얻는다.

      String sql = "UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?";
      PreparedStatement ps = conn.prepareStatement(sql);
      
    • PreparedStatement 객체의 setInt(),setString() 메소드로 위 sql명령어의 ?의 값을 넣어준다.

      ps.setString(1,role.getDescription());
      ps.setInt(2, role.getRoleId());
      
    • PreparedStatement 객체의 executeUpdate() 로 쿼리문을 수행한다.

    public int updateRole(Role role) {
        int updateCount =0;
        Connection conn=null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection(dburl,dbUser,dbpasswd);
            String sql="UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,role.getDescription());
            ps.setInt(2, role.getRoleId());
            updateCount=ps.executeUpdate();
        }catch(Exception ex) {
            ex.printStackTrace();
        }finally {
            if(ps!=null) {
                try {
                    ps.close();
                }catch(Exception ex) {
    
                }
            }
            if(conn!=null) {
                try {
                    conn.close();
                }catch(Exception ex) {}
            }
        }
        return updateCount;
    }
    
  • JDBCExam5.java

    • RoleDao 객체를 불러서 updateRole로 mysql role테이블에 저장된 정보를 수정한다.
    package kr.or.connect.jdbcexam;
    import kr.or.connect.jdbcexam.dao.RoleDao;
    import kr.or.connect.jdbcexam.dto.Role;
    public class JDBCExam5 {
    	public static void main(String[] args) {
    		int roleId = 501;
    		String description ="ECO";
    		Role role = new Role(roleId,description);
    		RoleDao dao=new RoleDao();
    		int updateCount = dao.updateRole(role);
    		System.out.println(updateCount);
    	}
    }
    

Delete

  • RoleDao.java

    • jdbcDriver를 로드하고, Connection 객체를 불러온다.

      Class.forName("com.mysql.jdbc.Driver");
      Connection conn = DriverManager.getConnection(dburl,dbuser,dbpwd);
      
    • Connection 객체의 prepareStatement(쿼리문)으로 PreparedStatement 객체를 받는다.

      String sql= "DELETE FROM role WHERE role_id=?";
      PreparedStatement ps = conn.prepareStatement(sql);
      
    • PreparedStatement 객체의 setInt 메소드로, 쿼리문의 ?의 값을 넣는다.
    • PrepareStatement객체의 executeUpdate 메소드로 쿼리문을 실행하고 결과를 받는다.
    public int deleteRole(int roleId) {
        int deleteCount = 0;
        Connection conn=null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            String sql = "DELETE FROM role WHERE role_id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, roleId);
            deleteCount = ps.executeUpdate();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
            if(ps!=null) {
                try {
                    ps.close();
                }catch(Exception ex) {
                }
            }
        }
        return deleteCount;
    }
    
  • JDBCExam4.java

    • RoleDao 객체를 불러서 deleteRole로 mysql role테이블에 저장된 정보를 삭제한다.
    package kr.or.connect.jdbcexam;
    import kr.or.connect.jdbcexam.dao.RoleDao;
    public class JDBCExam4 {
        public static void main(String[] args) {
            int roleId = 500;
            RoleDao dao= new RoleDao();
            int deleteCount = dao.deleteRole(roleId);
            System.out.println(deleteCount);
        }
    }
    

전체 코드

Role.java

package kr.or.connect.jdbcexam.dto;

public class Role {
    private Integer roleId;
    private String description;

    public Role(Integer roleId, String description) {
        super();
        this.roleId = roleId;
        this.description = description;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public String toString() {
        return "Role [roleId=" + roleId + ", description=" + description + "]";
    }
}

RoleDao.java

package kr.or.connect.jdbcexam.dao;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.PreparedStatement;

import kr.or.connect.jdbcexam.dto.Role;

public class RoleDao {
    private static String dburl = "jdbc:mysql://localhost:3306/cutePin?serverTimezone=Asia/Seoul&useSSL=false";
    private static String dbUser = "callie";
    private static String dbpasswd = "connect123!@#";

    public Role getRole(Integer roleId) {
        Role role = null;
        Connection conn =null;
        PreparedStatement ps =null;
        ResultSet rs = null;

        try {
            //load the driver to memory?
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            //? 에 다른게 들어갈 수 있다. set 으로 설정할 수 있음
            String sql = "SELECT  role_id,description FROM role WHERE role_id =?";
            //
            ps=conn.prepareStatement(sql);
            ps.setInt(1, roleId);
            rs = ps.executeQuery();
            // 있으면, 객체 리턴. 없으면  false리턴
            if(rs.next()) {
                int id=  rs.getInt(1);//rs.getInt("role_id"); 이렇게 해도 된다.
                String description = rs.getString(2);
                role = new Role(id,description);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        return role;

    }

    public int addRole(Role role) {
        int insertCount =0;
        //드라이버 로드
        try {
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        String sql="INSERT INTO role (role_id,description) VALUES(?,?)";
        //여기 try catch문 신기
        try(Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
            PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setInt(1, role.getRoleId());
            ps.setString(2,role.getDescription());
            insertCount = ps.executeUpdate();
        }catch(Exception ex) {
            ex.printStackTrace();
        }

        return insertCount;
    }

    public List<Role> getRoles(){
        List<Role> list = new ArrayList<>();
        //driver 다운로드
        try {
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        String sql = "SELECT description,role_id FROM role order by role_id desc";
        //위에서 받은 driver manager에서 Connection  객체를 받고, Connection 객체에서  preparedStatement 객체를 받는다.
        try(Connection conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            PreparedStatement ps = conn.prepareStatement(sql)){
            //try문 안에 또 try문이 있다.
            try(ResultSet rs = ps.executeQuery()){
                while(rs.next()) {
                    String description = rs.getString(1);
                    int id=rs.getInt("role_id");
                    Role role = new Role(id,description);
                    list.add(role);
                }
            }catch(Exception e){
                e.printStackTrace();
            }

        }catch(Exception ex) {
            ex.printStackTrace();
        }

        return list;
    }

    public int deleteRole(int roleId) {
        int deleteCount = 0;
        Connection conn=null;
        PreparedStatement ps = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");

            conn = DriverManager.getConnection(dburl,dbUser,dbpasswd);
            String sql = "DELETE FROM role WHERE role_id=?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, roleId);
            deleteCount = ps.executeUpdate();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
            if(ps!=null) {
                try {
                    ps.close();
                }catch(Exception ex) {

                }
            }
        }

        return deleteCount;
    }

    public int updateRole(Role role) {
        int updateCount =0;
        Connection conn=null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection(dburl,dbUser,dbpasswd);
            String sql="UPDATE ROLE SET DESCRIPTION = ? WHERE role_id =?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,role.getDescription());
            ps.setInt(2, role.getRoleId());
            updateCount=ps.executeUpdate();
        }catch(Exception ex) {
            ex.printStackTrace();
        }finally {
            if(ps!=null) {
                try {
                    ps.close();
                }catch(Exception ex) {

                }
            }

            if(conn!=null) {
                try {
                    conn.close();
                }catch(Exception ex) {}
            }
        }
        return updateCount;
    }
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2