再說JDBC
Jun 07, 2016 pm 03:59 PM上篇文章《再說Java EE》說明了一下什么是規(guī)范,有什么作用,這篇文章來(lái)細(xì)說一下JDBC。 JDBC JDBC(Java Database Connection)也是Java EE中的一個(gè)規(guī)范,所謂規(guī)范是一組接口,如JDBC接口包含在java.sql及javax.sql包中,其中java.sql屬于JavaSE,javax.sql
上篇文章《再說Java EE》說明了一下什么是規(guī)范,有什么作用,這篇文章來(lái)細(xì)說一下JDBC。
JDBC
JDBC(Java Database Connection)也是Java EE中的一個(gè)規(guī)范,所謂規(guī)范是一組接口,如JDBC接口包含在java.sql及javax.sql包中,其中java.sql屬于JavaSE,javax.sql屬于JavaEE,部分如下圖:
以上來(lái)自jdk中的src/java/sql。
因?yàn)樘岢嫦蚪涌诰幊?,所以建議僅使用JDBC規(guī)范中的類,規(guī)范與實(shí)現(xiàn)的關(guān)系如下:
使用
核心API
JDBC中核心的API有: DriverManager:工廠類,用來(lái)生產(chǎn)Driver對(duì)象Driver:驅(qū)動(dòng)程序?qū)ο蟮慕涌贑onnection:數(shù)據(jù)庫(kù)連接對(duì)象Statement:執(zhí)行靜態(tài)的SQL語(yǔ)句的接口Resultset:結(jié)果集對(duì)象的接口操作流程
加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)連接執(zhí)行SQL語(yǔ)句,得到結(jié)果集對(duì)結(jié)果集進(jìn)行CRUD處理釋放資源如圖:
源碼分析
java.sql下有48個(gè)類,javax.sql下有45個(gè)類,展開分析不太現(xiàn)實(shí),本文僅分析兩個(gè)類,DriverManager和Driver。不知大家注意過這個(gè)問題沒有,JDBC是接口,數(shù)據(jù)庫(kù)驅(qū)動(dòng)是實(shí)現(xiàn),那么你編寫的項(xiàng)目是如何找到實(shí)現(xiàn)的呢?
控制臺(tái)輸出
為了可以看到驅(qū)動(dòng)加載過程中輸出的日志,在加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver")之前,加上一句:
DriverManager.setLogWriter(new java.io.PrintWriter(System.out));即可在控制臺(tái)中看到輸出。
加載驅(qū)動(dòng)
驅(qū)動(dòng)使用很簡(jiǎn)單,將數(shù)據(jù)庫(kù)驅(qū)動(dòng)放到項(xiàng)目的lib中,在代碼中寫入:
Class.forName("com.mysql.jdbc.Driver");如果使用框架,如Hebernate配置文件中寫入:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>很明顯,這兩種方式都是使用反射加載驅(qū)動(dòng)程序,我們來(lái)看一下驅(qū)動(dòng)程序Driver的源代碼,以mysql-connector-java-3.1.13為例:
package com.mysql.jdbc; import java.sql.SQLException; public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves with the DriverManager // static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } /** * Construct a new driver and register it with DriverManager * @throws SQLException * if a database error occurs. */ public Driver() throws SQLException { // Required for Class.forName().newInstance() } }核心代碼就是那段靜態(tài)代碼塊(static{}的意思是在類加載時(shí)執(zhí)行一次,并且僅此一次),可以看到靜態(tài)代碼斷的意思是將此Driver類實(shí)例化后注冊(cè)到JDBC的java.sql.DriverManager類中,所以再來(lái)看一下JDBC的DriverManager.registerDriver:
/** * Registers the given driver with the <code>DriverManager</code>. * A newly-loaded driver class should call * the method <code>registerDriver</code> to make itself * known to the <code>DriverManager</code>. * * @param driver the new JDBC Driver that is to be registered with the * <code>DriverManager</code> * @exception SQLException if a database access error occurs */ public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException { if (!initialized) { initialize(); } DriverInfo di = new DriverInfo(); di.driver = driver; di.driverClass = driver.getClass(); di.driverClassName = di.driverClass.getName(); // Not Required -- drivers.addElement(di); writeDrivers.addElement(di); println("registerDriver: " + di); /* update the read copy of drivers vector */ readDrivers = (java.util.Vector) writeDrivers.clone(); }即可將com.mysql.jdbc.Driver添加到DriverManager的成員變量readDrivers中,以后獲取數(shù)據(jù)庫(kù)連接需要這個(gè)變量的幫助。
看上面的代碼發(fā)現(xiàn),還調(diào)用了initialize(),查看initialize()的源碼看到它調(diào)用loadInitialDrivers(),這個(gè)函數(shù)的主要作用是加載JDBC默認(rèn)驅(qū)動(dòng),registerDriver執(zhí)行完,控制臺(tái)的輸出語(yǔ)句為:
JdbcOdbcDriver class loaded registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@134e4fb] DriverManager.initialize: jdbc.drivers = null JDBC DriverManager initialized registerDriver: driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@157c2bd]可以看到先加載JdbcOdbcDriver,再加載我們加入的MySQL的driver。
獲取鏈接
加載驅(qū)動(dòng)完畢后,如何獲取連接,繼續(xù)看DriverManager的getConnection():// Worker method called by the public getConnection() methods. private static Connection getConnection( String url, java.util.Properties info, ClassLoader callerCL) throws SQLException { java.util.Vector drivers = null; /* * When callerCl is null, we should check the application's * (which is invoking this class indirectly) * classloader, so that the JDBC driver class outside rt.jar * can be loaded from here. */ synchronized(DriverManager.class) { // synchronize loading of the correct classloader. if(callerCL == null) { callerCL = Thread.currentThread().getContextClassLoader(); } } if(url == null) { throw new SQLException("The url cannot be null", "08001"); } println("DriverManager.getConnection(\"" + url + "\")"); if (!initialized) { initialize(); } synchronized (DriverManager.class){ // use the readcopy of drivers drivers = readDrivers; } // Walk through the loaded drivers attempting to make a connection. // Remember the first exception that gets raised so we can reraise it. SQLException reason = null; for (int i = 0; i < drivers.size(); i++) { DriverInfo di = (DriverInfo)drivers.elementAt(i); // If the caller does not have permission to load the driver then // skip it. if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) { println(" skipping: " + di); continue; } try { println(" trying " + di); Connection result = di.driver.connect(url, info); if (result != null) { // Success! println("getConnection returning " + di); return (result); } } catch (SQLException ex) { if (reason == null) { reason = ex; } } } // if we got here nobody could connect. if (reason != null) { println("getConnection failed: " + reason); throw reason; } println("getConnection: no suitable driver found for "+ url); throw new SQLException("No suitable driver found for "+ url, "08001"); }這個(gè)函數(shù)代碼比較多,但是我們關(guān)注的核心代碼就一句:
Connection result = di.driver.connect(url, info);
其中di就是我們前面加載驅(qū)動(dòng)后DriverManager的成員變量readDrivers包含的一個(gè)對(duì)象,也就是調(diào)用com.mysql.jdbc.driver的connect函數(shù),但是從上面該類代碼可知,它只包含一個(gè)構(gòu)造函數(shù)和靜態(tài)代碼段,connect函數(shù)從何而來(lái)?
別忘了com.mysql.jdbc.driver繼承自NonRegisteringDriver,這也是MySQL驅(qū)動(dòng)下的一個(gè)類,進(jìn)入該類,找到connect函數(shù):
package com.mysql.jdbc; /***省略引用和注釋***/ public class NonRegisteringDriver implements java.sql.Driver { /***省略其他函數(shù)和注釋***/ public java.sql.Connection connect(String url, Properties info) throws SQLException { Properties props = null; if ((props = parseURL(url, info)) == null) { return null; } try { Connection newConn = new com.mysql.jdbc.Connection(host(props), port(props), props, database(props), url, this); return newConn; } catch (SQLException sqlEx) { // Don't wrap SQLExceptions, throw // them un-changed. throw sqlEx; } catch (Exception ex) { throw new SQLException(Messages .getString("NonRegisteringDriver.17") //$NON-NLS-1$ + ex.toString() + Messages.getString("NonRegisteringDriver.18"), //$NON-NLS-1$ SQLError.SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE); } } }
因?yàn)镹onRegisteringDriver也是java.sql.Driver的實(shí)現(xiàn),返回的也是JDBC中Connection的實(shí)現(xiàn),所以如上面向接口編程,即可從DriverManager中得到MySQL的Connection。
總結(jié)
JDBC的分析介紹到此結(jié)束,如果有興趣大家可以看一下其他數(shù)據(jù)庫(kù)驅(qū)動(dòng)的源碼,因?yàn)槎际歉鶕?jù)JDBC而來(lái),所以大都大同小異。

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Après Java8-291, TLS1.1 est désactivé, de sorte que JDBC ne peut pas se connecter à SqlServer2008 à l'aide de SSL. Que dois-je faire?? Voici la solution pour modifier le fichier java.security 1. Recherchez le fichier java.security de jre. c'est jre, allez dans {JAVA_HOME}/jre/ Dans lib/security, par exemple ????C:\ProgramFiles\Java\jre1.8.0_301\lib\security S'il s'agit de la version portable sans installation verte d'Eclipse. , recherchez java.security dans le dossier d'installation, tel que ????xxx\plugins \org

1. Comment pouvez-vous gagner de l'argent en publiant des articles sur Toutiao aujourd'hui ? Comment gagner plus de revenus en publiant des articles sur Toutiao dès aujourd'hui ! 1. Activer les droits et intérêts fondamentaux : les articles originaux peuvent générer des bénéfices grace à la publicité, et les vidéos doivent être originales en mode écran horizontal pour générer des bénéfices. 2. Activez les droits de 100 fans : si le nombre de fans atteint 100 fans ou plus, vous pouvez tirer des bénéfices des micro-titres, de la création originale de questions-réponses et des questions-réponses. 3. Insistez sur les ?uvres originales : les ?uvres originales comprennent des articles, des micro-titres, des questions, etc., et doivent contenir plus de 300 mots. Veuillez noter que si des ?uvres illégalement plagiées sont publiées en tant qu'?uvres originales, des points de crédit seront déduits, et même les éventuels bénéfices seront déduits. 4. Verticalité : lorsque vous rédigez des articles dans des domaines professionnels, vous ne pouvez pas écrire à volonté des articles dans tous les domaines, vous n'obtiendrez pas de recommandations appropriées, vous ne pourrez pas atteindre le professionnalisme et le raffinement de votre travail et il sera difficile d'attirer des fans. et les lecteurs. 5. Activité : forte activité,

1. Conditions préalables à la programmation de bases de données Langages de programmation, tels que Java, C, C++, Python et autres bases de données, telles qu'Oracle, MySQL, SQLServer et d'autres packages de pilotes de base de données : Différentes bases de données fournissent différents packages de pilotes de base de données correspondant à différents langages de programmation. : MySQL fournit le package de pilotes Java mysql-connector-java, qui est requis pour faire fonctionner MySQL basé sur Java. De même, pour faire fonctionner la base de données Oracle basée sur Java, le package de pilotes de base de données Oracle ojdbc est requis. 2. Programmation de bases de données Java?: JDBCJDBC, JavaDatabaseConnectiv

Avec l'application répandue de Java, des erreurs JDBC se produisent souvent lorsque les programmes Java se connectent aux bases de données. JDBC (JavaDatabaseConnectivity) est une interface de programmation en Java utilisée pour se connecter à une base de données. Par conséquent, une erreur JDBC est une erreur rencontrée lorsqu'un programme Java interagit avec une base de données. Voici quelques-unes des erreurs JDBC les plus courantes et comment les résoudre et les éviter. ClassNotFoundException C'est le JDBC le plus courant

1. Expliquez que dans JDBC, la méthode executeBatch peut exécuter plusieurs instructions dml par lots et que l'efficacité est bien supérieure à l'exécution individuelle d'executeUpdate. Quel est le principe ? Comment implémenter l'exécution par lots dans MySQL et Oracle ? Cet article vous présentera le principe derrière cela. 2. Introduction à l'expérience Cette expérience sera réalisée en trois étapes?: a. Enregistrer la durée d'exécution par lots de jdbc et d'exécution unique dans MySQL. b. Enregistrer la durée d'exécution par lots de jdbc et d'exécution unique dans Oracle?; Enregistrez l'exécution par lots et l'exécution unique d'oracleplsql. Les versions Java et de base de données associées qui prennent du temps d'exécution sont les suivantes?: Java17, Mysql8, Oracle.

Ces dernières années, l'application du langage Java est devenue de plus en plus répandue et JDBCAPI est une méthode créative permettant aux applications Java d'interagir avec les bases de données. JDBC est basé sur un standard de connexion de base de données ouvert appelé ODBC, qui permet aux applications Java de se connecter à n'importe quel type de base de données. système de gestion de base de données (SGBD). Parmi eux, MySQL est un système de gestion de bases de données populaire. Cependant, les développeurs rencontreront également des problèmes courants lors de la connexion aux bases de données MySQL. Cet article vise à présenter la connexion JDBCAPI M.

Dans cet article, nous allons apprendre comment ajouter des articles en HTML5. L'un des nouveaux éléments de segmentation en HTML5 est la balise. Les articles sont représentés en HTML à l'aide de balises. Plus précisément, le contenu contenu au sein de l'élément est différent du reste du contenu du site (même s'ils peuvent être liés). Considérons l'exemple suivant pour comprendre comment ajouter un article en HTML5. Exemple 1 Dans l'exemple suivant, nous utilisons des styles en ligne dans l'élément article. <!DOCTYPEhtml><html><body><articlestyle="width:300px;border:2pxsolidgray;padding?:

Différences entre Hibernate et JDBC : Niveau d'abstraction : Hibernate fournit un mappage d'objets et une génération de requêtes de haut niveau, tandis que JDBC nécessite un codage manuel. Mappage objet-relationnel?: Hibernate mappe les objets Java et les tables de base de données, alors que JDBC ne fournit pas cette fonctionnalité. Génération de requêtes?: Hibernate utilise HQL pour simplifier la génération de requêtes, tandis que JDBC nécessite l'écriture de requêtes SQL complexes. Gestion des transactions : Hibernate gère automatiquement les transactions, tandis que JDBC nécessite une gestion manuelle.
