JAVA-DBConnection

이강민·2022년 4월 16일
0

웹 개발반 - JAVA

목록 보기
19/19
post-thumbnail

JAVA-DBConnection(JDBC)

JAVA에서 db에 접근할 수 있도록 해주는 API를 JDBC라고 한다.
JAVA DataBase Connetivity

세팅

먼저 자바와 mysql은 서로 다은 프로그램이다.
Java에서 sql에 접근하고 싶으면 java build path를 만들어야 한다.
외부의 jar파일을 이용하여 java의 api에 연결하는 것이다.
보통의 jar파일은 다음과 같은 경로에 있다.

C:\Program Files (x86)\MySQL\Connector J 8.0
mysql-connector-java-8.0.27.jar파일을 import 

해당 파일을 참조하고 싶으면 프로젝트 > 우측마우스 클릭 > properties > java build path > add external JARs > jar 파일선택, apply and close

위와같은 절차를 마치면 우리의 프로젝트 안에 referenced libraries가 생성되고 그안에 우리가 넣은 jar파일이 존재한다.

세팅코드 작성

dbconnection을 할때마다 연결하는 코드를 작성하고 연결시킨다음 쿼리문을 통해 데이터를 crud하는 작업은 매번하기에는 번거롭고 우리의 프로젝트가 만약 데이터베이스가 필요한 프로젝트라면 한번만 연결하는 프로젝트일 가능성은 매우 낮다.
따라서 객체로써 클래스로 만들어 활용하면 필요할 때마다 객체화하여 가져오는 것이 더욱 효율적일 것이다.

따라서 클래스로 만들어서 다른 클래스나 패키지에서 참조될 수 있도록 하자
필요와 사용성에 따라 클래스의 타입을 결정한다.
여기서는 먼저 public으로 class를 생성할 것이다.

public class DBconn{
	
}

다음 자바의 sql내장 타입인 Connection을 이용하여 변수를 만든다.
다음 객체를 다른 클래스에서 이용하지 못하게 private으로 만들고 메소드를 별도로 만들어 메소드를 이용하여 접근할 수 있도록 할 것이다.

다른 패키지와 다른 클래스에서 이용할 수 있도록 public과 전역에서 사용하는 static으로 만들자

public class DBconn{
	private static Connection conn;
    public static Connection getConnection(){
    	
    }
}

다음은 Class.forName()을 호출하여 Driver가 자기자신을 초기화 하여 DriverManager에 등록하게 한다. 즉, 개발자과 관리하지 않는 static객체들이 알아서 DriverManager에 등록되게 하는 것이다.
어떤 인자로도 전달하지 않고 그냥 호출만 하지만 여기서는 해당되는 jdbc의 Driver를 문자열로 작성해준다.
또한 작성된 드라이브는 객체를 참조하지 못했을 때 오류를 리턴해야 함으로 trycatch문으로 만들어야 한다.
자동완성 시키면 편하다.
cntl + shift + z

public class DBconn{
	private static Connection conn;
    public static Connection getConnection(){
    	try{
        	Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("드라이버 로딩성공!");
        }catch(ClassNotFoundException e){
        	System.out.println("실패");
        }
    }
}

이제 드라이브가 로딩성공하였다면 이제는 우리의 Mysql과 sql의 아이디 비밀번호를 통해 dbms에 접근하는 코드를 작성한다.
driverManager의 내장 함수인 getConnection을 이용하여 dbms의 경로, 아이디, 비밀번호를 넘기면 데이터베이스에 접근 할 수 있다.
또한 연결이 실패 될 수 있음으로 trycatch문으로 만드는데 catch문은 연결이되니 연결시켜서 SQLException 에러를 리턴한다.
그리고 getConnection함수를 이전에 만든 Connection 객체에 넣을 것인다.
이 객체가 null인지의 여부를 판단하여 연결문을 실행 할 지 아니면 그냥 데이터베이스 연결을 담은 conn을 리턴할지 결정한다.

import java.sql.Connection;

public class DBconn {
// DB관련 jar 파일을 build하여 import 시킨 다음
//	DB와 연결해야 한다ㅣ. 
//	connection 관련 객체를 담는 static 변수를 private로 담는다. 
	private static Connection conn;
//	해당 변수를 실행 시 dbconnection이 되도록 한다.
	public static Connection getConnection() {
		if(conn == null) {
//			conn 객체에 접근하지 않는 경우 아래의 코드를 실행한다.
			try {
//				데이터베이스에 접근하는 드라이브를 실행
				Class.forName("com.mysql.cj.jdbc.Driver");
				System.out.println("드라이버 로딩성공!");
				
				String url = "jdbc:mysql://localhost:3306/web0315";
				String user = "아이디";
				String password = "비밀번호";
// 드라이브메니저의 내장메소드를 이용해 우리가 사용할 dbms정보를 넘겨주고 있다.
				conn = DriverManager.getConnection(url, user, password);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}catch(SQLException sqle) {
				System.out.println("실패");
			}
		}
		return conn;
	}
}

여기까지 왔다면 이제 데이터베이스를 사용할 준비가 끝난것이다.
사용하는 방법은 다음과 같다.
sql문은 담는 변수, Connection객체 초기화, PreparedStatement 초기화
준비.

사용할 sql문 작성, conn에 우리가 만든 DB클래스의 메소드 담기,
PreparedStatement에 Connection 객체명인 conn에 prepareStatement메소드 사용하여 sql문 담기
여기까지 하면 준비가 완료된 것이다.
이제 어떻게 사용하는가에 따라 달라진다.
우리는 select를 사용하기에 executeQuery메소드를 이용하고 만약 그외의 sql문을 사용한다면 executeUpdate메소드를 사용하는 것이다.
이 메소드를 사용했다면 resultSet에 변수로 담아주어 가져온 정보를 출력해주면 끝이다.

package study2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBTest {
	public static void main(String[] args) {
		String sql = "";
		Connection conn;
		PreparedStatement ps;
		
		try {
			sql = "select * from user";
			conn = DBconn.getConnection();
			ps = conn.prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			String [] getdata = {"useridx", "userid",
					"userpw","username","userage","userphone","useraddr"};
			while(rs.next()) {
				String result = "";
				for (int i = 0; i < getdata.length; i++) {
					result += rs.getString(i+1) + " / ";					
				}
				System.out.println(result);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

추가적으로 쿼리문에 변수를 이용한다면 ?를 작성한다.
?에 문자열 연결로 변수명을 작성하던가 혹은 곧바로 sql문안에 ""가 들어간 변수가 필요하다면 setString을 이용한다. excute를 사용하는 것처럼 prepareStatement메소드가 있는 ps객체명에 붙여서 사용한다.

// 첫번째 ? 에 strdata 넣어줘
ps.setString(1, strdata);
ps.executeUpdate();
profile
배움은 끝없이

0개의 댓글