728x90
반응형
과제.
c/s 환경에서 아래와 같이 프로그램을 만들어보자.
******** 메뉴 *******
1. 학생 리스트
학번 이름 연락처 성별 주소
2. 성적 리스트
학번 이름 국어 수학 영어 총점 평균
자바와 SQL 연동
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBcon {
private static Connection conn; // 주요하게 생각하는것을 컨넥션 객체를 사용할 수 있게
//스테틱이 있으면 클래스만 불러도 된다 메소드 호출시
public static Connection getConnection() throws SQLException, ClassNotFoundException {// 리턴타입은 Connection
String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
String uid = "root";
String upw = "1234";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, uid, upw);
return conn;
}
}
서버
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class ServerTask {
public static void main(String[] args) {
System.out.println("서버가 실행되었습니다.");
Scanner sc = new Scanner(System.in);
ServerSocket serverSocket = null;
Socket socket = null;
ScoreDAO scoreDAO = new ScoreDAO();
BufferedReader br = null;
BufferedWriter bw = null;
try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
System.out.println("서버가 준비되었습니다.");
socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
System.out.println("클라이언트가 접속되었습니다.");
br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
String dan = br.readLine();
int intdan = Integer.parseInt(dan);
switch(intdan) {
case 1:
bw.write(scoreDAO.list()); // scoreDAO.list() 를 출력
System.out.println(scoreDAO.list());
bw.flush(); // 남아있는 데이터를 모두 출력시킴
break;
case 2:
bw.write(scoreDAO.scoreList());
System.out.println(scoreDAO.scoreList());
bw.flush();
break;
}
}catch (IOException e){
e.printStackTrace();
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
if(br != null) try{br.close();}catch (IOException e){}
if(bw != null) try{bw.close();}catch (IOException e){}
if(socket != null) try{socket.close();}catch (IOException e){}
if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다.");
}
}
클라이언트
import java.io.*;
import java.net.Socket;
import java.sql.SQLException;
import java.util.Scanner;
public class ClientTask {
public static void main(String[] args) {
System.out.println("클라이언트가 실행되었습니다.");
Socket socket = null;
BufferedReader br = null;//받을거기 때문에
BufferedWriter bw = null;
try{
System.out.println("서버와 연결을 시도중입니다");
socket = new Socket("192.168.6.13",3579);//접속이 잘되면 소켓생성
System.out.println("연결되었습니다");
br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("1번 학생리스트, 2번 성적리스트");
System.out.println("번호를 입력하세요");
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
System.out.println(input + "번호");
bw.write(input+"\n");
bw.flush();
System.out.println("전송되었습니다.");
String list ="";
while((list = br.readLine()) != null){
System.out.println(list);
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(br != null) try{br.close();}catch(IOException e){}
if(socket != null) try{socket.close();} catch (IOException e){}
}
System.out.println("프로그램이 종료되었습니다");
}
}
DAO 메소드 부분
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ScoreDAO {
public String list() throws ClassNotFoundException, SQLException {
Connection conn = DBcon.getConnection();
StringBuilder sql = new StringBuilder();
sql.append("select st_id, st_name, st_hp, st_gender, st_address,st_rdate from tb_student order by st_id");
PreparedStatement pstmt = conn.prepareStatement(sql.toString());
ResultSet rs = pstmt.executeQuery();
String s = ""; // 널로 초기값 지정 -> 와일문을 통할 때 변수만 선언할 경우 문제가 발생
while (rs.next()) {
String st_id = rs.getString("st_id");
String st_name = rs.getString("st_name");
String st_hp = rs.getString("st_hp");
String st_gender = rs.getString("st_gender");
String st_address = rs.getString("st_address");
String st_rdate = rs.getString("st_rdate");
s += st_id + ": " + st_name + ": " + st_hp +
": " + st_gender + ": "+st_address+": "+st_rdate+"\n";
}// 와일문 내 s만 사용한 이유는 return해야 하는 값인데 String 사용시 반복문 내에서만
// 수행이 되기 때문에
return s; // 리턴값을 반환하여 서버에 넣어주기 위해 리턴사용
}
public String scoreList() throws ClassNotFoundException, SQLException{
Connection conn = DBcon.getConnection();
StringBuilder sql = new StringBuilder();
System.out.println("성적보기");
sql.append("select st_id, st_name, sc_kor,sc_math,sc_eng,sc_avg,sc_sum \n" +
" from tb_student left join tb_score on tb_student.st_id = tb_score.sc_id;");
PreparedStatement pstmt = conn.prepareStatement(sql.toString());
ResultSet rs = pstmt.executeQuery();
String l = "";
while (rs.next()) {
String st_id = rs.getString("st_id");
String st_name = rs.getString("st_name");
int sc_kor = rs.getInt("sc_kor");
int sc_math = rs.getInt("sc_math");
int sc_eng = rs.getInt("sc_eng");
int sc_avg = rs.getInt("sc_avg");
int sc_sum = rs.getInt("sc_sum");
l +=" 아이디 : "+st_id + " 이름 : " + st_name + " 국어 : " + sc_kor +
"수학 : " + sc_math + "영어 : "+sc_eng+" 평균 : "+sc_avg+" 합계: "+sc_sum + "\n";
}
return l;
}
}
반응형
'JDBC' 카테고리의 다른 글
JDBC 학생 성적 관리 프로그램 최종 (0) | 2022.11.01 |
---|---|
JDBC(영어 단어장, 학생 성적 관리 프로그램 ) (0) | 2022.10.19 |
JDBC (select, delte,PreparedStatement) (0) | 2022.10.19 |
JDBC (설치 및 연동, 기본) (0) | 2022.10.19 |