반응형
JDBC
Java DataBase Connectivity
Java에서 DBdㅔ 접근하여 DML을 사용가능하게 하는 것.
즉, 자바가 데이터베이스를 사용할 수 있도록 연결해주는 JAVA API이다.
JDBC 커넥션은 명령문 SQL query를 만들고 실행하는 것을 지원한다.
JDBC API 소스코드
package com.jdbc.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class MySqlConnection {
//DB 커넥션 양식 DB별로 정해져있음.
private final String DB_DRIVER = "com.mysql.jdbc.Driver"; // Mysql
private final String DB_CONNECTION = "jdbc:mysql://localhost:3306/tourist_statistic?serverTimezone=UTC";
private final String DB_USER = "root"; // mysql user id
private final String DB_PASSWORD = "admin"; // mysql password
public Connection getDBConnection() { //db접속
Connection dbConnection = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD);
//db(연결만해줌)
return dbConnection;//연결해준 db가 db커넥션에 담김.
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
}
명령문 (INSERT) 소스코드
public class JDBCStatementInsert {
private MySqlConnection mConnection = null;
public void insertRawDataUsingProcedure() throws SQLException {
// 1. csv 읽어오기
File f = new File("/Users/hyesuelee/eclipse-workspace/jdbc_exam/src/com/jdbc/dao/jn_2013.csv"); //파일 생성 및 지정.
ArrayList<String> data = new ArrayList<String>(); // 제네릭<타입>:
try {
FileInputStream fis = new FileInputStream(f); // 파일을 읽어오기 위해 파일에 빨대 꽂아주는 작업(아직 읽어들이진 않음.).
InputStreamReader isr = new InputStreamReader(fis) ; //빨대로 읽어들일수 있도록 reader에 넣어줌.
//파일 일부분 잘라내서 잠시 어딘가에 보관하기위해 버퍼 필요.
BufferedReader br = new BufferedReader(isr); //읽어들일때 buffer 방식으로 읽어들인다. 이제 내용 읽을 수 있음..
//한줄 읽어와 저장할 변수 line
String line = null;
//반복 횟수 모를때는 while 반복.
while((line = br.readLine()) != null) { //br readline: 파일 한줄씩 읽어오는 것.. 파일 내용 끝나면 null값 들어가므로 반복 종료.
data.add(line);
//System.out.println(line);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for(int i=0; i<data.size(); i++) {
System.out.println(data.get(i)); // 데이터사이즈만큼 반복> 모든 데이터 출력.
}
//System.exit(0);
// 2. org_data 테이블에 입력하기
mConnection = new MySqlConnection(); //연결정보
Connection dbConnection = null; //생성만.
Statement statement = null;//기본쿼리성하는 기본클래스
String insertTableSQL =null;
int cnt =0;
try {
dbConnection = mConnection.getDBConnection();
statement = dbConnection.createStatement();
dbConnection.setAutoCommit(false); //오토커밋 막기: false로 셋팅. > 작업후, 커밋해주어야함.
for(int i=0; i<data.size();i++) { // 데이터사이즈만큼 반복,
String[] values = data.get(i).split(","); // 데이터값을 배열에 담기. split함수 사용하여 콤마로 자르기.
insertTableSQL = "INSERT INTO org_data(idx,prvn_name,distc_name,attrc_name,attrc_type,"
+ "visitor_type,year,jan,feb,mar,apr,may,june,july,aug,sept,oct,nov,`dec`)"; // sql쿼리문 입력.
insertTableSQL = insertTableSQL.concat("VALUES(");
insertTableSQL = insertTableSQL.concat(values[0]);
insertTableSQL = insertTableSQL.concat(", '"+ values[1] + "'"); // 문자열열인 경우 홑따옴표 필요하므로 concat함수사용
insertTableSQL = insertTableSQL.concat(", '"+ values[2] + "'");
insertTableSQL = insertTableSQL.concat(", '"+ values[3] + "'");
insertTableSQL = insertTableSQL.concat(", '"+ values[4] + "'");
insertTableSQL = insertTableSQL.concat(", '"+ values[5] + "'");
insertTableSQL = insertTableSQL.concat(", "+ values[6]);
insertTableSQL = insertTableSQL.concat(", "+ values[7]);
insertTableSQL = insertTableSQL.concat(", "+ values[8]);
insertTableSQL = insertTableSQL.concat(", "+ values[9]);
insertTableSQL = insertTableSQL.concat(", "+ values[10]);
insertTableSQL = insertTableSQL.concat(", "+ values[11]);
insertTableSQL = insertTableSQL.concat(", "+ values[12]);
insertTableSQL = insertTableSQL.concat(", "+ values[13]);
insertTableSQL = insertTableSQL.concat(", "+ values[14]);
insertTableSQL = insertTableSQL.concat(", "+ values[15]);
insertTableSQL = insertTableSQL.concat(", "+ values[16]);
insertTableSQL = insertTableSQL.concat(", "+ values[17]);
insertTableSQL = insertTableSQL.concat(", "+ values[18] + ")");
System.out.println(insertTableSQL);
cnt += statement.executeUpdate(insertTableSQL); //바꿔야할 쿼리 넣어 업뎃 : 할때마다 cnt(삽입데이터개수)증가
//insert/update/delete 익스큐드업데이트로 실행.
}
System.out.println(cnt+" data are inserted into org_data table!");
dbConnection.commit(); //성공적으로 완료되었을경우: 커밋. (DB에 성공적인 데이터가 들어감. )
} catch (SQLException e) {
System.out.println(e.getMessage());
dbConnection.rollback(); // 실패하였을 경우 롤백 (DB에 데이터가 들어가지 않음)
}
// 3. 프로시저 호출
Savepoint sp = dbConnection.setSavepoint(); // 롤백 할 시점 저장(세이브). .
try {
/*
String sql = "UPDATE org_data SET attrc_nme = '사도,낭도' WHERE idx = 27";
statement.executeUpdate(sql);
sql = "UPDATE org_data SET attrc_nm = '화양, 장등지구' WHERE idx = 32";
statement.executeUpdate(sql);
*/
statement.execute("call sp_add_missed_attrc_cd()"); // 프로시저 실행.
System.out.println("finish sp_add_missed_attrc_cd");
statement.executeQuery("call _sp_dynamic_add_figure('2010')"); //프로시저 실행.
System.out.println("finish _sp_dynamic_add_figure");
dbConnection.commit();// 커밋
}catch(Exception e) {
e.printStackTrace();
dbConnection.rollback();
}finally { // 실패하든 성공하든 실행되는 구간.
dbConnection.releaseSavepoint(sp);//세이브 포인트 풀림.
if (statement != null) {
statement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
}
반응형
'Back-end > JAVA,Spring' 카테고리의 다른 글
HTML 이란 (0) | 2018.08.07 |
---|---|
프로시저 예제. (0) | 2018.07.08 |
[JAVA] Collections Framework 자바 컬렉션 프레임 워크란? (0) | 2018.07.05 |
데이터 검증하기 - 값 보정방법 및 쿼리 (0) | 2018.07.02 |
SQL - CURSOR 커서 (0) | 2018.07.01 |