BatchQuery

여러 개의 sql문을 한꺼번에 전송하는 일괄 처리 방식을 살펴보자. 여러 개의 sql문을 작성하여 Statement의
 addBatch(String sql), executeBatch() 메소드로 일괄 처리한다.

createStatement를 통해서 transaction을 만든다 모두 성공해야 commit하나라도 틀리면 취소한다.
executeBatch를 통해 실행을 하고 배열을 반환하는데 배열이 모두 true이어야 성공한다.

package jdbc.day05;

import java.sql.*;

public class BatchQuery {

	public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:XE";
		String user = "scott", pwd = "tiger";
		Connection con = DriverManager.getConnection(url, user, pwd);
		// m44-403-540
		/*
		 * 여러 개의 sql문을 한꺼번에 전송하는 일괄 처리 방식을 살펴보자. 여러 개의 sql문을 작성하여 Statement의
		 * addBatch(String sql), executeBatch() 메소드로 일괄 처리한다.
		 */
		con.setAutoCommit(false);// 자동 커밋 취소
		boolean isCommit = false;
		Statement st = con.createStatement();
		st.addBatch("insert into memo values(memo_seq.nextval," + "'김길동','Batch 테스트1',sysdate)");
		st.addBatch("insert into memo values(memo_seq.nextval," + "'윤길동','Batch 테스트2',sysdate)");
		st.addBatch("insert into memo values(memo_seq.nextval," + "'최길동','Batch 테스트3',sysdate)");
		st.addBatch("insert into memo values(memo_seq.nextval," + "'이길동','Batch 테스트4',sysdate)");
		st.addBatch("insert into memo values(memo_seq.nextval," + "'임길동','Batch 테스트5',sysdate)");
		
		try {
			int [] updateCount=st.executeBatch();
			isCommit=true;
		} catch (SQLException e) {
			isCommit=false;
			e.printStackTrace();
		}
		if(isCommit){ //트랜잭션 처리
			//전부 성공해야 commit
			con.commit();
		}else{
			//하나라도 실패하면 rollback;
			con.rollback();
		}
		con.setAutoCommit(true);//자동 커밋 상태로 복원
		
		String sql="SELECT * FROM memo ORDER BY idx DESC";
		ResultSet rs=st.executeQuery(sql);
		
		while(rs.next()){
			int idx=rs.getInt(1);
			String name=rs.getString(2);
			String msg=rs.getString(3);
			String wdate=rs.getString(4);
			System.out.println(idx+"\t"+name+"\t"+msg
					+"\t"+wdate);
		}
		rs.close();
		st.close();
		con.close();

	}

}//////////////////////////////////







ResultSetMetaData 클래스
- ResultSet 에 관한 정보를 알 수 있는 클래스
   컬럼명, 컬럼의 자료형, 자료형 크기,
   디스플레이사이즈 등등의 정보가 필요하다면
   ResultSetMetaData클래스를 사용한다.

package jdbc.day05;

import java.sql.*;
import java.util.*;

public class ResultSetMetaDataTest {

	public static void main(String[] args) 
	throws Exception
	{
		//m86-771-640
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url ="jdbc:oracle:thin:@localhost:1521:XE";
		String user="scott", pwd="tiger";
		Scanner sc=new Scanner(System.in);
		Connection con=DriverManager.getConnection(url,user,pwd);
		Statement st=con.createStatement();
		ResultSet rs=null;
		
		System.out.println("SELECT문을 입력하세요=>");
		String sql="";
		while((sql=sc.nextLine())!=null){
			//System.out.println(sql);
			int index=sql.indexOf(";");
			//System.out.println(index);
			//';'이 들어있는 부분의
			//   인덱스 번호를 반환한다.
			//   없으면 -1 을 반환한다.
			if(index!= -1){
				sql=sql.substring(0, index);
				System.out.println(sql);
			}
			boolean isRs=st.execute(sql);
			//select문이면 true, 그 외 문장은 false
			System.out.println("isRs="+isRs);
			if(isRs){//select 문이라면
				rs=st.getResultSet();
				myMetaData(rs);
			}else{//그외 문장이라면
				int cnt=st.getUpdateCount();
				System.out.println(cnt+"개 레코드 변경됨");
			}
			
		}//while---------------
		if(rs!=null) rs.close();
		if(st!=null) st.close();
		if(con!=null) con.close();
	}//main()--------------------------
	
	public static void myMetaData(ResultSet rs)
	throws SQLException{
		//결과 테이블에 대한 정보를 뽑아보자.
		ResultSetMetaData rsmd=rs.getMetaData();
		int colCount=rsmd.getColumnCount();
		System.out.println("컬럼수: "+colCount);
		for(int i=1; i<=colCount;i++){
			System.out.println("-------------------");
			String colName=rsmd.getColumnLabel(i);
			String colType=rsmd.getColumnTypeName(i);
			int colSize=rsmd.getColumnDisplaySize(i);
			int n=rsmd.isNullable(i);
			//NOT NULL=> 0을 반환, NULL허용=>1을 반환
			String isNull=(n==1)?"NULL허용":"NOT NULL";
			System.out.println("컬럼명: "+colName+": "+colType
					+", "+isNull+", ["+colSize+"]");
			
		}//for-------------
		System.out.println("-------------------");
	}//----------------------------------
	

}////////////////////////////////////

IO ==> 입출력 작업과 관련된 패키지

데이터소스(source) : 데이터가 있는 곳(키보드, 파일, 원격컴퓨터, 메모리..)
데이터도착지(destination) : 데이터가 도달하는 곳 (모니터, 파일, 원격컴퓨터, 프린터..)
데이터소스==>자바프로그램==>데이터도착지
    InputStream                 OutputStream
Stream을 이용하여 데이터를 프로그램족으로 읽어들이고, 내보내고 한다.

1. Stream의 특징
1) FIFO 구조 (First In First Out)
2) 단방향
3) 유연함
2. Stream의 유형
1) 1byte기반 스트림 : 데이터를 1byte단위로 내보내고 읽음
2) 2byte기반 스트림 : 데이터를 2byte단위(문자기반)로 내보내고 읽음
3) Node 스트림 : 데이터소스나 목적지와 직접 노드 연결할 수 있는 스트림
4) Filter 스트림 : 데이터소스나 목적지와 직접 연결은 못하고, 노드스트림을 통해 연결된 스트림을 가공 처리하는 스트림

1바이트 기반 스트림

InputStream, 노드스트림
- 1byte기반 스트림
- Node스트림 (키보드와 노드 연결)

System.out : 콘솔과 노드연결한 출력 스트림
void write(int data) : data를 출력함

package io.day01;

import java.io.*;
import java.io.IOException;

public class InputStreamTest {
	public static void main(String[] args) 
	throws IOException
	{
		InputStream is =System.in;
		int input=0, count=0;
		System.out.println("입력하세요=>");
		//ctrl + C를 누르면 -1을 반환한다.
		while((input=is.read())!=-1) {
			System.out.print((char)input);
			count++;
			if(input=='x'||input=='X')	break;
		}
		System.out.println(count+"bytes 입력 받음");
		is.close();
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day01;
import java.io.*;

public class SysInOut {
	public static void main(String[] args) throws IOException
	{
		InputStream is = System.in;
		//키보드와 노드 연결 스트림, 1byte기반
		PrintStream ps = System.out;//모니터 상의 콘솔과 노드연결, 1byte 기반
		ps.println("입력하세요=>");
		int n=0, count=0;
		while((n=is.read())!=-1) {
			ps.write(n);
			count++;
		}
		ps.println(count+"bytes 일고 씀");
		is.close();
		ps.close();
	}
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day01;
import java.io.*;

public class SysInOut2 {
	public static void main(String[] args) throws IOException
	{
		InputStream is = System.in;
		//키보드와 노드 연결 스트림, 1byte기반
		PrintStream ps = System.out;//모니터 상의 콘솔과 노드연결, 1byte 기반
		ps.println("입력하세요=>");
		int n=0, count=0;
		//달걀(데이터)을 달걀판에 담아 읽고 써보자
		byte[] data =new byte[6];
		while((n=is.read(data))!=-1) {
			//데이터는 byte배열에 담겨있으므로, 해당 배열을 write한다.
			ps.write(data);
			count++;
		}
		ps.println(count+"반복문 횟수");
		is.close();
		ps.close();
	}
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

FileInputStream
데이터 소스 : 파일 (SysInOut.java)==> 노드스트림(FileInputStream)
데이터 목적지 : 콘솔 ==> 노드스트림(System.out)

package io.day01;
import java.io.*;

public class FIStream {
	public static void main(String[] args) throws IOException {
		String file="src/io/day01/SysInOut.java";
		FileInputStream fis=new FileInputStream(file);//노드 연결
		int n=0, count=0;
		//파일의 끝을 만나면 -1을 반환한다.
		while((n=fis.read())!=-1) {
			System.out.write(n);
			count++;
		}
		System.out.println("파일크기=>총"+count+"bytes");
		fis.close();
		System.out.close();
	}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package io.day01;
import java.io.*;

public class FIStream2 {
	public static void main(String[] args) throws IOException {
		String file="src/io/day01/SysInOut2.java";
		FileInputStream fis=new FileInputStream(file);//노드 연결
		int n=0, count=0;
		//파일의 끝을 만나면 -1을 반환한다.
		byte []data= new byte[100];
		int total=0;
		while((n=fis.read(data))!=-1) {
			System.out.write(data,0,n);
			count++;
			total+=n;
		}
		System.out.println("반복문"+count+"번");
		System.out.println("파일크기=>총"+total+"bytes");
		fis.close();
		System.out.close();
	}
}

FileOutputStream
bin에 result.txt 가 생기고 저장된다.
//true를 주면 append()기능, 기존 파일 내용에 덧붙이기 함

package io.day01;

import java.io.*;
/*
 * 키보드로 입력한 내용을 파일  (result.txt)에 써보자.
 * 1. 데이터 소스 : 키보드 (System.in)
 * 2. 데이터 목적지 : 파일 (FileOutputStream)
 * */

public class FOStream {
	public static void main(String[] args) throws IOException{
		System.out.println("저장할 내용을 입력하세요");
		int n =0, count=0;
		FileOutputStream fos = new FileOutputStream("result.txt");
		while((n=System.in.read())!=-1) {
			fos.write(n);
			count++;
		}
		System.out.println(count+"바이트 씀");
        	fos.close();
	}
}


실습

package io.day01;

import java.io.*;
/*
 * 실습 src/io/day01/snow.PNG파일을 copy target.png파일로 내보내기
 * 데이터 소스 : 파일
 * 데이터 목적지 : 파일
 * */
public class ImageCopy {
	public static void main(String[] args) 
			throws IOException
	{
		String file="src/io/day01/snow.png";
		FileInputStream fis=new FileInputStream(file);//노드 연결
		FileOutputStream fos = new FileOutputStream("target.png",true);
		int n=0, count=0;
		byte[] data=new byte[1024];
		while((n=fis.read(data))!=-1) {
			fos.write(data,0,n);
			count++;
		}
		System.out.println(count+"byte");
		fos.close();
		fis.close();
	}
}


DataOutputStream
1) 1byte기반 스트림
2) 필터 스트림
3) 기능: 자바의 다양한 자료형(data type)들을 바이트 단위로 분해하여 쓰는 작업을 한다.
주의) DataOutputStream과 DataInputStream은 반드시 짝을 이루어 사용한다.
필터 스트림은 데이터 소스나 목적지에 직접 노드 연결을 하지 못한다.
따라서 먼저 노드스트림을 생성하고 해당 노드 스트림을 필터스트림에 연결해주는 절차가 필요하다.
쓴 순서대로 읽어야 한다.

package io.day01;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOut {
	public static void main(String[] args) 
	throws IOException, EOFException
	{
		String file="data.txt";
		DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
		byte a= 10;
		byte[] arr= {65,66,67};
		boolean bool =true;
		char ch='가';
		short s =3000;
		String str = "홍길동";
		int n=500;
		dos.writeUTF(str);
		dos.writeByte(a);
		dos.write(arr,0,arr.length);
		dos.writeBoolean(bool);
		dos.writeChar(ch);
		dos.writeShort(s);
		dos.writeInt(n);
		System.out.println(dos.size()+"바이트 씀");
		
		System.out.println("data.txt파일에 쓰기 완료");
		
		System.out.println("data.txt에 쓴 내용 복원");
		DataInputStream dis
		= new DataInputStream(new FileInputStream("data.txt"));
		//바이트로 분해된 데이터를 다시 복원하는 기능
		System.out.println("읽어올 수 있는 바이트 수: "+dis.available());
		String str2 = dis.readUTF();
		System.out.println(str2);
		dis.close();
		dos.close();
		
	}
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

JavaScript for ~ in 문

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>for ~ in 루프문</h1>
    <pre>
        for 변수 in 객체 (또는 배열, Coolection)
        {
            //변수는 객체의 속성(property)을 참조한다.
        }
    </pre>
    <script>
        var tv = new Object();
        tv.color ='black';
        tv.price = 1000000;
        tv.model = 'SAMSUNG001';
        //tv 객체의 property는 color, price, model
        tv.info = function(){
            var str="Model: "+this.model;
            str+=" Price : "+this.price;
            str+=" color : "+this.color;
            document.write("<h1>"+str+"</h1>");
        }
        tv.info();
        for(var prop in tv){
            document.write("<h1 style='color:orange'>");
            document.write(prop+" : "+tv[prop]);
            document.write("</h1>");
        }
    </script>
    <hr color="red">
    <script>
        for(var k in window.location){
            document.write(k+" "+ window.location[k]+"</br>)");
        }

    </script>

    <hr color="red">
    <script>
        var arr=[10,20,30];
        for(var a in arr){
            document.write(arr[a]+" ");
        }
    </script>
</body>
</html>

사용자 정의 함수
hoisting 밑에 있는 것을 위에서 쓰는 것

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>사용자 정의 함수 구성하는 방법</title>
</head>
<body>
    <h1>사용자 정의 함수 구성하는 방법</h1>
    1.함수 이름으로 구성하는 방법<br>
    2.리터럴로 구성하는 방법
    <hr>
    <script>
        //1. function 함수명(매개변수) {기능을 구현..}
        //=>hoisting 끌어 올리는 것이 됨
        say("정신차려","이친구야");
        function say(msg, name){
            document.write(msg+"  "+name+"<br>");
        }
        say("dd","Rr");
        //2. var 변수명=function(매개변수) {기능을 구현..}
        //리터럴 방식의 함수는 hoisting이 지원되지 않는다.ㅂㅂ
        var hello=function(name){
            alert("hello "+name);
        }
        hello("홍길동");
        //리터럴 방식의 함수의 경우 함수를 구성한 후에 호출가능하다.
        /*정수 값을 매개변수로 받아들여 해당 값의 거듭제곱을 반환해주는 함수를 구성한 뒤에 호출*/
        function pow(num, num2){
            if(num2==0){
                return 1;
            }else{
                return num*pow(num,num2-1);
            }
        }
        document.write(pow(3,4));
    </script>
</body>
</html>

내장함수
1) eval(수식형태의 문자열)
  수식을 계산하여 그 결과를 숫자로 변환하여 반환
2) parseInt(), parseFloat();
3) Number()함수 : 문자열(숫자)을 숫자로 변환
4) String()함수 : 숫자를 문자열로 변환
5) Boolean()함수 : 특정 값을 논리형으로 변환
6) isNaN() 함수 : 매개변수 값이 숫자가 아니면 true, 숫자면 false

string의 함수
1) length => 문자열의 길이를 반환
2) charAt(i) => 인덱스가 i번째에 있는 문자를 하나 반환

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var str ="3*2+12/7";
        document.write(str+"="+eval(str)+"<br>");

        var str2="hello";
        var len = str2.length;
        document.write(len+"<br>");

        var ch = str2.charAt(2);
        document.write(ch.toUpperCase());
    </script>
    <hr color="red">
    <script>
        var birth=prompt("생년월일을 입력하세요 (ex) 991122");
        //이때 입력한 값이 숫자가 아니면 "숫자로 입력해야 해요" 알람
        //숫자가 맞으면 99년 11월 22일 생이군요 출력
        if(!isNaN(birth)){
            var yy=birth.substring(0,2);
            var mm=birth.substring(2,4);
            var dd=birth.substring(4,6);
            document.write(yy+"년"+mm+"월"+dd+"일");
        }
        
    </script>
</body>
</html>

 

+ Recent posts