본문 바로가기
Programing Language/Java

[JDBC,JSON] JSON 형식 파일을 읽고 JDBC로 삽입(Insert)

by tangle96 2022. 3. 15.

1.목표

Java를 사용해 특정 디렉토리의 JSON 파일을 읽고

읽은 내용을 파싱하여 JDBC 로직을 통해 Oracle DB에 삽입

 


2.준비

이러한 JSON 파일이 있습니다.

 

위 형태의 파일은 JSONObject로 파싱을 해야하는데

다건 JSON 객체 구조입니다.

 

https://studyingazae.tistory.com/196

 

[JAVA] 다양한 형태의 JSON 파일 파싱하기 JSONParser, JSONObject, JSONArray (json.simple, GSON)

JSON 파일을 땡겨왔는데 이를 저장하기 위해선 JSON 데이터를 사용하기 위해 JSONObject와 JSONArray를 쓸 수 있습니다. json-simple을 통해 json 객체를 다루는 법을 알아보겠습니다. 본 글에는 없지만 GSON도

studyingazae.tistory.com

 

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 부하를 체크해야하는 과정임을 인지하고 공부하고있습니다.

 

감사합니다.

 

 

댓글