国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table des matières
JDBC
使用
核心API
操作流程
源碼分析
控制臺(tái)輸出
加載驅(qū)動(dòng)
獲取鏈接
總結(jié)

再說JDBC

Jun 07, 2016 pm 03:59 PM
jdbc une fois article

上篇文章《再說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&#39;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&#39;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&#39;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),所以大都大同小異。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1502
276
Après Java8 (291), TLS1.1 est désactivé et JDBC ne peut pas se connecter à SqlServer2008 via SSL. Comment résoudre le problème ? Après Java8 (291), TLS1.1 est désactivé et JDBC ne peut pas se connecter à SqlServer2008 via SSL. Comment résoudre le problème ? May 16, 2023 pm 11:55 PM

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

Comment puis-je 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 ! Comment puis-je 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 ! Mar 15, 2024 pm 04:13 PM

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é,

Comment analyser la programmation JDBC dans MySQL Comment analyser la programmation JDBC dans MySQL May 30, 2023 pm 10:19 PM

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

Erreurs Java?: erreurs JDBC, comment les résoudre et les éviter Erreurs Java?: erreurs JDBC, comment les résoudre et les éviter Jun 24, 2023 pm 02:40 PM

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

Comment implémenter l'insertion par lots JDBC en Java Comment implémenter l'insertion par lots JDBC en Java May 18, 2023 am 10:02 AM

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.

Problèmes courants rencontrés en Java lors de l'utilisation de l'API JDBC pour se connecter à la base de données MySQL Problèmes courants rencontrés en Java lors de l'utilisation de l'API JDBC pour se connecter à la base de données MySQL Jun 10, 2023 am 09:55 AM

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.

Comment ajouter un article en HTML5 ? Comment ajouter un article en HTML5 ? Sep 12, 2023 am 11:37 AM

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?:

Quelle est la différence entre le framework Hibernate et JDBC ? Quelle est la différence entre le framework Hibernate et JDBC ? Apr 17, 2024 am 10:33 AM

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.

See all articles