본문 바로가기
학원수업/1월

01/12 국비학원 자바 오라클 연동

by 코딩마스터^^ 2023. 1. 12.

디비 연동할때에는 자바만 볼것이 아니라 디비쪽도 확인을 해야한다.

package dev_java2.oracle;

import dev_java2.util.DBConnectionMgr;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
//모든 RDBMS에서 제공되는 타입이 아니라 오라클에서만 제공하는 타입-sys_refactor

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EmpList {
    Connection con = null;//인터페이스-비벼지는부분?
    CallableStatement cstmt=null;//프로시저를 요청할때 사용하는 인터페이스
    OracleCallableStatement osctmt=null;
    ResultSet rs = null;//오라클 커서를 조작하는데 필요한 추상메소드가짐
    DBConnectionMgr dbMgr = new DBConnectionMgr("sco" +
            "tt", "tiger");
    public List<Map<String,Object>> getEmpList() {
        List<Map<String, Object>> list = new ArrayList<>();
        //구글링한 소스를 어디에 붙여야하나? 기준, 선택할 수 있다.-APi를 많이 보고 실습 코드에 적용을 반드시 해봐

        try {
//            con = dbMgr.getConnection();//물리적을 떨어지있는 통로확보

            con = dbMgr.getConnection("scott","tiger");//물리적을 떨어지있는 통로확보
            cstmt = con.prepareCall("{call my_proc(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.execute();
            //굳이 추가로 제공되는 클래스로 치환하는것은 Resultset을 주입받는 메소드 호출이 필요하기때문에
            //CallableStatement는 getCursor를 지원 안해서 삽임함
            osctmt=(OracleCallableStatement) cstmt;
            rs=osctmt.getCursor(1);//커서를 움직일수있다.
            Map<String,Object> rmap=null;
            while (rs.next()) {
                rmap=new HashMap<>();
                rmap.put("empno", rs.getInt(1));//키값, 몇번째자리
                rmap.put("deptno", rs.getInt(2));
                rmap.put("ename", rs.getString(3));
                //List에 Map추가하기
                //List에 튜플이 추가
                //Map에 추가되는건 컬럼
                list.add(rmap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
    //프로시저안에서는 여러가지의 DML문을 한번 서버에 접속한 상태에서
    //한번에 처리가능
    //commit, rollback가능함
    //자바로 꺼내서 처리하지 않고 프로시저 내부에서 비즈니스로직(업무포함 프로세스)
    //처리가능-변수활용과 제어문 사용
    //프로시저내부에서 자바의 힘을 빌리지 않고도 처리할 수 있는 프로세스들 있다.
    //시스템의 부하를 줄인다

    public static void main(String[] args) {
        EmpList eList=new EmpList();
        List<Map<String, Object>> list=eList.getEmpList();
        System.out.println(list);
    }
}​

 

 

package dev_java2.util;

import java.sql.*;

public class DBConnectionMgr {
    public static final String _DRIVER = "oracle.jdbc.driver.OracleDriver";//오라클 안에 데이터가 들어있다...

    public static final String _URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl11";
    public static String _USER = "kiwi";//키위쓸때는 키위로 바꾸고 스캇쓸때는 스캇으로
    public static String _PW = "tiger";
    public DBConnectionMgr(){}
    //파라미터가 있는 생성자가 하나라도 있으면 디폴트 생성자 제공 안된다.

    public DBConnectionMgr(String ID, String PW) {
        //static으로 선언된 변수는 this나 super같은 예약어를 사용 불가함.
        //this에 대한 어려움으로 리액트 훅(함수형 프로그래밍을 지향하는 방식 -> 자바 : 람다식 / 익명클래스 / 내부클래스 컨벤션 동일) 새로운 방식 제안함 16.8번 18.2
        //웹브라우저에서는 this가 왜 문제인가? - 캡쳐링 / 버블링효과
        _USER = ID;
        _PW = PW;
    }
    public Connection getConnection(String user, String pw) {
        _USER = user;
        _PW = pw;
        Connection con = null;
        try {
            Class.forName(_DRIVER);
            con = DriverManager.getConnection(_URL, _USER, _PW);
        } catch (ClassNotFoundException ce) {
            System.out.println("드라이버 클래스를 찾을 수 없습니다.");
        } catch (Exception e) {// 멀티 블럭 작성시 더 넓은 클래스가 뒤에 와야함
            System.out.println("오라클 서버와 커넥션 실패");
        }
        return con;
    }

    public Connection getConnection(){
        Connection con =null;
        try {
            Class.forName(_DRIVER);
            con=DriverManager.getConnection(_URL, _USER, _PW);
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 클래스를 찾을 수 없습니다.");
        }catch(Exception e){//가장 범위가 넓은 클래스를 가장 바깥에 적기. 에러중에 젤 큰애다.
            //멀티 블럭 작성시 더 넓은 클래스가 뒤에 와야함
            System.out.println("오라클 서버와 커넥션 실패!");
        }
        return con;
    }
    //사용한 자원을 반납하는 코드를 명시적으로 하는 것을 원칙으로 하고있음
    //반납하는 순서는 생성된 역순으로 진행할 것-자바 튜닝팀 지적사항

    //사용한 자원 반납하기 SELECT-커서 조작이 필요함
    public void freeConnection (Connection con, Statement stmt, ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }


    public void freeConnection (Connection con, PreparedStatement pstmt, ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if(pstmt!=null){
            try {
                pstmt.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
    //사용한 자원 반납하기-INSET, UPDATE, DELETE

    public void freeConnection (Connection con, Statement stmt){

        if(stmt!=null){
            try {
                stmt.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
    public static void main(String[] args) {
        DBConnectionMgr dbMgr=new DBConnectionMgr();
        Connection con =dbMgr.getConnection();
        System.out.println("con====>"+con);
    }


    public void freeConnection(Connection con, CallableStatement cstmt) {
        if (cstmt != null) {
            try {
                cstmt.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
}
package dev_java2.oracle;

import dev_java2.util.DBConnectionMgr;

import java.sql.CallableStatement;
import java.sql.Connection;

//클래스 설계에 있어서 DAO패턴의 사용은 필수가 되었다.
//특히 MyBatis와 같은 ORM솔루셩리 제공되면서 더 강조되었다.
//JDBC API-> MyBatis->JPA(Hibernate)-쿼리문이 없다.(추상적이다. 조인관계는 어떡하지?)
public class ChatDao {
    Connection con = null;//인터페이스-비벼지는부분?
    CallableStatement cstmt=null;
    DBConnectionMgr dbMgr = new DBConnectionMgr("kiwi", "tiger");
    public String login(String mem_id, String mem_pw){
        String mem_name =null;
        try {
//            con = dbMgr.getConnection();//물리적을 떨어지있는 통로확보

            con = dbMgr.getConnection("kiwi","tiger");//물리적을 떨어지있는 통로확보
            cstmt = con.prepareCall("{call proc_login(?,?,?)}");
            cstmt.setString(1, mem_id);
            cstmt.setString(2, mem_pw);
            cstmt.registerOutParameter(3, java.sql.Types.VARCHAR);
            cstmt.executeUpdate();
            mem_name=cstmt.getString(3);
//            System.out.println(mem_name);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mem_name;
        //return "회원가입했던 너의 이름";
    }

    public static void main(String[] args) {
        ChatDao chatDao = new ChatDao();
        String mem_id = chatDao.login("tomato", "123");
        System.out.println(mem_id);
    }

}

댓글