JDBC를 사용하여 데이터베이스 연결을 설정하는 두 가지 방법 :
1. 코드에서 DriverManager를 사용하여 데이터베이스 연결을 가져옵니다. 이 방법은 비효율적이며 사용자 방문 수가 증가함에 따라 성능, 신뢰성 및 안정성이 점차 감소합니다.
2. 데이터 소스를 구성하는 방법을 사용하여 데이터베이스에 연결하십시오. 이 방법의 본질은 위의 방법을 기반으로 데이터베이스 연결 풀을 추가하는 것입니다.
코드에서 DriverManager를 사용하여 데이터베이스에 연결하는 것 사이에는 다음과 같은 차이가 있습니다.
1) 데이터 소스 연결 풀은 프로그램의 데이터베이스에 연결하는 것입니다. JNDI (Java Naming and Directory Interface) 서버, 즉 컨텍스트 인터페이스의 Lookup () 메소드를 호출하여 데이터 소스 객체를 얻은 다음 데이터 소스 객체의 getConnection () 메소드를 호출하여 연결을 설정합니다.
2) 데이터베이스 연결 개체를 재사용하려면 요청에 대한 응답 시간과 서버의 성능을 개선하려면 연결 풀링 기술이 채택됩니다. 연결 풀링 기술은 여러 데이터베이스 연결 객체를 미리 설정 한 다음 연결 객체를 연결 풀에 저장합니다. 클라이언트 요청이 오면 고객에게 서비스를 제공하기 위해 수영장에서 연결 객체가 꺼집니다. 요청이 완료되면 클라이언트 프로그램은 Close () 메소드를 호출하고 연결 객체를 풀에 다시 넣습니다.
3) DriverManager를 사용하여 코드에서 데이터베이스 연결을 얻는 방식에서 클라이언트 프로그램에서 얻은 연결 객체는 물리적 연결입니다. 연결 객체의 Close () 메소드를 호출하면 연결이 닫힙니다. 연결 풀링 기술을 사용하여 클라이언트 프로그램에서 얻은 연결 객체는 연결 풀의 물리적 연결에 대한 핸들입니다. 연결 객체의 Close () 메소드를 호출하면 물리적 연결이 닫히지 않습니다. 데이터 소스의 구현은 클라이언트 프로그램의 연결 객체와 풀의 연결 개체 간의 연결 만 삭제합니다.
편의를 테스트하려면 데이터베이스에서 사용자 테이블을 만들 수 있습니다 (여기에서 MySQL 5 참조) :
테이블 만들기`user` (`id` int (10) unull auto_increment,`username` varchar (50) 기본 null,`password` varchar (50) default null,`email` varchar (50) 기본 null, 기본 키 (`id`);
데이터베이스 드라이버의 JAR 패키지를 Tomcat의 LIB 디렉토리로 가져옵니다 (여기서 MySQL5를 예로 들어, 사용 된 JAR 패키지는 MySQL-Connector-Java-5.0.8-Bin.jar입니다).
1. 코드에서 DriverManager를 사용하여 데이터베이스 연결을 가져옵니다. 이 방법은 비효율적이며 사용자 방문 수가 증가함에 따라 성능, 신뢰성 및 안정성이 점차 감소합니다.
Oracle 데이터베이스 연결을위한 Java 코드는 다음과 같습니다.
java.sql.connection 가져 오기; Java.SQL.DriverManager 가져 오기; / ***데이터베이스 연결 가져 오기*/ public class dbconnection {/ ** Oracle Database Connection URL*/ 개인 최종 정적 문자열 db_url = "jdbc : oracle : thin :@127.0.0.1 : 1521 : orcl"; / ** Oracle Database Connection 드라이버*/ 개인 최종 정적 문자열 db_driver = "oracle.jdbc.driver.oracledriver"; / ** 데이터베이스 사용자 이름*/ 개인 최종 정적 문자열 db_username = "root"; / ** 데이터베이스 비밀번호*/ 개인 최종 정적 문자열 db_password = "admin"; / *** 데이터베이스 연결 가져옵니다* @return*/ public connection getConnection () {/ ** 연결 연결 개체를 선언*/ Connection Conn = null; { / ** Class.forname () 메서드를 사용 하여이 드라이버의 인스턴스를 자동으로 작성하고 DriverManager를 자동으로 호출하여 등록* / class.forname (db_driver); / ** DriverManager getConnection () 메소드를 통해 데이터베이스 연결 가져옵니다*/ conn = driverManager.getConnection (db_url, db_username, db_password); } catch (예외) {ex.printstacktrace (); } return conn; } / *** 데이터베이스 연결을 닫으십시오** @param connect* / public void closeConnection (Connection Conn) {try {if (conn! = null) { / ** 현재 연결 연결 객체가 닫히지 않음을 결정하십시오. 폐쇄 방법* / if (! conn.isclosed ()) {conn.close (); }}} catch (예외 예) {ex.printstacktrace (); }}}MySQL 데이터베이스 연결의 JSP 코드는 다음과 같습니다.
<%@page import = "java.sql.*, com.mysql.jdbc.driver"%> <%@page language = "java"contenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <html> <body> <%//com.mysql.jdbc.driver class.forname (driver.class.getName ()). newInstance (); String URL = "JDBC : MySQL : // localhost : 3306/demo? useUnicode = true & characterEncoding = utf8"; 문자열 사용자 = "루트"; 문자열 암호 = "123"; Connection Conn = DriverManager.GetConnection (URL, USER, PASSFARPT); 문자 stmt = conn.createstatement (); 문자열 sql = "select * from user"; resultSet rs = stmt.executeQuery (SQL); while (rs.next ()) {out.print ( "<br />" + "==================" + "<br />"); out.print (rs.getLong ( "id") + ""); out.print (rs.getString ( "username") + ""); out.print (rs.getString ( "password") + ""); out.print (rs.getstring ( "이메일") + ""); } %> </body> </html>2. 데이터 소스를 구성하는 방법을 사용하여 데이터베이스에 연결하십시오. 이 방법의 본질은 위의 방법을 기반으로 데이터베이스 연결 풀을 추가하는 것입니다.
1) MySQL 데이터베이스 데이터 소스 연결 풀의 JSP 코드는 다음과 같습니다.
<%@page import = "java.sql.*, javax.naming.*, javax.sql.datasource"%> <%@page language = "java"contenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <html> <%inittx = new initeratctx (new initeral context); DataSource ds = (dataSource) initctx.lookup ( "Java : comp/env/jdbc/demodb"); 연결 conn = ds.getConnection (); 문자 stmt = conn.createstatement (); 문자열 sql = "select * from user"; resultSet rs = stmt.executeQuery (SQL); while (rs.next ()) {out.print ( "<br />" + "==================" + "<br />"); out.print (rs.getLong ( "id") + ""); out.print (rs.getString ( "username") + ""); out.print (rs.getString ( "password") + ""); out.print (rs.getstring ( "이메일") + ""); } %> </body> </html>2) Tomcat의 conf 디렉토리에서 다음 코드를 Server.xml에 추가하십시오.
<CERTXT> <RESIRCE NAME = "JDBC/DEMODB"AUTH = "컨테이너"유형 = "javax.sql.datasource"driverclassname = "com.mysql.jdbc.driver"url = "jdbc : mysql : // localhost : 3306/demo"username = "root"123 "maxactive =" "root" Maxwait = "10000" /> < /context>
3) 웹 프로젝트 디렉토리의 web.xml의 루트 노드에서 다음 내용을 구성하십시오.
<Resource-Ref> <description> mysqldb connection </descript> <res-ref-name> jdbc/demodb </res-ref-name> <res-type> javax.sql.datasource </res-type> <res-auth> conficer </resce-ref>
데이터 소스의 연결 풀 구성이 완료되었지만 프로젝트의 이식성을 향상시키기 위해 두 번째 단계의 컨텐츠를 프로젝트의 Meta-Inf 디렉토리의 Context.xml에 넣는 것이 가장 좋습니다 (이 파일 자체를 만들어야 함).
<? xml version = "1.0"encoding = "utf-8"?> <countxt> <resource name = "jdbc/demodb"auth = "컨테이너"유형 = "javax.sql.datasource"driverclassname = "com.mysql.jdbc.driver"url = "jdo" username = "root"password = "123"maxactive = "50"maxidle = "30"maxwait = "10000" /> < /context>
3. 데이터베이스 운영 도구 클래스 데이터베이스 연결 풀을 구성 할 때 데이터 소스의 데이터를 구성 할 때
코드는 다음과 같습니다.
패키지 db.utils; java.sql.connection 가져 오기; Java.sql.preparedStatement import; java.sql.resultset import; java.sql.resultsetmetadata import; java.sql.sqlexception 가져 오기; java.sql.statement import; import java.text.dateformat; java.util.arraylist 가져 오기; import java.util.date; java.util.hashmap import; Java.util.list 가져 오기; java.util.map import; import javax.naming.initialContext; javax.sql.datasource import; // import org.apache.log4j.logger; /*** 데이터베이스 작동 보조 클래스*/public class dbutils {// private static logger = logger.getLogger ( "dbutils"); / ** *이 명령문은 sql 삽입, 업데이트 또는 삭제 명령문이어야합니다. * @param sql * @param paramlist : 매개 변수, sql statement * @return * @throws exception */ public int execute (string sql, list> paramlist) 예외 {if (sql == null || sql.trim ()). //logger.info("Parameter는 유효합니다! "); } 연결 conn = null; 준비된 상태 PSTMT = NULL; int result = 0; try {conn = getConnection (); pstmt = dbutils.getPreparedStatement (Conn, SQL); setPreparedStatementParam (PSTMT, Paramlist); if (pstmt == null) {return -1; } result = pstmt.executeUpdate (); } catch (예외 e) {//logger.info (e.getMessage ()); 새로운 예외 (e)를 던지십시오. } 마침내 {closestatement (pstmt); CloseConn (Conn); } 반환 결과; } / *** 데이터베이스를 맵 객체로 쿼리하여 얻은 결과 세트를 변환* @param sql : query 문* @param paramlist : parameter* @return* / public list <map <string, object >> getQueryList (string> paramlist) 예외 {if (sql == null || sql.trim ()). //logger.info("Parameter는 유효합니다! "); 널 리턴; } 연결 conn = null; 준비된 상태 PSTMT = NULL; resultSet rs = null; List <map <String, Object >> QueryList = null; try {conn = getConnection (); pstmt = dbutils.getPreparedStatement (Conn, SQL); setPreparedStatementParam (PSTMT, Paramlist); if (pstmt == null) {return null; } rs = getResultset (pstmt); QueryList = getQueryList (RS); } catch (runtimeexception e) {//logger.info (e.getMessage ()); System.out.println ( "매개 변수는 유효합니다!"); 새로운 예외 (e)를 던지십시오. } 마침내 {CloseResultset (RS); 근접한 점 (PSTMT); CloseConn (Conn); } return QueryList; } private void setPreparedStatementParam (preadStatement pstmt, list <bood> paramlist)은 예외 {if (pstmt == null || paramlist == null || paramlist.isempty ()) {return; } dateformat df = dateformat.getDateTimeStance (); for (int i = 0; i <paramlist.size (); i ++) {if (paramlist.get (i) 인스턴스 정수) {int paramvalue = ((integer) paramlist.get (i)). intvalue (); pstmt.setint (i+1, paramvalue); } else if (paramlist.get (i) instanceof float) {float paramvalue = ((float) paramlist.get (i)). floatValue (); pstmt.setfloat (i+1, paramvalue); } else if (paramlist.get (i) 인스턴스) {double paramvalue = ((double) paramlist.get (i)). doubleValue (); pstmt.setDouble (i+1, paramvalue); } else if (paramlist.get (i) 인스턴스의 날짜) {pstmt.setString (i+1, df.format ((날짜) paramlist.get (i))); } else if (paramlist.get (i) instanceof long) {long paramvalue = ((long) paramlist.get (i)). longvalue (); pstmt.setlong (i+1, paramvalue); } else if (paramlist.get (i) instanceof long) {long paramvalue = ((long) paramlist.get (i)). longvalue (); pstmt.setlong (i+1, paramvalue); } else if (paramlist.get (i) 인스턴스 문자열) {pstmt.setString (i+1, (string) paramlist.get (i)); } } 반품; } / ** * 데이터베이스 연결 가져옵니다 * @return * @throws Exception * / private connection getConnection ()은 예외 {initialContext cxt = new InitialContext (); DataSource ds = (dataSource) cxt.lookup (jndiname); if (ds == null) {Throw new Exception ( "데이터 소스를 찾을 수 없습니다!"); } return ds.getConnection (); } private static preparedStatement getPreparedStatement (Connection Conn, String SQL) Exception {if (conn == null || sql == null || sql.trim (). equals ( "")) {return null; } proadStatement pstmt = conn.preparestatement (sql.trim ()); PSTMT를 반환합니다. } / ** * 데이터베이스 쿼리 가져 오기 결과 설정 * @param pstmt * @return * @throws 예외 * / private resultset getResultset (preadstatement pstmt)은 예외를 던지려면 {if (pstmt == null) {return null; } resultSet rs = pstmt.executeQuery (); Rs 리턴; } / ** * @param rs * @return * @throws Exception * / private list <map <string, object >> getQueryList (resultSet rs)는 예외 {if (rs == null) {return null; } resultSmetadata rsmetadata = rs.getmetadata (); int columnCount = rsmetadata.getColumnCount (); list <map <string, object >> datalist = new ArrayList <map <String, Object >> (); while (rs.next ()) {map <string, object> datamap = new Hashmap <string, object> (); for (int i = 0; i <columnCount; i ++) {datamap.put (rsmetadata.getColumnName (i+1), rs.getObject (i+1)); } datalist.add (datamap); } return datalist; } / *** 데이터베이스 연결을 닫습니다* @param conn* / private void closeConn (Connection Conn) {if (conn == null) {return; } try {conn.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} / *** Close* @param stmt* / private void closestatement (stmt) {if (stmt == null) {return; } try {stmt.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} / *** Close* @param rs* / private void closeResultset (resultSet rs) {if (rs == null) {return; } try {rs.close (); } catch (sqlexception e) {//logger.info (e.getMessage ()); }} 개인 문자열 jndiname = "java :/comp/env/jdbc/demodb"; public void setjndiname (String jndiname) {this.jndiname = jndiname; }}요약 : 데이터 소스를 구성하는 방법을 사용하여 데이터베이스에 연결하십시오. 이 방법은 효율적이고 안정적이므로 사용하는 것이 좋습니다.
더 많은 Java Syntax를 보려면 "Java Chinese Manual의 사고", "JDK 1.7 참조 설명서 공식 영어 버전", "JDK 1.6 API Java Chinese Reference Manual", "JDK 1.5 API Java Chinese Reference Manual"을 따라갈 수 있습니다. 또한 모두가 wulin.com을 더 지원하기를 바랍니다.