JDBCを使用してデータベース接続を確立する2つの方法:
1.コードでDriverManagerを使用して、データベース接続を取得します。この方法は非効率的であり、そのパフォーマンス、信頼性、安定性は、ユーザーの訪問数が増えると徐々に低下します。
2。データソースを構成する方法を使用して、データベースに接続します。この方法の本質は、上記の方法に基づいてデータベース接続プールを追加することです。これは非常に効率的です。
コードでDriverManagerを使用してデータベースに接続することには次の違いがあります。
1)データソース接続プールは、プログラムのデータベースに接続することです。 JNDI(Javaネーミングおよびディレクトリインターフェイス)サーバーをクエリすることにより、つまり、コンテキストインターフェイスのLookup()メソッドを呼び出してDataSourceオブジェクトを取得し、DataSourceオブジェクトのgetConnection()メソッドを呼び出して接続を確立します。
2)データベース接続オブジェクトを再利用するために、リクエストへの応答時間を改善し、サーバーのパフォーマンスを行うために、接続プーリングテクノロジーが採用されます。接続プーリングテクノロジーは、事前に複数のデータベース接続オブジェクトを確立し、接続オブジェクトを接続プールに保存します。クライアント要求が来ると、顧客にサービスを提供するために接続オブジェクトがプールから取り出されます。リクエストが完了すると、クライアントプログラムはclose()メソッドを呼び出し、接続オブジェクトをプールに戻します。
3)DriverManagerを使用してコード内のデータベース接続を取得する方法では、クライアントプログラムによって取得された接続オブジェクトは物理的な接続です。接続オブジェクトのclose()メソッドを呼び出すと、接続が閉じられます。接続プーリングテクノロジーを使用して、クライアントプログラムによって取得された接続オブジェクトは、接続プールの物理的な接続のハンドルです。接続オブジェクトのclose()メソッドを呼び出すと、物理的な接続は閉じられていません。データソースの実装は、クライアントプログラムの接続オブジェクトとプール内の接続オブジェクトとの間の接続のみを削除します。
利便性をテストするには、データベースにユーザーテーブルを作成できます(ここでの例としてmysql 5を参照):
テーブル「user」( `dot(10)unsigned not null auto_increment、` username` varchar(50)default null、 `password` varchar(50)デフォルトnull、` email `varchar(50)デフォルトヌル、プライマリキー(` id`)、)を作成します。
データベースのドライバーのJARパッケージをTomcatのLIBディレクトリにインポートします(ここでは、MySQL5を例として使用すると、使用されるJARパッケージはMySQL-Connector-5.0.8.8-Bin.jar)です。
1.コードでDriverManagerを使用して、データベース接続を取得します。この方法は非効率的であり、そのパフォーマンス、信頼性、安定性は、ユーザーの訪問数が増えると徐々に低下します。
Oracleデータベース接続のJavaコードは次のとおりです。
Java.sql.Connectionをインポートします。 Java.sql.drivermanagerをインポートします。 / ***データベース接続の取得*/ public class dbconnection {/ ** oracle database connection url*/ private final static string db_url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; / ** Oracle Database Connection Driver*/ private final static string db_driver = "oracle.jdbc.driver.oracledriver"; / **データベースユーザー名*/プライベート最終的な静的文字列db_username = "root"; / **データベースパスワード*/プライベート最終的な静的文字列db_password = "admin"; / ***データベース接続を取得* @return*/ public Connection getConnection(){/ **接続接続オブジェクトを宣言*/接続conn = null; { / ** class.forname()メソッドを使用して、このドライバーのインスタンスを自動的に作成し、自動的にdrivermanagerを呼び出して登録する* / class.forname(db_driver); / ** drivermanager getConnection()method*/ conn = drivermanager.getConnection(db_url、db_username、db_password)を介してデータベース接続を取得します。 } catch(Exception ex){ex.printstacktrace(); } return conn; } / ***データベース接続を閉じる** @param connect* / public void closeconnection(connection conn){try {if(conn!= null){ / **現在の接続接続オブジェクトが閉じていないことを決定します。 }}} catch(Exception ex){ex.printstacktrace(); }}}MySQLデータベース接続のJSPコードは次のとおりです。
<%@ページインポート= "Java.sql。*、com.mysql.jdbc.driver"%> <%@page言語= "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <html> < class.forname(driver.class.getName())。newInstance(); string url = "jdbc:mysql:// localhost:3306/demo?useunicode = true&charatereCoding = utf8";文字列ユーザー= "root";文字列パスワード= "123";接続conn = drivermanager.getConnection(url、user、password);ステートメントstmt = conn.createstatement();文字列sql = "select * from user";結果rs = stmt.executequery(sql); while(rs.next()){out.print( "<br />" + "============================================"); out.print(rs.getlong( "id") + ""); out.print(rs.getString( "username") + ""); out.print(rs.getString( "password") + ""); out.print(rs.getString( "email") + ""); }%> </body> </html>2。データソースを構成する方法を使用して、データベースに接続します。この方法の本質は、上記の方法に基づいてデータベース接続プールを追加することです。これは非常に効率的です。
1)MySQLデータベースデータソース接続プールのJSPコードは次のとおりです。
<%@page Import = "Java.sql。*、javax.naming。*、javax.sql.datasource"%> <%@page言語= "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8" "%> <html> <body> <body> <body> <body> <body> <body> <body> <body> <% DataSource ds =(dataSource)initctx.lookup( "java:comp/env/jdbc/demodb");接続conn = ds.getConnection();ステートメントstmt = conn.createstatement();文字列sql = "select * from user";結果rs = stmt.executequery(sql); while(rs.next()){out.print( "<br />" + "============================================"); out.print(rs.getlong( "id") + ""); out.print(rs.getString( "username") + ""); out.print(rs.getString( "password") + ""); out.print(rs.getString( "email") + ""); }%> </body> </html>2)Tomcatのconfディレクトリのserver.xmlに次のコードを追加します。
<コンテキスト> <リソース名= "jdbc/demodb" auth = "container" type = "javax.sql.datasource" driverclassname = "com.mysql.jdbc.driver" url = "jdbc:mysql:// localhost:3306/demo" username = "lot" "root" "root" "root" "root" "root" "root" "root" "root" "root" "root" maxwait = "10000" /> < /context>
3)Webプロジェクトディレクトリのweb.xmlのルートノードの下に次のコンテンツを構成します。
<Resource-Ref> <説明> mysqldb接続</description> <res-ref-name> jdbc/demodb </res-ref-name> <res-type> javax.sql.datasource </res-type> <res-auth> container </res-auth>
データソースの接続プール構成が完了しましたが、プロジェクトの移植性を向上させるために、上記の2番目のステップのコンテンツを上記のコンテキストに配置することをお勧めします。
<?xml version = "1.0" encoding = "utf-8"?> <context> <resource name = "jdbc/demodb" auth = "container" type = "javax.sql.datasource" driverclassname = "com.mysql.jdbc.driver" url = " username = "root" password = "123" maxactive = "50" maxidle = "30" maxwait = "10000" /> < /context>
3.データベースの操作ツールクラスデータソースのデータベース接続プールを構成するとき
コードは次のとおりです。
パッケージdb.utils; Java.sql.Connectionをインポートします。 Java.sql.preparedStatementをインポートします。 java.sql.resultsetをインポートします。 java.sql.resultsetmetadataをインポートします。 java.sql.sqlexceptionをインポートします。 java.sql.Statementをインポートします。 java.text.dateformatをインポートします。 java.util.arraylistをインポートします。 Import Java.util.date; java.util.hashmapをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 javax.naming.initialContextをインポートします。 javax.sql.datasourceをインポートします。 // org.apache.log4j.loggerをインポートします。 /***データベース操作補助クラス*/public class dbutils {// private static logger logger = logger.getLogger( "dbutils"); / ** *このステートメントは、SQL挿入、更新、または削除ステートメント * @Param SQL * @Param Paramlist:パラメーター、SQLステートメントのプレースホルダーに対応している必要があります * @return * @throws例外 */ public int execute(string sql、list <object> paramlist)throws exception //logger.info("parameter is valid! "); }接続conn = null; predtatement 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); }最後に{cordestatement(pstmt); Closeconn(conn); } return result; } / ***データベースをマップオブジェクトにクエリすることによって取得された結果セットを変換* @param sql:queryステートメント* @paramパラメーター:@return* / public list <map <string、object >> getquerylist(string sql、list <object> paramlist)throws excepsion //logger.info("parameter is valid! "); nullを返します。 }接続conn = null; predtatement pstmt = null;結果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); CORDESTATEMENT(PSTMT); Closeconn(conn); } queryListを返します。 } private void setpreparedStatementParam(preatedStatement PSTMT、list <Object> paramlist)throws Exception {if(pstmt == null || paramlist == null || paramlist.isempty()){return; } dateformat df = dateformat.getDateTimeInstance(); for(int i = 0; i <paramlist.size(); i ++){if(paramlist.get(i)instanceof integer){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)instanceof double){double paramvalue =((double)paramlist.get(i))。doubleValue(); pstmt.setDouble(i+1、paramvalue); } else if(paramlist.get(i)instanceof date){pstmt.setString(i+1、df.format((date)paramlist.get(i))); } else if(paramlist.get(i)instance of long){long paramvalue =((long)paramlist.get(i))。longvalue(); pstmt.setlong(i+1、paramvalue); } else if(paramlist.get(i)instance of long){long paramvalue =((long)paramlist.get(i))。longvalue(); pstmt.setlong(i+1、paramvalue); } else if(paramlist.get(i)instanceof string){pstmt.setString(i+1、(string)paramlist.get(i)); } } 戻る; } / ** *データベース接続を取得 * @return * @throws例外 * /プライベート接続getConnection()スロー例外{initialContext cxt = new initialContext(); DataSource ds =(dataSource)cxt.lookup(jndiname); if(ds == null){新しい例外をスロー( "データソースが見つかりません!"); } return ds.getConnection(); } private static redpedStatement get -preparedStatement(connection conn、string sql)スロー例外{if(conn == null || sql == null || sql.trim()。equals( "")){return null; } preatsStatement pstmt = conn.preparestatement(sql.trim()); pstmtを返します。 } / ** *データベースクエリ結果セットを取得 * @param pstmt * @return * @throws例外 * / private results getResultset(preatedStatement PSTMT)スロー例外{if(pstmt == null){return null; } resultSet rs = pstmt.executequery(); Rsを返します。 } / ** * @param rs * @return * @throws例外 * /プライベートリスト<Map <String、object >> getQueryList(resultet rs)throws Exception {if(rs == null){return null; } resultsetmetadata 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); }データリストを返します。 } / ***データベース接続を閉じる* @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 andestatement(statement stmt){if(stmt == null){return; } try {stmt.close(); } catch(sqlexception e){//logger.info(e.getmessage()); }} / *** close* @param rs* / private void closeResultset(resultet rs){if(rs == null){return; } try {rs.Close(); } catch(sqlexception e){//logger.info(e.getmessage()); }} private string jndiname = "java:/comp/env/jdbc/demodb"; public void setjndiname(string jndiname){this.jndiname = jndiname; }}概要:データソースを構成する方法を使用して、データベースに接続します。この方法は効率的で安定しているため、使用することをお勧めします。
より多くのJava構文を表示するには、「Java Chinese Manualで考えている」、「JDK 1.7リファレンスマニュアル公式英語版」、「JDK 1.6 API Java中国リファレンスマニュアル」、「JDK 1.5 API Java中国リファレンスマニュアル」をフォローできます。また、誰もがwulin.comをもっとサポートすることを願っています。