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연결 셋팅 포스팅은 여기까지 하도록 하겠습니다~~
'IT 관련,, > Java관련 언어들' 카테고리의 다른 글
[웹/JSP]서블릿(servlet) 개념 및 기본 예제,, (0) | 2018.08.16 |
---|---|
[웹/jQuery] jQuery에 관한 개요 및 설정들,, (0) | 2018.08.14 |
[웹/JSP]서블릿(Servlet)과 톰캣설치~ (0) | 2018.08.07 |
[JSP/서블릿]jsp 파일업로드,, (0) | 2018.08.06 |
[GUI/Swing]자바 Swing을 이용한 계산기 프로그램 (0) | 2018.07.28 |