메타데이터: 해당 데이터에 대한 정보를 갖고있는 데이터 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 |