본문 바로가기
데이터베이스

DB와 JAVA 연동하기

by 김마리님 2020. 4. 22.

JAVA에서 파일을 연동할때, 그 파일의 위치를 묻는 것 처럼 DB를 연결할때도 형태가 유사하다.

 

데이터베이스를 연결하는 방법은 다음과 같다.

먼저 이것을 하기 전에 빌드패스로 라이브러리를 추가해주어야 한다.

이클립스를 쓰는 사람은 다운로드를 따로 받아야 하지만, STS 툴을 사용하는 사람은 같이 다운받아져있을 것이다.

 

public class CustomerList 
{
	Connection con; // 멤버변수
	Statement stmt;
	ResultSet rs;

	void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String userid =  "c##madang"; //c##추가
		String pwd = "c##madang"; //c##추가
	   
		try 
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		}
		catch (ClassNotFoundException e) 
		{
		   e.printStackTrace();
		}
		
		try 
		{
		   System.out.println("데이터베이스 연결 준비 .....");
		   con = DriverManager.getConnection(url,userid,pwd);
		   System.out.println("데이터베이스 연결 성공");
		}
		catch (SQLException e) 
		{
		   e.printStackTrace();
		}
	}

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
		
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}

1. Class.forName을 통해 드라이버 로드

2. getConnection을 통해 연결 시도

3. 데이터베이스에서 받아온 정보를 statement를 통해 객체화 시킴(여기서는 변수 stmt)

4. resultSet을 통해 객체의 결과 받기

 

다음과 같이 동작하므로, 위에서 먼저 데이터베이스의 url을 설정해준다.

jdbc:oracle:thin:@localhost:1521:xe를 보면

 

jdbc:oracle:thin은 jdbc의 드라이버 종류를 thin으로 사용하겠다는 뜻이다. oracle의 데이터 베이스는 두 종류가 있는데 하나는 thin, 다른 하나는 OCI 기반의 드라이버이다.

localhost는 데이터가 있는 IP주소이다. localhost는 내 IP주소를 의미한다.

1521은 연결할 포트를 의미하고, xe 는 식별자를 의미하는데 오라클 11g 이상을 쓰고 있다면 식별자를 xe를 사용한다.

아이디와 비밀번호는 데이터베이스에 적급할 때, 아이디와 비밀번호를 의미한다. 

 

forName을 통해 드라이버를 불러오고, Statement를 통해 데이터베이스 내용을 객체화 시킨다.

쿼리(질의문)를 이용해 무엇을 가져올 것인지 설정한다. 이를 통해 질의문에 대한 객체의 결과물을 받을 수 있다. 

 

데이터베이스 사용을 종료하고나면 con.close를 통해 종료시킨다.

 

이 데이터를 불러오는 방법은 네 가지가 있다.

1. 변수

2. 배열

3. 객체 변수

4. 객체 배열

 

 

1. 객체

객체는 객체를 설정해놓고 while문을 통해 받은 데이터베이스 값을 계속 출력하는 것을 의미한다.

package booklist;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;



public class CustomerList 
{
	Connection con; // 멤버변수
	Statement stmt;
	ResultSet rs;
	int custid;
	String name;
	String address;
	String phone;

	public CustomerList() 
	{
		}
	}
	void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String userid =  "c##madang"; //c##추가
		String pwd = "c##madang"; //c##추가
	   
		try 
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		}
		catch (ClassNotFoundException e) 
		{
		   e.printStackTrace();
		}
		
		try 
		{
		   System.out.println("데이터베이스 연결 준비 .....");
		   con = DriverManager.getConnection(url,userid,pwd);
		   System.out.println("데이터베이스 연결 성공");
		}
		catch (SQLException e) 
		{
		   e.printStackTrace();
		}
	}

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) 
			{
				custid=rs.getInt(1);
				name=rs.getString(2);
				address=rs.getString(3);
				phone=rs.getString(4);
				printcust();
				
			}
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
	void printcust() {
		System.out.println(custid+"\t\t"+name+"\t\t\t"+address+"\t\t\t"+phone);
	}
}

 

 

2. 배열

package booklist;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;



public class CustomerList 
{
	Connection con; // 멤버변수
	Statement stmt;
	ResultSet rs;
	int custid_arr[]=new int[5];
	String name_arr[]=new String[5];
	String address_arr[]=new String[5];
	String phone_arr[]=new String[5];
	


	public CustomerList() 
	{
		}
	}
	void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String userid =  "c##madang"; 
		String pwd = "c##madang"; 
	   
		try 
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		}
		catch (ClassNotFoundException e) 
		{
		   e.printStackTrace();
		}
		
		try 
		{
		   System.out.println("데이터베이스 연결 준비 .....");
		   con = DriverManager.getConnection(url,userid,pwd);
		   System.out.println("데이터베이스 연결 성공");
		}
		catch (SQLException e) 
		{
		   e.printStackTrace();
		}
	}

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) 
			{				
				custid_arr[i]=rs.getInt(1);
				name_arr[i]=rs.getString(2);
				address_arr[i]=rs.getString(3);
				phone_arr[i]=rs.getString(4);		
				i++;
			}
            printcust2();
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
	void printcust2() {
		for (int i = 0; i < 5; i++) {
			System.out.print(custid_arr[i] +"\t");
			System.out.print(name_arr[i] +"\t");
			System.out.print(address_arr[i] +"\t");
			System.out.println(phone_arr[i] +"\t");
		}
}

 

단, 배열을 만들때, 출력문의 for문의 반복량(i<5)의 실수가 나게 되면 private key와 데이터가 꼬이게 된다.

따라서 이를 신경쓰지 않도록 독립적인 객체로 만든다.

 

 

3. 객체 배열

다른 자바 파일을 만들어 독립적으로 움직이게 만든다.

 

Customer 파일을 따로 만든다.

 

-Customer

package booklist;

class Customer {
	int custid;
	String name;
	String address;
	String phone;
}

이 파일을 데이터베이스의 파일에 참조한다.

 

-CustomerList

package booklist;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;



public class CustomerList 
{
	Connection con; // 멤버변수
	Statement stmt;
	ResultSet rs;

	
Customer c1;

	public CustomerList() 
	{
		c1=new Customer();
	}
	void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String userid =  "c##madang"; //c##추가
		String pwd = "c##madang"; //c##추가
	   
		try 
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		}
		catch (ClassNotFoundException e) 
		{
		   e.printStackTrace();
		}
		
		try 
		{
		   System.out.println("데이터베이스 연결 준비 .....");
		   con = DriverManager.getConnection(url,userid,pwd);
		   System.out.println("데이터베이스 연결 성공");
		}
		catch (SQLException e) 
		{
		   e.printStackTrace();
		}
	}

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) 
			{
				c1.custid=rs.getInt(1);
				c1.name=rs.getString(2);
				c1.address=rs.getString(3);
				c1.phone=rs.getString(4);
				printcust_obj();
			}
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}

	void printcust_obj(){
		System.out.print(c1.custid+"\t");
		System.out.print(c1.name+"\t");
		System.out.print(c1.address+"\t");
		System.out.println(c1.phone+"\t");
	}

	}
	
}

 

--응용--

이를 원래 값을 가진 변수를 직접 접근하게 해서는 안된다. 원래는 직접 값을 가진 변수를 은닉화 하여 내부에서 접근하지 못하도록 해야하는데, 따라서, Customer의 변수를 은닉화한다.

 

-Customer

package booklist;

import lombok.Data;

@Data

class Customer {
	private int custid;
	private String name;
	private String address;
	private String phone;
}

단, 은닉화된 변수를 클래스 외부에서 찾으려면 getter,setter을 이용해 간접접근을 해야하므로 lombok 라이브러리를 이용해 getter/setter을 만들어주자.

 

-CustomerList

(연결까지는 같으니까  데이터를 불러오는 부분만 보자)

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) 
			{				
				c1.setCustid(rs.getInt(1));
				c1.setName(rs.getString(2));
				c1.setAddress(rs.getString(3));
				c1.setPhone(rs.getString(4));
				printcust_obj();
			}
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
	void printcust_obj(){
		System.out.print(c1.getCustid()+"\t");
		System.out.print(c1.getName()+"\t");
		System.out.print(c1.getAddress()+"\t");
		System.out.println(c1.getPhone()+"\t");
	}
	
}

다음과 같이 setter을 통해 값을 받은 값을 변수에 넣어 변수를 변경하고, getter을 통해 변경된 변수의 값을 간접출력한다.

 

 

4. 객체 배열

객체 배열 역시 앞에 만들어둔 customer 파일을 참조한다.

package booklist;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;



public class CustomerList 
{
	Connection con; // 멤버변수
	Statement stmt;
	ResultSet rs;	
Customer[]c_array;	

	public CustomerList() 
	{
		c_array=new Customer[5];
		for (int i = 0; i <5; i++) {
			c_array[i]=new Customer();
		}
	}
	void getConnection() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String userid =  "c##madang"; //c##추가
		String pwd = "c##madang"; //c##추가
	   
		try 
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버 로드 성공");
		}
		catch (ClassNotFoundException e) 
		{
		   e.printStackTrace();
		}
		
		try 
		{
		   System.out.println("데이터베이스 연결 준비 .....");
		   con = DriverManager.getConnection(url,userid,pwd);
		   System.out.println("데이터베이스 연결 성공");
		}
		catch (SQLException e) 
		{
		   e.printStackTrace();
		}
	}

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) 
			{				
				c_array[i].custid=rs.getInt(1);
				c_array[i].name=rs.getString(2);
				c_array[i].address=rs.getString(3);
				c_array[i].phone=rs.getString(4);
				i++;
			}
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
	void printcust_obj_arr() {
		for (int i = 0; i < 5; i++) {
			System.out.print(c_array[i].custid+"\t");
			System.out.print(c_array[i].name+"\t");
			System.out.print(c_array[i].address+"\t");
			System.out.println(c_array[i].phone+"\t");
			
		}
	}
	
}

 

이 파일을 실행 파일을 따로 만들어서 실행한다.

-Bookstore

package booklist;

public class BookStore {
	void run(){
		BookList b1=new BookList();
		b1.getConnection();
		b1.getBookDB();
		b1.printBook_obj_array();
		CustomerList c1=new CustomerList();
		c1.getConnection();
		c1.printCustomer();
		c1.printcust_obj_arr();
		
	}
}

-Basic

package booklist;

public class Basic 
{
	public static void main (String args[]) { //메소드이면서 프로그램실행에 관여함
		
		//만들어진 클래스를 사용하는 부분
		new BookStore().run();
	}
}

 

--응용--

배열 역시 은닉화를 통해 간접접근이 가능하다.

객체때와 같이 private를 통해 Customer에 변수를 은닉화하고,

	void printCustomer() //하는 일이 뭐냐?
	{ 
		String query = "SELECT custid, name, address, phone  FROM customer";
		try 
		{
			stmt = con.createStatement(); //2
			rs = stmt.executeQuery(query); //3
			System.out.println("CUSTID \tNAME \tADDRESS \tPHONE");
			
			int i=0; 
			while (rs.next ()) {			
				c_array[i].setCustid(rs.getInt(1));
				c_array[i].setName(rs.getString(2));
				c_array[i].setAddress(rs.getString(3));
				c_array[i].setPhone(rs.getString(4));
				i++;
			}
			con.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
	void printcust_obj_arr() {
		for (int i = 0; i < c_array.length; i++) {
			System.out.print(c_array[i].getCustid()+"\t");
			System.out.print(c_array[i].getName()+"\t");
			System.out.print(c_array[i].getAddress()+"\t");
			System.out.println(c_array[i].getPhone()+"\t");			
		}
	}
	
}

객체변수때와 마찬가지로 setter을 통해 배열 내에 질의문을 통해 들어온 데이터베이스의 값을 받아 넣는다. while문이기 때문에 값이 끝날때까지 넣는다. 이 넣은 값을 아래 출력문 속 for문을 통해 이 배열의 길이만큼 회전하게 된다.

반응형