1. 먼저 JDBC가 무엇인지 설명하십시오
이 명사를 언뜻보기 전에 보았을 때, 나는 전체 영어 이름이 무엇인지 알아야한다고 생각했습니다. 문자 그대로 연결 가능한 Java 데이터베이스로 변환되는 Java 데이터베이스 연결. 무뚝뚝하게 말하면, Java 코드를 작동하여 데이터베이스를 직접 제어 할 수 있도록 Java 코드 및 데이터베이스를 연결하기위한 중간 링크 세트를 제공하고 싶습니다.
2. JDBC의 본질
데이터베이스에 액세스하기위한 Java 솔루션입니다. 특정 데이터베이스와 관련이없는 Java 작동 인터페이스를 달성하기 위해 동일한 방식으로 다른 데이터베이스에 액세스하기를 희망합니다.
JDBC는 본질적으로 표준화 된 인터페이스 세트입니다. 다른 데이터베이스 제조업체는 자체 데이터베이스 특성에 따라이 인터페이스를 구현하며 특정 구현 방법에 대해 신경 쓰지 않아도됩니다.
JDBC의 데이터베이스 제조업체가 구현 한 주요 인터페이스는 다음과 같습니다.
DriverManager : 운전자 관리
연결,
DatabasemetAdata : 인터페이스에 연결합니다
성명,
준비된 상태
CallableStatement : 명령문 객체 인터페이스
resultSet,
resultsetmetadata : resultset 인터페이스
3. JDBC의 작동 방식
프로그래머는 기본 데이터베이스 제조업체가 구현 한 부품을 호출합니다.
즉 : 1) 연결 인터페이스를 통해 연결의 첫 번째 단계를 구현합니다.
2) 명세서 결과를 통해 SQL 문을 전송합니다
3) 데이터베이스 리턴 결과를 결과 세트 결과 세트 인터페이스에 저장하는 주요 프로세스는 다음과 같이 요약 될 수 있습니다.
1) 드라이버를로드하고 연결을 만듭니다
2) 문을 만듭니다
3) SQL 문을 실행하십시오
4) 결과 세트를 다시 보냅니다
5) 연결을 닫습니다
아래는 JDBC 구현 방법을 설명하기 위해 ECLIPS와 함께 배운 Oracle 데이터베이스를 가져갑니다.
1) 드라이버로드
사용 된 방법은 다음과 같습니다. class.forname ( "driver");
이 드라이버를 얻는 방법에 대해 내가 아는 것은 다음과 같습니다. JDBC JAR 패키지를 확장하십시오. OJDBC6.jar를 사용하는 경우 oracle.jdbc.driver를 찾은 다음 OracledRiver를 찾은 다음 QualityCopy를 마우스 오른쪽 버튼으로 클릭 한 다음 accent.forname ( "oracle.jdbc.driver.oracledriver";
2) 연결을 만듭니다
사용 된 메소드는 다음과 같습니다. conn = drivermanager.getConnection ( "JDBC : Oracle : Thin : @IP 주소 : 1521 : orcl", "데이터베이스 계정", "데이터베이스 암호");
예를 들면 다음과 같습니다. conn = drivermanager.getConnection ( "JDBC : Oracle : Thin :@172.16.3.8 : 1521 : orcl", "JSD1601", "JSD1601");
3) 명세서 개체를 만듭니다
사용 된 방법은 다음과 같습니다. stmt = conn.createstatement ();
두 번째 단계에서 생성 된 연결은 메소드를 호출하는 데 사용됩니다.
ExecuteUpdate 메서드를 호출하고 SQL 문을 전달하여 서면 SQL 문을 실행하십시오. ExecuteUpdate 메소드가 실행할 수있는 SQL 유형은 인서트, 업데이트, 삭제임을 알 수 있어야합니다.
예를 들면 다음과 같습니다. stmt = conn.createstatement ();
문자열 sql = "emp_jiawenzhe (empno, ename, sal, deptno) 값 (1000, 'Jia Wenzhe', 1500,10)에 삽입;";
int i = stmt.executeUpdate (SQL);
여기서 반환 값은 영향을받는 행의 수입니다. 영향을받는 행의 수에 따라 작업이 성공했는지 판단 할 수 있습니다.
4) 반환 된 결과 세트는 주로 선택 작업을 나타냅니다 (여기서 언급되지 않음)
5) 마지막으로 연결을 닫습니다
예를 들면 다음과 같습니다. conn.close ();
주석을 포함하여 전체 코드를 나열하십시오.
패키지 jdbc_day01; import java.sql.*;/*** jdbc* 1의 작동 단계를 보여줍니다.* 1을로드* 2. 연결을 만듭니다* 2. 명령문 생성* 3. main (String [] args)은 sqlexception {// 요구 사항 : 직원, 직원 번호, 직원 이름, 급여, 부서 번호 // 1, Connection Conn = null을 만듭니다. try {class.forname ( "oracle.jdbc.driver.oracledriver"); System.out.println ( "성공적인 드라이버로드"); // 2. conn = drivermanager.getConnection ( "JDBC : Oracle : Thin :@172.16.3.8 : 1521 : orcl", "JSD1601", "JSD1601"); System.out.println (conn.getClass (). getName ()); // 3. // 진술서 개체. sql statement를 보내고 실행하십시오. * 삽입, 업데이트, 삭제 명령문* 반환 값 int int int는 데이터베이스 테이블에 영향을 미치는 행의 수를 나타냅니다*/ statmt stmt = conn.createstatement (); 문자열 sql = "Emp_jiawenzhe (Empno, ename, sal, deptno)" + "값 (1000, 'Wang Xiaoer', 1500,10)에 삽입;"; int i = stmt.executeUpdate (SQL); if (i> 0) {System.out.println ( "성공적으로 저장!"); }} catch (classNotFoundException e) {e.printstacktrace (); // 1. 로그 // 2를 기록하십시오. 발신자에게 새로운 runtimeexception ( "로드 드라이버 오류", e)을 던지라고 통지합니다. } 마지막으로 {// 연결을 닫습니다. (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); }}}}}}}} 참고 : Oracle 데이터베이스에서 사용할 수있는 JAR 패키지 : OJDBC14.JAR/OJDBC6.JAR (Oracle12C는 이것을 사용합니다).
MySQL 데이터베이스에서 사용할 수있는 JAR 패키지 : MySQL-Connector-Java-5.0.4-Bin.jar
드라이버 클래스로드 :
class.forname ( "com.mysql.jdbc.driver");
1. 포장 방법 소개
저에게 가장 큰 영향을 미쳤던 것은 특정 일련의 코드를 작성할 때 코드 재사용이 있으면 방법을 캡슐화하는 것에서 클래스 캡슐화에 이르기까지 코드를 어느 정도 캡슐화하는 메소드를 선택할 것입니다. 쿼리에는 결과 세트의 작동이 포함되고 별도로 선언 된 경우에 데이터베이스 작업 (추가, 삭제 및 수정)에 대해 이전에 언급 된 JDBC 사용 (추가, 삭제 및 수정)은 다음과 같은 네 가지 프로세스로 나뉩니다.
1) 드라이버로드
2) 연결을 만듭니다
3) 명령문 개체를 만들고 SQL을 보냅니다
4) 연결을 닫으십시오
다시 말해, 데이터베이스 작업을 수행 할 때 위의 단계를 수행해야하므로 코드의 중복으로 이어집니다. 그래서 우리는 이러한 일반적인 단계를 수업에 캡슐화하여 사용하기위한 도구 클래스가 될 수 있도록 제안했습니다.
2. 세 가지 버전의 캡슐화
버전 1
내가 배울 때, 나는이 수업을 점진적으로 점진적으로 캡슐화하고 점진적으로 개선했습니다. 캡슐화의 궁극적 인 버전이 직접 제안되면 초보자가 수락하기가 어렵 기 때문입니다. 첫 번째, 즉 가장 간단한 캡슐화 방법을 설명하겠습니다.
데이터베이스 작동 방식에 관계없이 운전자를로드하는 방법에 관계없이 드라이버로드가 필수적이며로드 드라이버에는 주로 선언, 드라이버 이름, IP 번호, 포트 번호, 데이터베이스 계정 이름, 비밀번호 등이 포함되어 있으므로 다음과 같이이 문자열을 별도로 정의합니다.
개인 정적 문자열 driver class = "oracle.jdbc.driver.oracledriver"; 개인 정적 문자열 URL = "JDBC : Oracle : Thin : Losthost : 1521 : orcl"; 개인 정적 문자열 user = "시스템"; 개인 정적 문자열 비밀번호 = "123";
이런 식으로 연결을 만들 때 긴 문자열을 대체 할 변수의 이름을 직접 가져올 수 있습니다. 드라이버를로드 할 때 Method Class.forname은 데이터를로드하는 동안 드라이버가로드되므로 정적 블록으로 선언됩니다.
아래 그림과 같이 :
static {try {class.forname (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "로드 드라이버 오류", e); }}연결을 만들기 위해 DriverManager의 getConnection 메소드를 호출하고 해당 사용자 이름과 비밀번호를 넣습니다. 이 메소드를 정의한 메소드에 직접 넣은 다음 내 메소드를 직접 호출하여 연결을 만듭니다. 이 메소드의 리턴 값은 연결 객체이며,이 연결 유형 객체를 가져 오기를 원하기 때문에 이해하기 쉽습니다.
public static connection getConnection ()는 sqlexception {connection conn = drivermanager.getConnection (url, user, password); CONN을 반환; }그런 다음 명령문 객체를 작성하고 SQL을 보냅니다. 물론 SQL은 SQL이해야 할 일이 매우 다르 므로이 단계를 캡슐화 할 필요는 없기 때문에 SQL은 유일한 특별한 장소입니다.
마지막으로 아래와 같이 Close () 메소드라고하는 연결을 닫습니다.
public static void close (Connection Conn) {if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "Close Connection Error", e); }}}}패키지의 전체 첫 번째 버전은 다음과 같습니다.
패키지 jbbc_day01; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlection;/** * 연결을 관리하는 데 사용 * @author jiawenzhe * */public class dbutil {private static string driver class = "oracle.jdbc.driver.oracledriver"; 개인 정적 문자열 URL = "JDBC : Oracle : Thin : Losthost : 1521 : orcl"; 개인 정적 문자열 user = "시스템"; 개인 정적 문자열 비밀번호 = "123"; // 1. 드라이버로드 STATIC {try {class.forname (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "드라이버 오류로드", e); }}} // 2. 연결 생성/** 연결을 작성하는 방법* 반환 값 유형을 생성 할 수있는 메소드를 정의하는 방법 : 작업 결과가 있든, 결과 유형이 반환 값 유형* 매개 변수 목록입니다. CONN을 반환; } // 3. 연결을 닫습니다 public static void close (Connection Conn) {if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "Close Connection Error", e); }}}}}이 방법으로 캡슐화 한 다음 SQL 작업을 수행 할 때 캡슐화 클래스를 직접 호출하십시오. 당신이 쓸 필요는 당신의 명령문 개체를 만들고 sql 문을 보내는 것입니다.
버전 2
실제로 버전 2는 버전 1과 매우 유사합니다. 버전 1의 단점 중 하나, 즉 데이터베이스를 변경할 때 다른 데이터베이스의 계정 비밀번호가 다르므로 계정 비밀번호와 IP 주소를 수정해야합니다. 이전에 툴 클래스에서 문자열 형태로이를 캡슐화했는데, 이는 데이터베이스를 변경할 때마다 도구 클래스를 수정해야합니다. 이는 매우 부적절합니다. 따라서 이러한 연결 데이터를 구성 파일에 넣는 개선 방법을 제안했으며 도구 클래스는이 구성 파일을 읽습니다. 구성 파일을 수정할 때 직접 수정할 수 있습니다.
이 버전을 소개하기 전에 스트림 형식으로 구성 파일 내용을 읽고 읽을 수있는 파일 인 새 클래스 인 Properties를 소개 한 다음 도구 클래스로 반환 할 수 있습니다.
먼저 구성 파일의 예를 제시하겠습니다. 실제로 설명 할 필요가 없습니다. 아래와 같이 한 눈에 분명합니다.
jdbc.driverclass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc : oracle : thin : localhost : orcljdbc.user = systemjdbc.password = 123
앞면은 핵심이며, 다음은 값이며, 이전 키 값은 변수 이름을 정의하는 것과 마찬가지로 스스로 정의됩니다. 후속 값은 데이터베이스의 실제 상황입니다. 여기서 특별한주의를 기울여야 할 것은이 구성 파일의 접미사 이름이 .properties로 끝나야한다는 것입니다. 이러한 방식으로 속성 클래스를 읽을 수 있기 때문입니다.
이 섹션의 예는 다음과 같습니다.
static {try {// 속성 파일 데이터 속성을로드합니다. pop = new Properties (); pop.load (dbutil2.class.getClassLoader (). getResourCeasStream ( "db.properties")); url = pop.getProperty ( "jdbc.url"); DriverClass = pop.getProperty ( "JDBC.DriverClass"); user = pop.getProperty ( "jdbc.user"); password = pop.getProperty ( "jdbc.password"); class.forname (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "로드 드라이버 오류", e); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}load ()의 방법은 그것을 읽거나 구성 파일을로드하는 것으로 간주 될 수 있습니다. 그 의미를 탐구하지 않고이 전체 문장을 기억하십시오. getProperty ()는 키를 통해 해당 값을 얻습니다.이 값은 키 값 쌍 세트의 값을 얻는 형태와 매우 유사합니다.
전체 코드는 다음과 같습니다.
패키지 jbbc_day01; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputStream; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlection; import java.util.properties;/** dateba.util.properties; 속성 파일에 저장 * @author jiawenzhe * */public class dbutil2 {private static string driver class; 개인 정적 문자열 URL; 개인 정적 문자열 사용자; 개인 정적 문자열 비밀번호; // 1. 로드 드라이버 static {try {// 속성 파일 데이터 속성을로드합니다. pop = new Properties (); pop.load (dbutil2.class.getClassLoader (). getResourCeasStream ( "db.properties")); url = pop.getProperty ( "jdbc.url"); DriverClass = pop.getProperty ( "JDBC.DriverClass"); user = pop.getProperty ( "jdbc.user"); password = pop.getProperty ( "jdbc.password"); class.forname (DriverClass); } catch (classNotFoundException e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "로드 드라이버 오류", e); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }} // 2. 연결 생성/** 연결을 작성하는 방법* 반환 값 유형을 생성 할 수있는 메소드를 정의하는 방법 : 작업 결과가 있든, 결과 유형이 반환 값 유형* 매개 변수 목록입니다. CONN을 반환; } // 3. 연결을 닫습니다 public static void close (Connection Conn) {if (conn! = null) {try {conn.close (); } catch (sqlexception e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "Close Connection Error", e); }}}}}