복습
- 드라이버 로딩
- drivermanager -> 로딩된 드라이버를 통해서 db서버에 접속해서 connection객체 리턴해줌
- statement 객체 생성 : connection객체가 제공하는 createstatement에서 함
- RuntimeException
- jvm이 예외처리해줌
- 프로그램 실행을 중단시켜줌
- 프로그램안에서 잘못된 구현에 의해서 발생되는게 대부분
- NullPointerException
- SQLException
- executeQuery() - ResultSet
- 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+")");
- 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
- 출력할 때 파일이 없으면 새로 만듦
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());
}
}
}
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 : 바이트 스트림
- ---Reader, Writer