Dev/Java

[java] 메타데이터, createStatement 메소드, 자바에서의 Tcl

창문닦이 2019. 1. 31. 13:47

메타데이터: 해당 데이터에 대한 정보를 갖고있는 데이터 DB내의 데이터에 대한 소유자, 데이터 크기 정보


메타데이터를 조회하는 예제

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.Statement;

import com.db.DBConn;

public class MetaTest {

public static void main(String[] args) {

Connection conn =DBConn.getConnection();

Statement stmt = null;

ResultSet rs = null;

ResultSetMetaData rsmd = null;

String sql;

try {

sql = "select * from score";

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

rsmd = rs.getMetaData();

//필드수

int cols = rsmd.getColumnCount();

//필드정보출력

for(int i=1;i<=cols;i++){

System.out.print("필드명: "+ rsmd.getColumnName(i));

System.out.print(", 필드타입: " +rsmd.getColumnType(i));

System.out.print(", 필드타입명: " +rsmd.getColumnTypeName(i));

System.out.print(", 필드폭: " +rsmd.getPrecision(i));

System.out.println();

}

System.out.println();

//데이터출력

while(rs.next()){

for(int i=1; i<=cols; i++){

System.out.print(rs.getString(i)+ " ");

}

System.out.println();

}

rs.close();

stmt.close();

DBConn.close();

} catch (Exception e) {

System.out.println(e.toString());

}

}

}


Statement의 createStatement 메소드 TYPE_SCROLL_SENSITIVE : 수정 결과 바로 반영 안됨 TYPE_SCROLL_INSENSITIVE : 수정 결과 바로 반영(순/역방향 검색 가능) CONCUR_READ_ONLY : 읽기 전용 CONCUR_UPDATABLE : 수정 가능

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Scanner;

import com.db.DBConn;

public class ScoreTest {

public static void main(String[] args) {

Connection conn = DBConn.getConnection();

Scanner sc = new Scanner(System.in);

Statement stmt = null;

ResultSet rs = null;

String sql;

int ch;

try {

sql = "select hak,name from score";

//stmt = conn.createStatement();//순방향으로만 이동.(테이블을 레코드 순서대로 읽음)

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

//INSERT문은 자동커밋인데, UPDATE의 경우에는 COMMIT이 진행되야함 그래서 SENSITIVE,INSENSITIVE 설정

rs = stmt.executeQuery(sql);

while(true){

do{

System.out.println("1.처음 2.이전 3.다음 4.마지막 5.종료: ");

ch = sc.nextInt();

}while(ch<1||ch>5);

switch(ch){

case 1:

if(rs.first()){

System.out.println("처음: "+ rs.getString(1) + ":" + rs.getString(2));

}

break;

case 2:

if(rs.previous()){

System.out.println("이전: "+ rs.getString(1) + ":" + rs.getString(2));

}

break;

case 3:

if(rs.next()){

System.out.println("다음: "+ rs.getString(1) + ":" + rs.getString(2));

}

break;

case 4:

if(rs.last()){

System.out.println("마지막: "+ rs.getString(1) + ":" + rs.getString(2));

}

break;

default:

rs.close();

stmt.close();

DBConn.close();

System.exit(0);

}

}

} catch (Exception e) {

System.out.println(e.toString());

}

}

}



자바에서의 DB 트랜잭션 처리 로직이 굉장히 중요. 전체적인 흐름중에 오류가 발생한다면 rollback 진행이 어느단계까지 되야할지 명확해야 하기 때문이다

import java.sql.Connection;

import java.sql.Statement;

import java.util.Scanner;

import com.db.DBConn;

public class TclMain {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

Connection conn = DBConn.getConnection();

Statement stmt = null;

ResultSet rs = null;

String sql;

int ch;

int id;

String name, birth, tel;

try {

while(true){

do{

System.out.print("1.입력 2.출력 3.종료 :");

ch = sc.nextInt();

}while(ch<1||ch>3);

switch(ch){

case 1:

conn.setAutoCommit(false);//입력시 autocommit되므로 설정 변경

//test1,test2,test3 테이블 모두 정상적으로 입력되야 commit되도록 설정하기 위함

//중간에 입력시 오류가 난다면 rollback 진행

System.out.print("아이디[숫자]? ");

id = sc.nextInt();

System.out.print("이름? ");

name = sc.next();

System.out.print("생일[yyyy-mm-dd]? ");

birth = sc.next();

System.out.print("전화");

tel = sc.next();

//세개의 sql중 하나라도 잘못들어가면 rollback 진행된다.

//test1테이블 입력

sql= String.format("insert into test1 (id, name) values(%d,'%s')",id, name);

stmt = conn.createStatement();

stmt.executeUpdate(sql);

stmt.close();

//test2테이블 입력

sql= String.format("insert into test2 (id, birth) values(%d,'%s')",id, birth);

stmt = conn.createStatement();

stmt.executeUpdate(sql);

stmt.close();

//test3테이블 입력

sql= String.format("insert into test3 (id, tel) values(%d,'%s')",id, tel);

stmt = conn.createStatement();

stmt.executeUpdate(sql);

stmt.close();

conn.commit();

break;

case 2:

sql= "select a.id, name, birth, tel from test1 a, test2 b, test3 c where a.id=b.id and a.id=c.id";

stmt = conn.createStatement();

rs = stmt.executeUpdate(sql);

while(rs.next()){

 

str = String.format("%10s %8s %12s %15s ",

rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));

System.out.println(str);

}

rs.close();

stmt.close();

DBConn.close();

case 3:

DBConn.close();

System.exit(0);

}

}

} catch (Exception e) {

System.out.println(e.toString());

}

}

}


DB를 연동한 성적 입력, 수정, 삭제, 출력, 검색 기능 구현하기

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Scanner;

import com.db.DBConn;

public class Score {

Scanner sc = new Scanner(System.in);

//getter, setter 사용하는 게 일반적이지만 DB연동 예시이므로 현재는 생략하고 진행

String hak,name;

int kor,eng,mat;

int tot,avg;

//1.입력

public int insertData(){

int result = 0;

Connection conn = DBConn.getConnection();

Statement stmt = null;//클래스의 초기값은 null 이므로 Statement도 null로 초기화

//Statement는 sql문을 전달해주면 가져다가 실행하는 역할 진행

String sql;

try {

System.out.print("학번? ");

hak = sc.next();

System.out.print("이름? ");

name = sc.next();

System.out.print("국어? ");

kor = sc.nextInt();

System.out.print("영어? ");

eng = sc.nextInt();

System.out.print("수학? ");

mat = sc.nextInt();

sql = "insert into score (hak,name,kor,eng,mat) values(";

sql += "'" + hak + "'," ;

sql += "'" + name + "'," ;

sql += kor + ",";

sql += eng + ",";

sql += mat + ")";

//System.out.println(sql);//확인용

stmt = conn.createStatement();//statement는 connection이 생성함

result = stmt.executeUpdate(sql);//executeUpdate는 insert, update, delete(DML문장일때) 사용

stmt.close();

System.out.println("데이터가 입력되었습니다.");

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

//2.수정

public int updateData(){

int result = 0;

Connection conn = DBConn.getConnection();

Statement stmt = null;//클래스의 초기값은 null 이므로 Statement도 null로 초기화

String sql;

try {

System.out.print("수정할 학번? ");

hak = sc.next();

System.out.print("국어? ");

kor = sc.nextInt();

System.out.print("영어? ");

eng = sc.nextInt();

System.out.print("수학? ");

mat = sc.nextInt();

sql = "update score set kor="+kor+", eng="+eng+", mat="+mat + " where hak = '"+hak+"'";

System.out.println(sql);//확인용

stmt = conn.createStatement();

result = stmt.executeUpdate(sql);//executeUpdate는 insert, update, delete(DML문장일때) 사용

stmt.close();

System.out.println("데이터가 수정되었습니다.");

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

//3.삭제

public int deleteData(){

int result = 0;

Connection conn = DBConn.getConnection();

Statement stmt = null;//클래스의 초기값은 null 이므로 Statement도 null로 초기화

String sql;

try {

System.out.print("삭제할 학번? ");

hak = sc.next();

sql = "delete score where hak = '"+hak+"'";

stmt = conn.createStatement();

result = stmt.executeUpdate(sql);//executeUpdate는 insert, update, delete(DML문장일때) 사용

stmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

//4.전체출력

public void selectAll(){

Connection conn = DBConn.getConnection();

Statement stmt = null;

ResultSet rs = null; //statement가 실행되고 난 후 테이블이 반환됨. 반환된 테이블을 담을 변수

String sql;

String str;

try {

sql = "select hak,name,kor,eng,mat,";

sql += "(kor+eng+mat) tot, (kor+eng+mat)/3 avg ";

sql += "from score order by hak";

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

//테이블을 담아야하는데 해당 테이블의 레코드의 수를 알 수 없음. 그렇기 때문에 반복문 사용해야함

//커서가 BOF(BEGIN OF FILE) ~ EOF(END OF FILE) 회전을 해야함.

//rs.next가 존재할때까지 반복

while(rs.next()){

hak = rs.getString(1); //첫번째 컬럼의 값, 컬럼명을 사용해도 됨

name = rs.getString("name");

kor = rs.getInt("kor");

eng = rs.getInt(4);

mat = rs.getInt("mat");

tot = rs.getInt(6);

avg = rs.getInt("avg");

str = String.format("%5s %8s %4d %4d %4d %4d %4d",

hak, name, kor, eng, mat, tot, avg);

System.out.println(str);

}

rs.close();

stmt.close();

DBConn.close();

} catch (Exception e) {

System.out.println(e.toString());

}

}

//5.이름검색

public void searchName(){

Connection conn = DBConn.getConnection();

Statement stmt = null;

ResultSet rs = null; //statement가 실행되고 난 후 테이블이 반환됨. 반환된 테이블을 담을 변수

String sql;

String str;

try {

System.out.print("검색할 이름? ");

String searchName = sc.next();

sql = "select hak,name,kor,eng,mat,";

sql += "(kor+eng+mat) tot, (kor+eng+mat)/3 avg ";

sql += "from score ";

sql += "where name like '%" + searchName +"%' ";

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

while(rs.next()){

hak = rs.getString(1); //첫번째 컬럼의 값, 컬럼명을 사용해도 됨

name = rs.getString("name");

kor = rs.getInt("kor");

eng = rs.getInt(4);

mat = rs.getInt("mat");

tot = rs.getInt(6);

avg = rs.getInt("avg");

str = String.format("%5s %8s %4d %4d %4d %4d %4d",

hak, name, kor, eng, mat, tot, avg);

System.out.println(str);

}

} catch (Exception e) {

System.out.println(e.toString());

}

}

}


메인문 

import java.util.Scanner;

import com.db.DBConn;

public class ScoreMain {

public static void main(String[] args) {

Scanner sc= new Scanner(System.in);

int ch;

Score ob = new Score();

try {

while(true){

do{

System.out.print("1.입력, 2.수정, 3.삭제, 4.전체출력, 5.이름검색, 6.종료: ");

ch = sc.nextInt();

}while(ch<1||ch>6);

switch(ch){

case 1:

ob.insertData(); break; //insertData메소드 실행시 반환값으로 int가 나오지만 사용하지 않음. 에러안남

case 2:

ob.updateData(); break;

case 3:

if(ob.deleteData()!=0){

System.out.println("데이터가 삭제되었습니다."); //반환값을 이용해서 결과 안내

}

break;

case 4:

ob.selectAll(); break;

case 5:

ob.searchName(); break;

case 6:

DBConn.close();

System.exit(0);

}

}

} catch (Exception e) {

System.out.println(e.toString());

}

}//end-main

}//end-class


'Dev > Java' 카테고리의 다른 글

[java] CallableStatement(프로시저 이용)  (0) 2019.02.01
[java] PreparedStatement  (0) 2019.02.01
[java] xml파일 읽어오기, 정규화표현식  (0) 2019.01.31
[java] 채팅프로그램 만들기  (0) 2019.01.31
[java] 윈도우,swing  (0) 2019.01.31