IT 관련,,/Java관련 언어들

[웹/JSP]jsp JDBC를 이용한 DB연동하기~

IT깡패's 2018. 8. 11. 12:54
728x90
반응형
SMALL

 

JDBC(Java Database Connectivity)란?

자바에서는 JDBC라는 강력한 도구를 제공해 자바 프로그램에서 데이터베이스를 처리할 수 있게 해줍니다. JDBC는 일관성 있는 방식으로 데이터베이스에 

접근할 수 있는 API를 제공하는 클래스들이라고 볼 수 있습니다.

데이터들의 집합이라고 볼 수 있는 데이터베이스는 데이터베이스 관리 시스템(DBMS, Database Management System)에 관리됩니다. DBMS에는 오라클, 

MSSQL Server, MySQL 등이 있지만 자바 웹 프로젝트에서는 오라클 DBMS를 주로 사용하게 됩니다. 

자바와 데이터베이스는 별도의 시스템으로 동작하기 때문에 자바에서 제공되는 순수 API에는 데이터베이스에 접근할 수 있는 기능을 가진 클래스가 제공되지

않습니다. 자바 프로그램에서 데이터베이스 작업이 필요할 때 사용할 수 있도록 제공되는 것이 JDBC입니다.

 

JDBC 동작

JDBC를 이용한 데이터베이스와 연결에는 4단계를 거쳐서 동작하게 됩니다.

 

JDBC 드라이브 로드

자바에서 데이터베이스 연결을 위한 JDBC 드라이버는 데이터베이스 제작 업체에서 제공합니다. 오라클이 설치된 폴더에서 JDBC 드라이버를 얻어와 자바 

개발 환경에 설치해야만 드라이버를 사용할 수 있습니다.

JDBC 드라이버의 이름은 ojdbcX.jar 형식이며, 버젼별로 X가 달라질 수 있습니다.

 

- 오라클 11g 익스프레스 에디션 설치 경로

 C:\app\user\product\11.2.0\dbhome_1\jdbc\lib

 

JDBC 드라이버 파일(.jar)을 복사하여 Dynamic Web Project의 WEB-INF 폴더 내의 lib 폴더에 붙여넣기하면 드라이버가 설치됩니다.

우선 JDBC의 기능을 사용할 수 있도록 JDBC 클래스를 import 해주어야 합니다. JDBC 클래스는 java.sql 패키지에 존재합니다.

 

- JDBC 클래스, 인터페이스 import

 

import java.sql.*

 

 

이후 JDBC 클래스를 로드한다.

 

Class.forName("oracle.jdbc.driver.OracleDriver");

 

java.lang.Class 클래스의 forName 메소드는 문자열 형태로 전달된 클래스를 JVM으로 로드해주는 기능을 가지고 있습니다. Oracle JDBC 드라이버를 지정해 

로드하여 DriverManager에 등록이 되도록 해주는 코드입니다.

 

데이터베이스 연결

JDBC 드라이버를 로딩한 후 데이터베이스에 연결하기 위해 Connection 객체를 사용할 수 있습니다. Connection 객체는 데이터베이스에 연결해 

작업을 수행할 수 있도록 도와주는 객체입니다. DriverManager 클래스의 getConnection() 메소드를 호출하여 사용할 수 있습니다. 

 

- Connection 객체 얻기

 

Connection conn = DriverManager.getConnection(url, uid, pwd);

 

url : JDBC 형식 URL

uid : 사용자 ID

 

pwd : 패스워드

 

Connection 객체를 얻기 위해 URL, UID, PWD를 지정해야 되는데 URL은 JDBC 형식의 URL이고 UID와 PWD는 사용자명과 패스워드를 

뜻합니다.

 

- JDBC 형식으로 오라클 DBMS를 지정하는 형식 예

 

jdbc:oracle:thin:[hostname][:port]:dbhome

익스프레스 에디션을 설치하였다면 dbname은 XE이다. 

 

- 오라클 익스프레스 에디션의 scott계정에 Connection 객체 얻어오기

 

Connection conn = DriverManager.getConnection(
  "jdbc:oracle:thin:@localhost:1521:XE",
  "scott",
  "tiger");

이후 데이터베이스 작업을 진행할 수 있습니다.

데이터베이스 작업은 conn 객체를 통해 데이터베이스 작업을 할 수 있으며, 모든 데이터베이스 작업이 끝나면 연결을 종료시켜주면 됩니다.

 

- 데이터베이스 연결 끊기

 

conn.close();

 

 

데이터베이스 작업

데이터베이스 연결을 한 후 실제 SQL문을 수행하기 위해서 Statement 객체를 생성합니다.

데이터베이스 연결에 사용한 conn 객체를 통해 createStatement() 메소드를 호출해 Statement객체를 얻어올 수 있습니다.

그리고 데이터베이스 작업이 완료되면 Statement 객체를 반환할 필요가 있어 close()메소드를 호출해야 합니다.

 

- Statement 객체 얻기와 닫기

 

Statement stmt = conn.createStatement();
stmt.close();

 

stmt : 표준 SQL문을 수행하기 위한 Statement 객체

 

Statement 객체를 사용해 SQL 표준 쿼리문을 자바 프로그램에서 사용할 수 있습니다. 쿼민을 사용시키는 메소드는 두가지가 있습니다.

 메소드

 설명

 executeQuery

 select문과 같이 결과값이 여러 개의 레코드를 구해지는 경우 사용

 executeUpdate

 insert, Update, delete 문과 같은 내부적으로 테이블 변경이 있고 결과 값이 없는 경우 사용 

executeQuery메소드의 결과는 ResultSet으로 받게 됩니다.

 

- Select 구문 예시

 

String sql = "Select * from emp";
ResultSet rs = stmt.executeQuery(sql);

 

executeQuery 메소드의 리턴인 ResultSet 객체는 여러 개의 행으로 결과값을 받을 수 있으며, 각 행에 접근할 수 있도록 Iterator와 비슷한 메소드를 

제공합니다.

 

- ResultSet의 대표 메소드

메소드

 설명

 next()

 현재 행에서 한 행 앞으로 이동

 previouse()

 현재 행에서 한 행 뒤로 이동

 first()

 첫 번째 행으로 이동

 last()

 마지막 행으로 이동

 

JSP에서 Database 연동하기

java단으로 jdbc연결을 코딩한 몇가지 예시를 살펴보겠습니다~!!

jsp에서도 jdbc연결을 할 수 있지만, 주로 model1에서 사용하기 때문에 model2를 사용하려면 java에서 jdbc연동하는 것이 좋습니다~

 

- jdbc연결 예시1

 

package jdbcEx;

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

public class EmpEx_01 {
	public static void main(String[] args) {
		
		String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String DB_USERNAME = "scott";
		String DB_PASSWORD = "tiger";
		
		// 드라이버 로딩 - OJDBC6
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); 
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Connection conn = null; //DB연결 객체
		Statement st = null; // SQL문 (수행)객체
		ResultSet rs = null; // 조회결과 반환 객체
		
		String sql = "SELECT * FROM emp";  // SQL문
	    
		try { 
			// DB연결
			conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
			
			// Statement 객체 얻기
			st = conn.createStatement();
			
			// SQL문 수행 및 결과 얻기
			rs = st.executeQuery(sql);
			
			// 결과 출력
			while(rs.next()) {   // 다음 행 결과 보기
				System.out.print(rs.getString("empno"));
				System.out.print(", " + rs.getString("ename"));
				System.out.print(", " + rs.getString("job"));
				System.out.print(", " + rs.getString("mgr"));
				System.out.print(", " + rs.getString("hiredate"));
				System.out.print(", " + rs.getString("sal"));
				System.out.print(", " + rs.getString("comm"));
				System.out.println(", " + rs.getString("deptno"));
			}
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				st.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		
	}
     
}

 

 

- jdbc연결 예시2

 

package jdbcEx;

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

public class EmpEx_02 {
	public static void main(String[] args) {
		
		String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String DB_USERNAME = "scott";
		String DB_PASSWORD = "tiger";
		
		// 드라이버 로딩 - OJDBC6
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); 
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Connection conn = null; //DB연결 객체
		Statement st = null; // SQL문 (수행)객체
		ResultSet rs = null; // 조회결과 반환 객체
		
		String createTbSql = "CREATE TABLE userTest (";
		createTbSql += "NO NUMBER CONSTRAINT PK_USER_TEST PRIMARY KEY, ";
		createTbSql += "NAME VARCHAR(20) NOT NULL, ";
		createTbSql += "PHONE VARCHAR2(40) NOT NULL)";
		
		String createSqSql = "CREATE SEQUENCE SEQ_USERTEST_NO ";
		createSqSql += "INCREMENT BY 1 ";
		createSqSql += "START WITH 1";
	
		try { 
			// DB연결
			conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
		
			// Statement 객체 얻기
			st = conn.createStatement();
		
			// SQL문 수행 및 결과 얻기
			st.executeUpdate(createTbSql);				
			st.executeUpdate(createSqSql);
			
			
			boolean result = st.execute(
					"SELECT * FROM tabs "
					+ "WHERE table_name='USERTEST'");
			if(result) {
				System.out.println("테이블 생성 완료");
			}
			
			
		} catch (SQLException e) {
			
			e.printStackTrace();
		} finally {
			try {
//				rs.close();
				st.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		
	}
     
}

 

 

- jdbc연결 예시3

 

package jdbcEx;

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

public class EmpEx_03 {
	
	public static void main(String[] args) {
		
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String user = "scott";
		String pass = "tiger";
		
		Connection conn = null;
		Statement st = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		String sql = "DELETE FROM emp_merge";
		
		try {
			conn = DriverManager.getConnection(url, user, pass);
			
			st = conn.createStatement();
			
			//int rows = st.executeUpdate(sql);
			
			//System.out.println(rows+"행 영향 받음");
			boolean b = st.execute("select * from emp");
			System.out.println(b);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
		   try {
				st.close();
				conn.close();
			} catch (SQLException e) {				
				e.printStackTrace();
			}
			
		
		}
	}
}

 

 

- jdbc연결 예시4

 

package jdbcEx;

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

public class EmpEx_04 {
	
	public static void main(String[] args) {
		
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		String user = "scott";
		String pass = "tiger";
		
		Connection conn = null;
		Statement st = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		String sql = "SELECT * FROM emp";
		
		try {
			conn = DriverManager.getConnection(url, user, pass);
			
			st = conn.createStatement();
			
			ResultSet rs = st.executeQuery(sql);
			while(rs.next()) {
				//System.out.println(rs.getString("empno"));
				System.out.println(rs.getString(1));
			}
			
			//int rows = st.executeUpdate(sql);
			
			//System.out.println(rows+"행 영향 받음");
			boolean b = st.execute("select * from emp");
			System.out.println(b);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
		   try {
				st.close();
				conn.close();
			} catch (SQLException e) {				
				e.printStackTrace();
			}			
		
		}
	}
}

 

 

java단에서 jdbc연결을 했으면 servlet에서도 연결할 수 있습니다.

그런데 servlet은 java에서 jdbc연결하는 것보다 편하지않고 코딩도 더 많이 사용해야하기 때문에 주로 servlet은 잘 사용하지 않는 것으로 알려져

있습니다~

 

- servlet jdbc연결 예시1

 

package jdbcWebEx;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/getEmp.do")
public class GetEmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private String url = "jdbc:oracle:thin:@localhost:1521:XE";
	private String user = "scott";
	private String pass = "tiger";
	
	@Override
	public void init() throws ServletException {
		// OJDBC 드라이버 로드
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		PrintWriter out = response.getWriter();
		response.setContentType("text/html;charset=UTF-8");
		
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		
		String sql = "SELECT * FROM emp ORDER BY empno";
		
		try {
			conn = DriverManager.getConnection(url, user, pass);
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			
			while(rs.next()) {
				String empno = rs.getString("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				String mgr = rs.getString("mgr");
				String hiredate = rs.getString("hiredate");
				String sal = rs.getString("sal");
				String comm = rs.getString("comm");
				String deptno = rs.getString("deptno");
				
				out.print(empno + " : " +
						ename + " : " +
						job + " : " +
						mgr + " : " +
						hiredate + " : " + 
						sal + " : " + 
						comm + " : " + 
						deptno + "
");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
}

 

 

- servlet jdbc연결 예시2

 

package jdbcWebEx;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class GetEmpServlet_02 extends HttpServlet {
	
	private String url;
	private String user;
	private String pass;
	
	@Override
	public void init() throws ServletException {
		//OJDBC 드라이버 로드
		
		ServletContext context = getServletContext();
		
		String driver = context.getInitParameter("driver");
		
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
	
		
		url = getInitParameter("url");
		user = this.getInitParameter("user");
		pass = getInitParameter("pass");
		
		}
	}
		@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
			
			PrintWriter out = res.getWriter();
			res.setContentType("text/html;charset=UTF-8");
			
			Connection conn = null;
			Statement st = null;
			ResultSet rs = null;
			
			String sql = "SELECT * FROM emp ORDER BY empno";
			
			try {
				conn = DriverManager.getConnection(url, user, pass);
				st = conn.createStatement();
				rs = st.executeQuery(sql);
				
				while(rs.next()) {
					String empno = rs.getString("empno");
					String ename = rs.getString("ename");
					String job = rs.getString("job");
					String mgr = rs.getString("mgr");
					String hiredate = rs.getString("hiredate");
					String sal = rs.getString("sal");
					String comm = rs.getString("comm");
					String deptno = rs.getString("deptno");
					
					out.print(empno + " : " +
							ename + " : " +
							job + " : " +
							mgr + " : " +
							hiredate + " : " + 
							sal + " : " + 
							comm + " : " + 
							deptno + "
");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}	
	

}

 

jsp jdbc연결은 개발자에겐 필수적이기 때문에 꼭 숙지하고 넘어가셔야 합니다.

jsp를 이용한 jdbc연결 셋팅 포스팅은 여기까지 하도록 하겠습니다~~

728x90
반응형
LIST