1.목표
Java를 사용해 특정 디렉토리의 JSON 파일을 읽고
읽은 내용을 파싱하여 JDBC 로직을 통해 Oracle DB에 삽입
2.준비
이러한 JSON 파일이 있습니다.
위 형태의 파일은 JSONObject로 파싱을 해야하는데
다건 JSON 객체 구조입니다.
https://studyingazae.tistory.com/196
JSON 형태에 따라 다르게 파싱해야 함으로 링크 첨부합니다 정리가 잘 되어있더라구요
3.코딩
-->테이블 생성
java.sql.Statement stmt = null;
Connection conn = null;
PreparedStatement pstmt = null;
String filePath = "JSON 디렉토리 입력하세요 !!";
String name="";
long soldAmount = 0;
long price =0;
try{
String driverClassName = "oracle.jdbc.driver.OracleDriver";
String url = "자신의 오라클 주소 입력하세요 !! ";
String user = "아이디!!";
String password = "패스워드!!";
//JDBC Driver Loading
Class.forName(driverClassName);
//JDBC Connection getting
conn = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
System.out.println("** Driver:" + driverClassName + ", Connection:" + conn);
//테이블 없을 시 테이블 생성
String query = "CREATE TABLE TEST(";
query += "no number(4) primary key,";
query += "name varchar2(30),";
query += "soldAmount number(20),";
query += "price number(20))";
stmt = conn.createStatement();
boolean b = stmt.execute(query);
System.out.println("b : " + b);
}catch(ClassNotFoundException ex){
System.out.println("드라이버 로딩 실패");
ex.printStackTrace();
} catch (SQLException e) {
System.out.println("sql오류 :이미 생성");
//.printStackTrace();
}finally {
CloseUtil.close(null, stmt, conn);
}
Main 함수에 쭉 작성하였습니다.
테이블 생성부터 진행하였으며 혹여나 테이블 생성을 미리 sqlDeveloper등 진행하였다면 패스해주세요~
3-1코딩
-->JSON 파싱 후 JDBC 삽입
try {
String driverClassName = "oracle.jdbc.driver.OracleDriver";
String url = "오라클 주소 !! ";
String user = "아이디!!";
String password = "패스워드 !! ";
//JDBC Driver Loading
Class.forName(driverClassName);
//JDBC Connection getting
conn = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
System.out.println("** Driver:" + driverClassName + ", Connection:" + conn);
//JSON 읽어와서 쿼리에 담기위한 사전작업
Reader reader = new FileReader(filePath);
JSONParser parser = new JSONParser();
Object obj = parser.parse(reader);
JSONArray jsonArr = (JSONArray) obj;
//SQL문 작성
String SQL = "insert into test(no, name, soldAmount, price) values(?,?,?,?)";
//PreParedStatement 객체 생성, 객체 생성시 SQL 문장 저장
pstmt = conn.prepareStatement(SQL);
//psmt.set<데이터타입><? 순서, 값)
//다건 JSON객체 (JSONArray)
if(jsonArr.size()>0) {
for(int i=0; i<jsonArr.size(); i++) {
JSONObject jsonObj = (JSONObject)jsonArr.get(i);
System.out.println((String)jsonObj.get("name"));
System.out.println((Long)jsonObj.get("soldAmount"));
System.out.println((Long)jsonObj.get("price"));
name=(String)jsonObj.get("name");
soldAmount=(Long)jsonObj.get("soldAmount");
price=(Long)jsonObj.get("price");
pstmt.setInt(1, i);
pstmt.setString(2, name);
pstmt.setLong(3, soldAmount);
pstmt.setLong(4, price);
int r = pstmt.executeUpdate();
System.out.println("SQL 실행:"+r+"개 의 row삽입");
}
}
//SQL문 작성
String SQL2 = "insert into test(no, name, soldAmount, price) values(?,?,?,?)";
//PreParedStatement 객체 생성, 객체 생성시 SQL 문장 저장
pstmt = conn.prepareStatement(SQL2);
}catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
CloseUtil.close(null, stmt, conn);
}
3-2 전체 코드
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.sql.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.*;
public class DataInsert {
public static void main(String[] args) {
java.sql.Statement stmt = null;
Connection conn = null;
PreparedStatement pstmt = null;
String filePath = "JSON 파일의 위치";
String name="";
long soldAmount = 0;
long price =0;
try{
String driverClassName = "oracle.jdbc.driver.OracleDriver";
String url = "오라클 URL입력 !! ";
String user = "아이디!!";
String password = "비번!!";
//JDBC Driver Loading
Class.forName(driverClassName);
//JDBC Connection getting
conn = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
System.out.println("** Driver:" + driverClassName + ", Connection:" + conn);
//테이블 없을 시 테이블 생성
String query = "CREATE TABLE TEST(";
query += "no number(4) primary key,";
query += "name varchar2(30),";
query += "soldAmount number(20),";
query += "price number(20))";
stmt = conn.createStatement();
boolean b = stmt.execute(query);
System.out.println("b : " + b);
}catch(ClassNotFoundException ex){
System.out.println("드라이버 로딩 실패");
ex.printStackTrace();
} catch (SQLException e) {
System.out.println("sql오류 :이미 생성");
//.printStackTrace();
}finally {
CloseUtil.close(null, stmt, conn);
}
//table create JDBC 로직 종료
//insert into JDBC 로직
try {
String driverClassName = "oracle.jdbc.driver.OracleDriver";
String url = "오라클 주소 입력 !!";
String user = "아이디!!";
String password = "비번!!";
//JDBC Driver Loading
Class.forName(driverClassName);
//JDBC Connection getting
conn = DriverManager.getConnection(url, user, password);
System.out.println("DB 연결 성공");
System.out.println("** Driver:" + driverClassName + ", Connection:" + conn);
//JSON 읽어와서 쿼리에 담기위한 사전작업
Reader reader = new FileReader(filePath);
JSONParser parser = new JSONParser();
Object obj = parser.parse(reader);
JSONArray jsonArr = (JSONArray) obj;
//SQL문 작성
String SQL = "insert into test(no, name, soldAmount, price) values(?,?,?,?)";
//PreParedStatement 객체 생성, 객체 생성시 SQL 문장 저장
pstmt = conn.prepareStatement(SQL);
//psmt.set<데이터타입><? 순서, 값)
//다건 JSON객체 (JSONArray)
if(jsonArr.size()>0) {
for(int i=0; i<jsonArr.size(); i++) {
JSONObject jsonObj = (JSONObject)jsonArr.get(i);
System.out.println((String)jsonObj.get("name"));
System.out.println((Long)jsonObj.get("soldAmount"));
System.out.println((Long)jsonObj.get("price"));
name=(String)jsonObj.get("name");
soldAmount=(Long)jsonObj.get("soldAmount");
price=(Long)jsonObj.get("price");
pstmt.setInt(1, i);
pstmt.setString(2, name);
pstmt.setLong(3, soldAmount);
pstmt.setLong(4, price);
int r = pstmt.executeUpdate();
System.out.println("SQL 실행:"+r+"개 의 row삽입");
}
}
//SQL문 작성
String SQL2 = "insert into test(no, name, soldAmount, price) values(?,?,?,?)";
//PreParedStatement 객체 생성, 객체 생성시 SQL 문장 저장
pstmt = conn.prepareStatement(SQL2);
}catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
CloseUtil.close(null, stmt, conn);
}
}
}
그리고 잘 보시면 Fianlly에
따로 클래스를 만들어 빼놓았습니다.
public class CloseUtil {
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if(rs != null) {
try {
rs.close();
}catch(SQLException se) {
}
}
if(stmt != null) {
try {
stmt.close();
}catch(SQLException se) {
}
}
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
4.결과
-Console
DB 연결 성공
** Driver:oracle.jdbc.driver.OracleDriver, Connection:oracle.jdbc.driver.@@
b : false
DB 연결 성공
** Driver:oracle.jdbc.driver.OracleDriver, Connection:oracle.jdbc.driver.@@
TV
83819381
1000000
SQL 실행:1개 의 row삽입
Tablet
7346188
390000
SQL 실행:1개 의 row삽입
Shoes
3436881
108000
SQL 실행:1개 의 row삽입
SmartPhone
1050135
790000
SQL 실행:1개 의 row삽입
DVD Player
988919
190000
SQL 실행:1개 의 row삽입
Book
533233
10000
SQL 실행:1개 의 row삽입
Toys
502838
20000
SQL 실행:1개 의 row삽입
Ball
384883
5000
SQL 실행:1개 의 row삽입
Watch
98212
58000
SQL 실행:1개 의 row삽입
Icecream
81937
3000
SQL 실행:1개 의 row삽입
Cake
23868
12000
SQL 실행:1개 의 row삽입
Camera
3981
350000
SQL 실행:1개 의 row삽입
Boots
2388
58000
SQL 실행:1개 의 row삽입
Piano
1398
999900
SQL 실행:1개 의 row삽입
-Oracle
짠 예쁘게 들어왔습니다.
5.느낀점
if(jsonArr.size()>0) {
for(int i=0; i<jsonArr.size(); i++) {
JSONObject jsonObj = (JSONObject)jsonArr.get(i);
System.out.println((String)jsonObj.get("name"));
System.out.println((Long)jsonObj.get("soldAmount"));
System.out.println((Long)jsonObj.get("price"));
name=(String)jsonObj.get("name");
soldAmount=(Long)jsonObj.get("soldAmount");
price=(Long)jsonObj.get("price");
pstmt.setInt(1, i);
pstmt.setString(2, name);
pstmt.setLong(3, soldAmount);
pstmt.setLong(4, price);
int r = pstmt.executeUpdate();
System.out.println("SQL 실행:"+r+"개 의 row삽입");
}
}
핵심로직은 결국 여기입니다.
for문을 돌면서 JSONArray 형식의 다건 객체에서 Key값에 해당하는 value 값을 가져옵니다.
저도 처음에는 다건 객체가 아닌 로직을 따라하느라, JDBC가 아닌 json 파싱과 오브젝트에 더 시간을 쏟았던 것 같습니다. 덕분에 좋은 시간이었구요
이러한 특정 경로에서 파일을 읽고 내 DB 삽입, 또는 네트워크성을 추가해 전송까지 하는 과정은
연계관점에서 중요하며 브라우저가 해주는 일을 내가 코드로 작성해야하기 때문에 모든 예외처리와
메모리,DB 부하를 체크해야하는 과정임을 인지하고 공부하고있습니다.
감사합니다.
'Programing Language > Java' 카테고리의 다른 글
[Java] JMX, JMX MBean이란 ? (0) | 2022.04.15 |
---|---|
[Java] 6. 클래스(Class)와 인스턴스(instance) 멤버 (0) | 2021.05.16 |
[Java] 5.반복문(if,for문) (0) | 2021.05.01 |
[Java] 4.연산자(operator) (0) | 2021.04.27 |
[Java] 3.자료형(Data type) (0) | 2021.04.25 |
댓글