为什么80%的码农都做不了架构师?>>>   

新手上路,请多多包涵,文章的不足欢迎吐槽。本文章以mysql为例

相信很多人都会使用jdbc创建数据连接。

    static String driverName = "com.mysql.jdbc.Driver";static String url = "jdbc:mysql://127.0.0.1:3306/mysql";static String username = "root";static String password = "";@Testpublic void getConnection1() {try {// 1、加载驱动Class.forName(driverName);// 2、获取connectionConnection conn = DriverManager.getConnection(url,username,password);System.out.println(conn);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}

代码可以说是非常简单,但是仔细想一下,发现会有2两疑问:

  1. Class.forName(driverName)这样加载去驱动,又没有创建进行赋值给某个变量,DriverManager是如何使用该驱动来创建连接的?

  2. 如果换成别的数据库,只需要把Mysql的驱动换成别的数据库驱动就可以了,其它的代码不用改,这是怎么做到的?

下面进行解答?

疑问1:

Class.forName(className)这个方法是会执行className这个类的静态代码块的。在我们执行Class.forName("com.mysql.jdbc.Driver")的时候,com.mysql.jdbc.Driver这个类的静态代码块会被执行,然后向DriverManager注册驱动

下面是com.mysql.jdbc.Driver的源码


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!");}}其它省略
}

疑问2:

这个很简单,定义驱动的接口就可以了,然后交由DriverManager驱动管理器进行管理。jdbc只是定义了java数据库连接的标准,具体的实现是各个数据库厂商实现的。

java.sql.Driver源码


public interface Driver {// 要把 username、password等信息put到Properties里面Connection connect(String url, java.util.Properties info)throws SQLException;boolean acceptsURL(String url) throws SQLException;DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)throws SQLException;int getMajorVersion();int getMinorVersion();boolean jdbcCompliant();//------------------------- JDBC 4.1 -----------------------------------public Logger getParentLogger() throws SQLFeatureNotSupportedException;
}

在调用DriverManager.getConnection()的时候,DriverManager其实是使用厂商提供的驱动包内java.sql.Driver的实现类来获取connection的,如果mysql就是使用com.mysql.jdbc.Driver内connect()方法进行连接数据库获取connection。

如果我们不是用DriverManager,那应该怎样获取connection呢??

很简单直接调用java.sql.Driver实现类的connect()方法就可以了。

@Testpublic void getConnnection2() {try {// 通过反射创建驱动对象Driver driver = (Driver) Class.forName(driverName).newInstance();// 你也可以这样写,但是这样耦合太大了
//            com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();// 包装连接信息Properties info = new Properties();info.put("user", username);info.put("password", password);// 获取连接Connection conn = driver.connect(url, info);System.out.println(conn);} catch (Exception e) {e.printStackTrace();}}

转载于:https://my.oschina.net/hgp/blog/1358511

jdbc详解:1、创建数据库connection连接相关推荐

  1. Oracle分区详解和创建,数据库优化-Oracle表分区的创建和分类

    Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降, ...

  2. 数据库:JDBC详解

    1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Jav ...

  3. JAVA JDBC详解

    一.相关概念 什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...

  4. 详解Ubuntu10.10下Qt连接Mysql数据库

    转载自:http://mobile.51cto.com/symbian-273262.htm 详解Ubuntu10.10下Qt连接Mysql数据库是本文要介绍的内容,很详细的步骤,我们先来看内容. 第 ...

  5. 详解:MySQL数据库的权限管理和运维实操

    详解:MySQL数据库的权限管理 一.MYSQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你权利以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行updat ...

  6. JDBC详解(四):操作BLOB类型字段(超详解)

    JDBC详解(四):操作BLOB类型字段 前言 一.MySQL BLOB类型 二.向数据表中插入大数据类型 三.修改数据表中的Blob类型字段 四.从数据表中读取大数据类型 前言 本博主将用CSDN记 ...

  7. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  8. 详解 Visual C# 数据库编程

    详解 Visual C# 数据库编程 ****** 2007-11-05 14:34 关于数据库编程,微软提供了一个统一的数据对象访问模型,在Visual Studio6.0中称为ADO,在.NET中 ...

  9. Java中JDBC详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 点击跳转浏览. JDBC是什么 概念:Java DataBase Connectivity JDBC本 ...

最新文章

  1. linux 切换python版本_Linux下python默认版本切换成替代版本(示例代码)
  2. pgjdbc源码分析
  3. 细聊分布式ID生成方法
  4. Git分支命令学习使用
  5. C#/SQL 上周本周
  6. 深入理解ARM体系架构(S3C6410)---arm7,arm9,arm11区别
  7. Linux文件权限管理 chmod 读、写、可执行
  8. 深入Scripting Runtime Library
  9. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
  10. ubuntu开机启动+图标配置
  11. 王燕《应用时间序列分析》学习笔记1
  12. 计算机社团自评报告怎么写,社团自我评价
  13. git commit 规范不对导致报错subject may not be empty [subject-empty]type may not be empty [type-empty]
  14. 九秒倒计时c语言编程,可变信息倒九秒半程倒计时器的制作方法
  15. python操作gif 图片拆分
  16. java 过滤bom头_去除bom头.java
  17. UnityShader学习教程之<矩阵的左乘还是右乘所导致的效果问题>
  18. Qt5:error: no matching function for call to 'MainWindow::connect()
  19. 质数与合数系列——素数判断
  20. 一文了解各大数据库查询语言(Gremlin vs Cypher vs nGQL操作篇

热门文章

  1. Kafka入门经典教程【转】
  2. 关于apache虚拟主机htttpd的配置实例 (更新中)
  3. 浏览器还 data URI协议
  4. php dns更新,php_mzdns: 站群,大量域名 通过 dns 服务商 api 批量添加 ip 工具。你懂的~ 基于 mzphp2 框架。...
  5. oracle语句优化pl sql语句,求oracle插入初始数据pl/sql语句优化,该怎么处理(2)
  6. 地图数据快速渲染------基于传统GIS平台多服务器切片
  7. Nginx的server_name匹配执行顺序
  8. MyBatis 插件原理与自定义插件-PageHelper 原理
  9. TransactionProducer(事务消息)
  10. 引入了一个IO多路复用模型