2023. 4. 4. 01:23ㆍJava
프로젝트 내 src 내 javabasic 패키지 내 SqlPlus_emulator.java
package javabasic;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlPlus_emulator {
static Connection conn;
static ResultSet rs;
// 데이터베이스에접속을하기위해서는드라이버로딩을해야한다
static {
// static block 초기화
// static block 초기화는 기본적으로 메인메서드보다 더 클래스가
// 로딩이되면서 바로 실행이 되기때문에 static method보다
// 먼저 실행되는.클래스 로딩됨과 동시에 실행되는곳
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("JDBC드라이버를 찾을 수 없습니다.!!!");
}
}// STATIC 초기화 블럭에 드라이버 로딩
// 데이타베이스에접속하기위한 과정
// 메서드로만듦
static public void dbConn() throws Exception {
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user, pwd;
user = readEntry("사용자명 입력 :");
pwd = readEntry("비밀번호 입력 :");
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("오라클 데이타베이스에 접속됨... ....");
}
// 우리가입력한데이타값받아오기 키보드로부터 읽어온 데이타문자열을 리턴하는 메소드
static public String readEntry(String prompt) {
StringBuffer buf = new StringBuffer(); // String을만들기위한버퍼,String에내용을입력시버퍼에저장
System.out.print(prompt);
// 키보드로부터입력받기
try {
int ch = System.in.read();// 한문자씩읽기
// 엔터치면 뉴라인이라는값이들어옴
// while (ch != '\n' && ch != -1) {// 개행이 아니고 파일의 끝 -1이 아님
while (ch != '\n') {
buf.append((char) ch); // 스트링버퍼에다가 하나씩 형변환해서 데이타값을 넣어준다
// 스트링버퍼에 데이타값 보내기(위)
ch = System.in.read();// 한문자씩 읽어 버퍼에 계속 누적시킴append
} // while
// 읽은 문자열들으 readEntry메소드를 호출한 곳에 넘겨준다
return buf.toString().trim(); // 버퍼에있는내용을문자열로공백값제거해서넘기기
} catch (IOException e) {
// TODO Auto-generated catch block
return "";
} // 하나하나씩 데이타를 읽어오기
}
static public void inputQuery() throws Exception {// 키보드로부터입력받은값불러오기
// 버퍼드리더는키보드로부터입력받는노드스트림하나필요 시스템 인이라는인풋스트림이용
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String query = "";
Statement stmt = conn.createStatement();
System.out.print("SQL> ");
while ((query = bufr.readLine()) != null) {
if (query.equals("")) {
System.out.print("SQL> ");
continue;
} else {
try {
boolean isRs = stmt.execute(query.trim());
// System.out.println(isRs);
if (isRs) {// select문일 경우
rs = stmt.getResultSet();
// resultSet의 내용을 출력 메소드
outResultSet(rs);
} else { // 셀렉트 문이 아닐경우
int cnt = stmt.getUpdateCount();
// System.out.println(cnt);
// 로우=레코드
// String str = (cnt > 0) ? cnt+"개의 로우가 변경되었음":"변경된 레코드가 없습니다.";
String str = (cnt > 0) ? cnt + "개의 레코드가 변경되었음" : "변경된 레코드가 없습니다.";
System.out.println(str);
} // if
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("알수없는 명령어... .... ....");
}
} // if
System.out.print("SQL> ");
} // while
}
static public void outResultSet(ResultSet res) throws SQLException {
ResultSetMetaData md = res.getMetaData(); // 칼럼에 대한 정보를 얻기 위해서 ResultSetMetaData를 얻어오는 과정
int cCount = md.getColumnCount();
int cSize[] = new int[cCount]; // 열(칼럼/필드)의 사이즈를 얻기위한 배열 생성
String cNames[] = new String[cCount]; // 필드명의 이름을 얻어오기 위한 배열 생성
int totalCsize = 0;
for (int i = 0; i < cCount; i = i + 1) {
cNames[i] = md.getColumnName(i + 1);
cSize[i] = md.getColumnDisplaySize(i + 1);
totalCsize = totalCsize + cSize[i] + 3; // totalCsize += cSize[i]+5;
}
// 라인을 출력
String line = makeDisplay('-', totalCsize);
System.out.println(line);
// 컬럼명을 화면에 출력
System.out.print(" ");
for (int i = 0; i < cCount; i = i + 1) {
outValue(cNames[i], cSize[i]);
}
System.out.println();
System.out.println(line);
// 데이터를 추출하는 과정(Fetch 작업)후 화면에 출력
while (res.next()) {
System.out.print(" ");
// 하나의레코드에여러개의칼럼이있다
for (int i = 0; i < cCount; i = i + 1) {
String val = res.getString(i + 1);
// 데이타값 출력부분 화면크기에 맞춰출력
// 해당 데이타값을 출력을 하는데 그냥 한번 출력해보겠다.
// 사이즈계산하고 공백을 만들어주고 데이타를 출력했었지만
// 공백을 안주면 내용을 알아볼수가없다 다 붙어나온다
// 해당 칼럼수만큼 공백을 넣어준다
// outValue()메소드를 사용하려면 전체 칼럼 크기알아야겠죠
outValue(val, cSize[i]);
}
System.out.println();
System.out.println(line);
}
}
// 화면에 알맞게 출력하기위한 메소드
static public void outValue(String cName, int cSize) {
if (cName == null)
cName = "NULL";
else
System.out.print(cName);
byte b[] = cName.getBytes(); // 바이트의수만큼 배열이 생긴다 씨네임이 갖고있는 실제 바이트수구함
int bSize = b.length;
// 화면에 출력할때 필드명을 구해오는데 필드명이 ID일때 해당ID에대한 바이트길이
// 가 있다. 만약 20이 길이이면 ID에 해당되는 값이 나온다.만약 Name같은경우
// 이름만 출력했을때 실제 데이타값출력하려했을때 이름을 그냥 길게 출력하면
// 보기가 안좋다. 데이타 내용은 길고, 필드 사이즈만큼 크기가 설정되므로
// 데이타들이 막 섞여서 보기어려울수있다.필드영역크기 정해놓고그안에데이타씀
int pSize = cSize - bSize; // 여백사이즈,현재 원래 칼럼의 영역사이즈가있고 c네임,네임필드가 되는데
// 화면에 출력하려면 네임이 출력이 되고, 그 담에 연봉이 붙어나올텐데실제 칼럼 사이즈에서
// 네임이 차지하는 자릿수를 빼게 되면,나머지 영역이 생긴다.그 나머지 영역만큼 다시 화면에 추가를시킨다.
// 실제 칼럼 사이즈만큼 영역잡는다.
// 화면에 필드명을 찍어주고 그 필드명이 만약 작을 경우에는 영보다 작으면
// psize안구해도 되지만 클경우에는 실제 psize가 0보다 크다는건
// cname보다 칼럼사이즈가 크다는거라서 큰 거 만큼 psize만큼 공백으로
// 채우겠다는 의미
// int pSize = cSize - cName.length();
if (pSize < 0) {
pSize = 0;
}
String pStr = makeDisplay(' ', pSize);// 화면에공백출력pSize만큼
System.out.print(pStr);
}
static public String makeDisplay(char ch, int size) {
// 화면을 만듦 size만큼 화면을 만들자 ch들어온문자를 담는 배열
char makeLine[] = new char[size];
for (int i = 0; i < makeLine.length; i = i + 1) {
makeLine[i] = ch;
}
return new String(makeLine);// 스트링타입으로만들어출력하겠다의미
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
dbConn();
inputQuery();
}
}
실행 결과
사용자명 입력 :scott
비밀번호 입력 :a1234
오라클 데이타베이스에 접속됨... ....
SQL>
SQL> SELECT * FROM MEMBER
-----------------------------------------------------------------------------------------------------------------------
NO NAME HP ADDR
-----------------------------------------------------------------------------------------------------------------------
16 송인자 010-4321-3214 충청도
-----------------------------------------------------------------------------------------------------------------------
16 이지연 010-4221-2214 충청도
-----------------------------------------------------------------------------------------------------------------------
16 장진미 010-4121-2254 충청도
-----------------------------------------------------------------------------------------------------------------------
17 오원석 010-4129-3254 충청도
-----------------------------------------------------------------------------------------------------------------------
18 박건우 010-4121-2214 충청도
-----------------------------------------------------------------------------------------------------------------------
9 양호중 010-999-9999 '서울시강남구도곡동'
-----------------------------------------------------------------------------------------------------------------------
10 양호호 010-999-9299 서울시강남구양재동
-----------------------------------------------------------------------------------------------------------------------
11 안소희 010-199-9299 %서울시
-----------------------------------------------------------------------------------------------------------------------
6 남보라 010-333-2323 경기도 성남시 분당구 서현동
-----------------------------------------------------------------------------------------------------------------------
14 김수기 010-090-2309 전라남도 해남시 해남군 땅끝마을
-----------------------------------------------------------------------------------------------------------------------
1 홍길동 010-1111-1111 서울시 종로구 흥인동
-----------------------------------------------------------------------------------------------------------------------
12 강민정 010-199-9291 충청남도 강진
-----------------------------------------------------------------------------------------------------------------------
3 안다미 010-1111-2131 서울시 관악구 신림동
-----------------------------------------------------------------------------------------------------------------------
7 김나래 010-1111-2121 서울시 송파구 잠실새내동
-----------------------------------------------------------------------------------------------------------------------
4 김지성 010-1111-9121 서울시 강동구 상일동
-----------------------------------------------------------------------------------------------------------------------
5 박만구 010-1121-9121 경기도 하남시 미사동
-----------------------------------------------------------------------------------------------------------------------
2 임평화 010-2121-9121 서울시 은평구 한옥마을
-----------------------------------------------------------------------------------------------------------------------
8 이문형 010-1237-1237 서울시
-----------------------------------------------------------------------------------------------------------------------
13 금미진 010-3434-3434 서울시 강북구 수유동
-----------------------------------------------------------------------------------------------------------------------
15 김소전 010-190-2309 경기도 부천시 상미동
-----------------------------------------------------------------------------------------------------------------------
6 장동민 010-212-2121 서울 마포구 아현동
-----------------------------------------------------------------------------------------------------------------------
SQL> INSERT INTO MEMBER(NO, NAME, HP, ADDR) VALUES (19, '공성구', '010-9999-9999', '서울시 종로구 낙원동 91-909')
1개의 레코드가 변경되었음
SQL> SELECT * FROM MEMBER;
알수없는 명령어... .... ....
SQL> SELECT * FROM MEMBER
-----------------------------------------------------------------------------------------------------------------------
NO NAME HP ADDR
-----------------------------------------------------------------------------------------------------------------------
16 송인자 010-4321-3214 충청도
-----------------------------------------------------------------------------------------------------------------------
16 이지연 010-4221-2214 충청도
-----------------------------------------------------------------------------------------------------------------------
16 장진미 010-4121-2254 충청도
-----------------------------------------------------------------------------------------------------------------------
17 오원석 010-4129-3254 충청도
-----------------------------------------------------------------------------------------------------------------------
18 박건우 010-4121-2214 충청도
-----------------------------------------------------------------------------------------------------------------------
19 공성구 010-9999-9999 서울시 종로구 낙원동 91-909
-----------------------------------------------------------------------------------------------------------------------
9 양호중 010-999-9999 '서울시강남구도곡동'
-----------------------------------------------------------------------------------------------------------------------
10 양호호 010-999-9299 서울시강남구양재동
-----------------------------------------------------------------------------------------------------------------------
11 안소희 010-199-9299 %서울시
-----------------------------------------------------------------------------------------------------------------------
6 남보라 010-333-2323 경기도 성남시 분당구 서현동
-----------------------------------------------------------------------------------------------------------------------
14 김수기 010-090-2309 전라남도 해남시 해남군 땅끝마을
-----------------------------------------------------------------------------------------------------------------------
1 홍길동 010-1111-1111 서울시 종로구 흥인동
-----------------------------------------------------------------------------------------------------------------------
12 강민정 010-199-9291 충청남도 강진
-----------------------------------------------------------------------------------------------------------------------
3 안다미 010-1111-2131 서울시 관악구 신림동
-----------------------------------------------------------------------------------------------------------------------
7 김나래 010-1111-2121 서울시 송파구 잠실새내동
-----------------------------------------------------------------------------------------------------------------------
4 김지성 010-1111-9121 서울시 강동구 상일동
-----------------------------------------------------------------------------------------------------------------------
5 박만구 010-1121-9121 경기도 하남시 미사동
-----------------------------------------------------------------------------------------------------------------------
2 임평화 010-2121-9121 서울시 은평구 한옥마을
-----------------------------------------------------------------------------------------------------------------------
8 이문형 010-1237-1237 서울시
-----------------------------------------------------------------------------------------------------------------------
13 금미진 010-3434-3434 서울시 강북구 수유동
-----------------------------------------------------------------------------------------------------------------------
15 김소전 010-190-2309 경기도 부천시 상미동
-----------------------------------------------------------------------------------------------------------------------
6 장동민 010-212-2121 서울 마포구 아현동
-----------------------------------------------------------------------------------------------------------------------
SQL>
SQL>
알수없는 명령어... .... ....
SQL>
알수없는 명령어... .... ....
SQL>
java.sql.ResultSetMetaData
한개의 ResultSet 객체 안에서 열들으 종류(형태,유형)와 속성들에 대한 정보를 얻기 위하여 사용되어 질 수 있는 한 객체이다.
EOF (End Of File)
파일의 끝, 더 이상 읽을 수 있는 데이타가 없다는 것을 말한다고 한다.
IDE 나 터미널이나 콘솔창에서 EOF 을 발생시키려면 윈도우 운영체제 기준으로 Ctrl + z (Ctrl + Z) 로 입력을 해주어야 한다고 한다.
[Java] 💾 EOF (End Of File) (velog.io)
[Java] 💾 EOF (End Of File)
파일의 끝 (End Of File), 즉 더 이상 읽을 수 있는 데이터가 존재하지 않는 것을 뜻한다. IDE나 터미널에서 EOF를 발생시키려면 윈도우 기준 ctrl+z로 입력을 주어야 한다.ScannerhasNext()를 사용한다. 입력
velog.io
String java.io.BufferedReader.readLine() throws IOException
readLine() 메서드는 어떠한 줄-끝맺음 문자들을 포함하지 않는 상태로 그 줄의 내용들을 포함하는 문자열을 반환하거나, 만약에 스트림의 끝에 도달하였다면 null 을 반환한다.
사용자명을 입력받고 비밀번호를 입력받을 때 쓰는 사용자 정의 메서드인 readEntry(String prompt) 에서
한문자씩 읽는 read() 메서드가 있는데 입력장치로 입력받은 데이타의 다음 바이트를 정수형으로 반환하거나, 만약에 스트림의 마지막에 도달된다면 -1 을 반환하게 된다. 그런데 read() 메서드 다음 줄에 쓴 while 반복문에서 정수형 값 ch 변수에 개행이 아니거나 파일의 끝(스트림의 끝, 즉 -1 값)이 아닐 때 까지 실행하라고 되어 있다. Enter 키를 치면 개행이라는 값이 들어오는데 while 문 내에 조건문에서 개행이면 반복문을 그만두고 파일의 끝(스트림의 끝, 즉 -1 값)이어도 반복문을 그만두라고 되있지만 Ctrl + z (Ctrl + Z) 를 쳐서 파일의 끝이라고 신호를 보냈지만 오류가 난다. 이클립스 IDE 콘솔창 오류 문제라고 하는 말도 있다. 자세한 것은 파악이 되지 않아서 찾아서 따라 해봐도 오류가 계속 나오거나 생각한 대로 실행되지를 않아서 찾는데도 시간이 오래 걸린다. 개행문자를 입력받을 경우에만 반복문을 나오는 것으로 쓴다.
'Java' 카테고리의 다른 글
Java setAutoCommit(boolean autoCommit) (0) | 2023.05.10 |
---|---|
Java getActionCommand() (0) | 2023.04.06 |
Java Singleton Type Class (0) | 2023.03.30 |
Java afterLast() (0) | 2023.03.28 |
Java JDBC™ 4.2 API (0) | 2023.02.28 |