디비 연동할때에는 자바만 볼것이 아니라 디비쪽도 확인을 해야한다.
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);
}
}
'학원수업 > 1월' 카테고리의 다른 글
01/16 국비학원 36회차 (Node.js, 자바오라클연동) (0) | 2023.01.16 |
---|---|
01/13 국비학원 35회차 오라클(도서관리시스템) (0) | 2023.01.13 |
01/12 국비학원 34회차 오라클 수업(PL/SQL) (0) | 2023.01.12 |
01/11 국비학원 33회차 오라클수업 (0) | 2023.01.11 |
01/10 국비학원 32회차 오라클수업(Join의 종류) (1) | 2023.01.10 |
댓글