advancedJava 프로젝트 우클릭 - build path - config build path
-라이브러리 - class path - add external JARs-
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib에서 6버전 클릭해서 적용
:자바와 DBMS와 연동하기 위한 기술
(java프로그램에서 SQL문을 실행(DML,DQL(Query))하기 위해서 제공되는 API)
JVM이 인식할 수 있는 위치로 오라클 드라이버 연결
=>코드를 실행하기 위해서 JVM이 찾을 수 있는 위치
=>1.application은 Build Path에서 라이브러리로 등록
=>2.web은 lib에 복사
[문법]
Class.forName("핵심클래스의 full path - 패키지를 포함한 클래스명");
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.mysql.cj.jdbc.Driver");
: java.sql패키지의 DriverManager클래스의 메소드를 이용해서 연결
public static Connection getConnection(String url, String user, String password) throws SQLException
url : DBMS에 연결하기 위해 필요한 정보가 담겨있는 문자열
(어떤 DBMS를 사용하냐에 따라 내부에서 인식될 문자열이 다른 형식으로 만들어져서 제공)
jdbc:oracle:thin:@ip:port:데이터베이스서비스명
jdbc:oracle:thin => 오라클에서 사용하는 프로토콜
@ip:port => DBMS가 설치되어 있는 서버의 ip와 port(1521)
데이터베이스서비스명 => 오라클 설치할 때 설정하는 서비스명, express edition버전은 xe
user: 사용자계정(scott,hr..)
pass: 계정의 패스워드 (tiger,hr..)
jdbc:mysql://ip:port:데이터베이스서비스명 ??
user: 사용자계정(scott,hr..)
pass: 계정의 패스워드 (tiger,hr..)

=> 어떤 드라이버가 로딩되었냐에 따라 Connection의 다른 하위객체가 리턴
(어떤 DBMS를 사용하냐에 따라 다른 드라이버가 연결될 것이므로 해당 드라이버에 속한 파일이 리턴)
=> 이 Connection의 하위객체를 이용해서 SQL문을 실행할때 연결정보를 받아서 사용할 수 있다.
*SOLID의 S(Single responsibility principle)(단일책임의 원칙)
: 하나의 클래스는 하나의 책임만 가져야함
Connection객체의 메소드를 이용해서 SQL문을 실행할 수 있는 객체를생성
[상속구조]
Statement ---> 정적 SQL을 실행할 때 사용(보안 취약)
↑
PreparedStatement ---> 동적 SQL을 실행할 때 사용(secure코딩에 적합, 캐시사용)
↑
CallableStatement ---> 각 DBMS에 특화된 SQL로 작성된 명령문을 실행(PL/SQL)
Connection객체가 갖고있는 createStatement메소드를 이용해서 생성
[형식]
Statement stmt = con.createStatement()
=>어떤 DBMS를 사용하냐에 따라 다른 Statement객체가 만들어짐
[sql실행]
<1> 쿼리문장을 분석
<2> 컴파일
<3> 실행
Statement는 SQL을 실행하는 과정에서 매번 3단계의 내용을 처리하고 있지만 prepareStatement는 한번만 작업하고 캐시에서 꺼내서 사용
String sql = "select * from member where id=? and pass=?"
=> ?에는 필드가 올 수 없고 무조건 값만 연결될 수 있다.(컬럼명은 ?로 처리못함)
=> 순수한 값만 올 수 있고 기호는 ?에 같이 연결해서 사용할 수 없다('?'는 인식못함)
=> Connection의 prepareStatement 메소드를 호출할때 sql을 넘겨 sql문을 미리 파싱해놓도록 작업한다.
[형식]
PrepareStatement ptmt = con.prepareStatement(sql)
=> ?는 외부에서 입력받는 값을 셋팅해야하므로 메소드를 이용해서 설정
=> ?를 셋팅해야 하므로 setXX메소드가 많이 있다.
=> setXXX의 메소드와 오라클 타입은 ResultSet과 동일
ptmt.setXXXX(1, "jang") => 첫번째 ?에 "jang"을 대입하기
1=> ?의 순서
int result = ptmt.executeUpdate()
ResultSet rs = ptmt.executeQuery()
결과가 2차원표로 보이는 테이블에 리턴, 테이블에 저장된 데이터를 자바에서 사용할 수 있도록 만들어진 객체
ResultSet에 저장된 데이터를 읽기 위해서 ResultSet의 메소드를 이용해서 작업
레코드를 읽기 위해서 포지션이 바뀌도록 next()메소드를 호출
=> next() 메소드:다음 레코드로 포지션을 이동(Cursor를 맞춘다~표현)
한번에 하나의 컬럼만을 읽을수있다
레코드 갯수만큼 반복작업을 수행해야한다
한 레코드의 컬럼을 읽기 위해서 ResultSet에 getXXXX메소드(오라클 컬럼의 타입에 따라 선택)가 지원된다.
오라클타입이 varchar2 / char : java의 String
getString(컬럼명)
getString(컬럼index)
-> 원본데이터의 컬럼순서가 아니라 조회된 테이블의 컬럼순서
-> (index는 1부터 시작)
오라클타입이 number이면 java의 int : getInt(컬럼명)
오라클타입이 date이면 java의 java.sql.Date : gerDate(컬럼명)
반복작업
while(rs.next()){->true/false를 리턴(레코드있으면 true, 없으면 false를 리턴)
//레코드의 각 컬럼을 읽기
}
SQL> create table member(
2 id varchar2(20) primary key,
3 pass varchar2(20),
4 name varchar2(20),
5 addr varchar2(20),
6 regdate date,
7 point number(10),
8 info varchar2(20));
Table created.
SQL> insert into member values ('bts1','1234','슈가','대구',sysdate,10000,'래퍼');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from member;
ID PASS NAME ADDR REGDATE POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ----------------------------------------
bts1 1234 슈가 대구 24/04/12 10000 래퍼
bts2 1234 RM 일산 24/04/12 10000 리더
public class ConnectionTest {
public static void main(String[] args) {
String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user="scott";
String password="tiger";
try {
// 1. 오라클 드라이버 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버로딩성공!!");
// 2.DB서버 연결
Connection con = DriverManager.getConnection(url, user, password);
//상위타입으로 선언했지만(con) 실제 실행되는 것은 상속받은 하위클래스의 Connection객체가 리턴
System.out.println("연결성공!!"+con);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class InsertTest {
public static void main(String[] args) {
String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user="scott";
String password="tiger";
String sql="insert into member values('test','1234','test','광주',sysdate,10000,'목소리')";
try {
// 1.드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버로딩성공!!");
// 2. 연결하기
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("연결성공!!"+con);
// 3.SQL문을 실행하기 위한 객체를 만들기
Statement stmt = con.createStatement();
System.out.println("Statement객체 생성완료!!"+stmt);
// 4.SQL문 실행하기
int result = stmt.executeUpdate(sql);
// 5. 결과처리
System.out.println(result+"개 행 삽입성공!!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
public class SelectTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "select * from member";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
//모든 select문은 동일하게 작업
ResultSet rs = stmt.executeQuery(sql);
System.out.println(rs);
//결과처리 - 조회된 모든 레코드를 읽기
//while한번실행되는게 레코드하나읽는것
while(rs.next()) {
System.out.print(rs.getString("id")+"\t");
System.out.print(rs.getString("pass")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString(4)+"\t");
System.out.print(rs.getDate(5)+"\t");
System.out.print(rs.getInt("point")+"\t");
System.out.println(rs.getString(7));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

public class CloseTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "select * from member";
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, password);
stmt = con.createStatement();
//모든 select문은 동일하게 작업
rs = stmt.executeQuery(sql);
System.out.println(rs);
//결과처리 - 조회된 모든 레코드를 읽기
while(rs.next()) {//while한번실행되는게 레코드하나읽는것
System.out.print(rs.getString("id")+"\t");
System.out.print(rs.getString("pass")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString(4)+"\t");
System.out.print(rs.getDate(5)+"\t");
System.out.print(rs.getInt("point")+"\t");
System.out.println(rs.getString(7));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//ResultSet -> Statement -> Connection순서로 반납
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public class UppdateTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "update member ";//띄어쓰기해줘야 set인식할수있음
sql = sql+"set addr='서울특별시' ";
sql = sql+"where addr='서울시'";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class DeleteTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
StringBuffer sql = new StringBuffer();
//string은 하나하나객체로 만들어지니,
//문자열 조작이 빈번해지면 stringbuffer를 쓰기(한번만생성됨, 효율위해)!!
sql.append("delete member ");
sql.append("where id='test'");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con =DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
stmt.executeUpdate(sql.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SQL> select * from member;
ID PASS NAME ADDR REGDATE POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ---------------------------------------
### bts1 1234 슈가 대구 24/04/12 10000 래퍼
bts2 1234 RM 일산 24/04/12 10000 리더
bts3 1234 진 서울특별시 24/04/12 10000 멋져
bts4 1234 뷔 서울특별시 24/04/12 10000 서진이네
bts5 1234 지민 광주 24/04/12 10000 목소리
test 1234 test 광주 24/04/12 10000 목소리
6 rows selected.
delete 후
SQL> select * from member;
ID PASS NAME ADDR REGDATE POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ---------------------------------------
bts1 1234 슈가 대구 24/04/12 10000 래퍼
bts2 1234 RM 일산 24/04/12 10000 리더
bts3 1234 진 서울특별시 24/04/12 10000 멋져
bts4 1234 뷔 서울특별시 24/04/12 10000 서진이네
bts5 1234 지민 광주 24/04/12 10000 목소리
id와 pass가 일치하면
___님 로그인성공 메세지 출력
일치하지않으면
로그인실패
public class LoginTest {
public static void main(String[] args) {
String sql = "select * from where member id ='bts1' and pass='1234'";//로그인성공
// String sql = "select * from where member id ='bts11' and pass='1234'";//로그인실패
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
//모든 select문은 동일하게 작업
ResultSet rs = stmt.executeQuery(sql);
System.out.println(rs);
//결과처리 - 조회된 모든 레코드를 읽기
if(rs.next()) {
System.out.print(rs.getString("name")+"님 로그인 성공");
}else {
System.out.print("로그인 실패");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class PreparedInsertTest {
public static void main(String[] args) {
PreparedInsertTest obj = new PreparedInsertTest();
Scanner key = new Scanner(System.in);
System.out.print("아이디:");
String id = key.next();
System.out.print("패스워드:");
String pass = key.next();
System.out.print("성명:");
String name = key.next();
System.out.print("주소:");
String addr = key.next();
System.out.print("기타정보:");
String info = key.next();
obj.insert(id, pass, name, addr, info);
}
public void insert(String id, String pass, String name, String addr, String info) {
String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user="scott";
String password="tiger";
String sql="insert into member values('"+id+"','"+pass+"','"+name+"','"+addr+"',sysdate,10000,'"+info+"')";
// 큰따옴표가 들어가는 이유는 String이라서 큰따옴표로 묶어주느라
try {
// 1.드라이버로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("드라이버로딩성공!!");
// 2. 연결하기
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("연결성공!!"+con);
// 3.SQL문을 실행하기 위한 객체를 만들기
Statement stmt = con.createStatement();
System.out.println("Statement객체 생성완료!!"+stmt);
// 4.SQL문 실행하기
int result = stmt.executeUpdate(sql);
// 5. 결과처리
System.out.println(result+"개 행 삽입성공!!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}
}
}

public class PreparedUppdateTest {
public static void main(String[] args) {
PreparedUppdateTest obj = new PreparedUppdateTest();
Scanner key = new Scanner(System.in);
System.out.print("기존 주소:");
String bad = key.next();
System.out.print("변경할 주소:");
String aad = key.next();
obj.update(bad, aad);
}
public void update(String bad, String aad) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "update member "+ "set addr='"+aad+"' where addr="+"'"+bad+"'";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con =DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class PreparedDeleteTest {
public static void main(String[] args) {
PreparedDeleteTest obj = new PreparedDeleteTest();
Scanner key = new Scanner(System.in);
System.out.println("삭제할 아이디:");
String did = key.next();
obj.delete(did);
}
public void delete(String did) {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
StringBuffer sql = new StringBuffer();//string은 하나하나객체로 만들어지니, 문자열 조작이 빈번해지면 stringbuffer를 쓰기(한번만생성됨, 효율위해)!!
sql.append("delete member ");
sql.append("where id='"+did+"'");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con =DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
stmt.executeUpdate(sql.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class PreparedSelectTest {
public static void main(String[] args) {
PreparedSelectTest obj = new PreparedSelectTest();
obj.select();
}
public void select() {
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
String sql = "select * from member";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
//모든 select문은 동일하게 작업
ResultSet rs = stmt.executeQuery(sql);
System.out.println(rs);
//결과처리 - 조회된 모든 레코드를 읽기
while(rs.next()) {//while한번실행되는게 레코드하나읽는것
System.out.print(rs.getString("id")+"\t");
System.out.print(rs.getString("pass")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString(4)+"\t");
System.out.print(rs.getDate(5)+"\t");
System.out.print(rs.getInt("point")+"\t");
System.out.println(rs.getString(7));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public class PreparedLoginTest {
public static void main(String[] args) {
PreparedLoginTest obj = new PreparedLoginTest();
Scanner key = new Scanner(System.in);
System.out.print("아이디:");
String id = key.nextLine();
System.out.print("패스워드:");
String pass = key.nextLine();
obj.login(id, pass);
}
public void login(String id,String pass) {
String sql = "select * from member where id ='"+id+"' and pass='"+pass+"'";
String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
String user = "scott";
String password = "tiger";
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, password);
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
if(rs.next()) {
System.out.print(rs.getString("name")+"님 로그인 성공");
}else {
System.out.print("님 로그인 실패");//이거질문하기
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.