복습

  1. 드라이버 로딩
    • 어떤 db서버를 연결하는지에 따라서 로등
  2. drivermanager -> 로딩된 드라이버를 통해서 db서버에 접속해서 connection객체 리턴해줌
  3. statement 객체 생성 : connection객체가 제공하는 createstatement에서 함

 

  • RuntimeException 
    • jvm이 예외처리해줌
    • 프로그램 실행을 중단시켜줌
    • 프로그램안에서 잘못된 구현에 의해서 발생되는게 대부분
  • NullPointerException
  • SQLException
    • 테이블 안 만들었는데 넣는거

 

  • executeQuery() - ResultSet
    • select 명령
  • excuteUpdate() - int값 리턴
    • insert - 1
    • delete - 삭제된 행의 갯수
    • update - 수정된 행의 갯수
    • ddl - 0

 

데이터 삽입

stmt.executeUpdate("insert into student values ('둘리', 100)");

 

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectData1 {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				Statement stmt = conn.createStatement()){
			ResultSet rs = stmt.executeQuery("select * from student");
			while(rs.next()) {
				System.out.println(rs.getString("name")+"학생은 "+rs.getInt("score")+"점 입니다.");
			}				
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		}
	}
}
  • try 리소스 구문으로 예외처리
  • try (Connection conn = DriverManager.getConnection(url, user, passwd);
    Statement stmt = conn.createStatement())
    • try블록이 끝날 때, 자동으로 close가 된다. 
    • 아무변수나 선언 X
      • closerable 상속받는 객체만 만들기 가능 
      • 닫아줘야하는 객체만
    • 변수 선언과 객체 생성 동시에 
    • 얼마든지 올 수 있음 (몇개든)

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class InsertData2 {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				PreparedStatement pstmt = conn.prepareStatement("insert into student values (?, ?)");
				Scanner scan = new Scanner(System.in);){
			while(true) {
				System.out.print("학생 이름을 입력하세요 : ");
				String name = scan.nextLine();
				System.out.print("학생 점수를 입력하세요 : ");
				int score = Integer.parseInt(scan.nextLine());
				pstmt.setString(1,  name);
				pstmt.setInt(2, score);
				pstmt.executeUpdate();
				System.out.println("student 테이블에 데이터 삽입 완료");
				System.out.print("계속 입력하겠습니까?(y/n)");
				String aws = scan.nextLine();
				if (aws.equalsIgnoreCase("y")) {
					continue;
				} 
				System.out.println("student 테이블 데이터 삽입 작업 종료");
				break;
			}
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		} 
	}
}
  • statement
    • 그때, 그때 sql명령을 메소드에 담아서 호출
    • 바이너리 데이터 처리 못 함
    • stmt.executeUpdate("insert into student values ('둘리', 100)");
      • 직접 지정할 때, 문자면 단일인용부호 사용해야한다. 
    • stmt.executeUpdate("insert into student values ("+name+","+scroe+")");
      • scanner로 객체 받을 때, 적는게 어렵
  •  PreparedStatement
    • sql 명령 수행
    • 객체 생성할 때, 미리 sql 명령 준비시켜놓음
      • 미리 생성된 sql 명령만 실행 가능
      • sql 명령의 해석이 되어져있음
    • 똑같은 sql문을 여러번 수행할 때, 데이터 값만 달라졌을 때 적합함
    •  (?, ?) - 동적 파라미터
      • 미지의 데이터 값
      • 나중에 정할 때 좋음
      • pstmt.setString(1,  name);
    • 바이너리 값 넣을 수 있다. 
      • 이미지,, 
    • pstmt.executeUpdate();
      • 아구먼트 쓰면 안 됨
      • 반드시 수행해줘야 sql에 업데이트 된다. 

 

파일

  • 절대 패스
    • C:/Temp/test.png
    • C:\\Temp\\test.png
  • 상대 패스 
    • 현재 디렉토리가 어디있냐에 따라 달름
    • 프로젝트 폴더가 현재 디렉토리가 된다. 
    • ../../Temp/test.png
package mysql.level1;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class InsertImage {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				Scanner scan = new Scanner(System.in);
				PreparedStatement pstmt = conn.prepareStatement("INSERT INTO imgtest (filename, filecontent) VALUES (?, ?)")){
			System.out.print("저장할 이미지 파일명을 절대 패스로 입력하세요 : ");
			String name = scan.nextLine();
			File imgFile = new File(name);
			if (imgFile.exists()) {
				int pointIndex = imgFile.getName().indexOf('.');
				String imgName = imgFile.getName().substring(0, pointIndex);
				System.out.println(imgFile.getName().substring(0, pointIndex));
				FileInputStream fin = new FileInputStream(imgFile); 
				pstmt.setString(1, imgName); 
				pstmt.setBinaryStream(2, fin, (int)imgFile.length());
				pstmt.executeUpdate(); 
				System.out.println("이미지 삽입 성공");
			} else {
				System.out.println("[오류] 이미지가 존재하지 않음");
			}
		} catch(Exception e) {
			System.out.println(e);
		}
	}
}
  • INSERT INTO imgtest (filename, filecontent) VALUES (?, ?)
    • 순서대로 넣는거면 컬럼명 생략 가능
  • File imgFile = new File(name);
    • 패스 정보 줌
  • imgFile.getName().indexOf('.');
    • 파일이름만 뽑아 내는 것
      • 점 이후 다 날리는 것
    • ex) c:/Temp/hi.png
  • pstmt.setBinaryStream(2, fin, (int)imgFile.length());
    • 읽어서 db테이블에 넣어줌
    • 실행되기 전에 이미지 파일 읽어서 넣어줌
    • 첫번째 매개변수 : 매개변수 번호
    • 두번째 매개변수 : inputStream 개체
    • 세번째 매개변수 : 바이트 수

 

파일 저장되어 있는거 읽고 쓰기

package mysql.level1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

public class SelectImage {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		}
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				Scanner scan = new Scanner(System.in);
				PreparedStatement pstmt = conn.prepareStatement("SELECT filename, filecontent FROM imgtest WHERE filename = ?");) {
			System.out.print("읽으려는 이미지의 파일명(확장자제외)을 입력하세요 : ");
			String name = scan.nextLine();
			pstmt.setString(1, name);
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				File imgFile = new File("c:/Temp/"+rs.getString("filename")+"_new.png");
				InputStream is = rs.getBinaryStream("filecontent");
				FileOutputStream fos = new FileOutputStream(imgFile);
				byte[] b = new byte[2048];
				int n;
				while ((n = is.read(b)) > 0) {
					fos.write(b, 0, n);
				}
				fos.close();
				rs.close();
			} else {
				System.out.print(name + "이라는 파일명으로 저장된 이미지가 존재하지 않습니다. ");
			}
			System.out.println("이미지 읽기 성공");
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}
  • rs.getBinaryStream("filecontent");
    • inpustream객체 리턴
    • 읽을 수 있는 객체 
  • stream 
    • 데이터 통로 역활
    • inputStream 통로 만들고
    • outputStream 통로 만들고
  • (n = is.read(b)) > 0
    • db테이블에서 2048byte 읽음
  • 출력할 때 파일이 없으면 새로 만듦

 

SelectData2.java

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class SelectData2 {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				PreparedStatement pstmt = conn.prepareStatement("select score from student where name = ?");
				Scanner scan = new Scanner(System.in);){
		    System.out.print("학생 이름을 입력하세요 : ");
		    String name = scan.nextLine();
		    pstmt.setString(1, name);
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) 
				System.out.println(name + "학생의 점수 : " + rs.getInt("score"));
			 else 			
				 System.out.println(name + "학생에 대한 데이터가 없습니다.");
			 System.out.println("수행 종료...");
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		}
	}
}
  • next가 한번이라도 해야 테이블에 데이터가 있는지 안다. 
  • 데이터가 없으면 resultset객체는 반환되는데 (비어있는 resultset)
    • 첫번째 값이 false
    • 값이 없는 건 next() 객체를 한번이라도 수행해야 알 수 있다.

 

SelectData3.java

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class SelectData3 {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				PreparedStatement pstmt = conn.prepareStatement("select name, score from student where score>=  ? order by score desc");
				Scanner scan = new Scanner(System.in);){
		    System.out.print("점수를 입력하세요 : ");
		   int score = Integer.parseInt(scan.nextLine());
		    pstmt.setInt(1, score);
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println("[ 점수가 " + score + " 이상인 학생 이름(점수가 높은 순) ]");
				do {
					System.out.println(rs.getString("name") + " : " + rs.getInt("score"));
				} while(rs.next());
			} else 			
				 System.out.println("점수가 " + score + " 이상인 학생은 존재하지 않습니다.");
			 System.out.println("수행 종료...");
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		}
	}
}
  • do while문 사용

 

UpdateDate.java

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;
import java.sql.PreparedStatement;

public class UpdateData {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				PreparedStatement pstmt = conn.prepareStatement("update student set score = ? where name = ?");
				Scanner scan = new Scanner(System.in);){
			System.out.print("학생 이름을 입력하세요 : ");
		    String name = scan.nextLine();
			System.out.print("학생 점수를 입력하세요 : ");
			int score = Integer.parseInt(scan.nextLine());
			pstmt.setInt(1,  score);
		    pstmt.setString(2, name);
			int updateNum = pstmt.executeUpdate();
			System.out.println("student 테이블에서 " +updateNum + "행 변경 완료");						
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		} 
	}
}

 

package mysql.level1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;
import java.sql.PreparedStatement;

public class DeleteData2 {
	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException cnfe) {
			System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
			return;
		} 
		String url = "jdbc:mysql://localhost:3306/jdbcdb?characterEncoding=UTF-8&serverTimezone=UTC";
		String user = "root";
		String passwd = "1234";
		try (Connection conn = DriverManager.getConnection(url, user, passwd);
				PreparedStatement pstmt = conn.prepareStatement("delete from student where score between ? and ?");
				Scanner scan = new Scanner(System.in);){
			System.out.print("삭제하려는 최저 점수 입력 : ");
			int minScore = Integer.parseInt(scan.nextLine());
			System.out.print("삭제하려는 최고 점수 입력 : ");
			int maxScore = Integer.parseInt(scan.nextLine());
			pstmt.setInt(1, minScore);
			pstmt.setInt(2, maxScore);
			int delNum = pstmt.executeUpdate();
			System.out.println("student 테이블에서 " + delNum + "행 삭제 완료");									
		} catch (SQLException se) {
			System.out.println(se.getMessage());
		} 
	}
}

[java.io 패키지]

  • File 
    • 자바 프로그램안에서 파일에 대한 처리를 하겠다. 
    • 자바 - 객체로 다 봐서 file사용함 
    • 운영체제에 무관해서 io 설계한 것
  • 입출력 - 실제 주고받는 객체는 동일함 (스트림 객체)
    •  파일
      • 파일을 열어서 내보내겠다.
    • 네트워크
      • 소켓입출력을 통해서
      • 최종 목적지 : 소켓
    • 표준 입출력
      • system.out.println()
      • scanner - System.in (키보드로부터 읽는다)
        • system이라는 클래스에 system.in, system.out, system.err이라는 static형 멤버 변수를 정의해놨음
          • 표준 입력을 관장하는 친구 - system.in
          • system.out, system.err -> 모니터 화면으로 나옴
  • 스트림 객체
    • 입력용이냐 출력용이냐
    • 바이트단위의 입출력? 문자 단위의 입출력?
  • 클래스 이름에
    • inpuststrem, ---OuputStream : 바이트 스트림
      • 이미지같은 파일을 io할 때, 
    • ---Reader, Writer 
      • 파일 읽고, 쓰는 것

'study > JAVA 전문가' 카테고리의 다른 글

[sql] roll back 연습문제  (0) 2021.12.21
[JDBC] 방명록  (0) 2021.12.21
JDBC  (0) 2021.12.20
mysql 5  (0) 2021.12.20
mysql 4 - 연습문제  (0) 2021.12.20

+ Recent posts