Java 之 JDBC:(二)获取数据库连接

一、数据库连接要素一:Driver接口实现类

  1、Driver 接口介绍

    java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。

    在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理类(java.sql.DriverManager)去调用这些 Driver 实现。

    ① Oracle 的驱动:oracle.jdbc.driver.OracleDriver

    ② MySQL 的驱动:com.mysql.jdbc.Driver

    

      

     可以将上述 jar 包拷贝到 Java 工程的一个目录中,一般都会创建一个 lib 文件夹。

    

     在驱动 jar 包上右键 --> Build Path --> Add to Build Path

    

     注意:如果是 Dynamic Web Project(动态的 web 项目)话,则是把驱动 jar 放到 WebContent(有的开发工具叫 WebRoot)目录中的 WEB-INF 目录中的 lib 目录下即可。

      

  2、加载与注册 JDBC 驱动

    加载驱动:加载 JDBC 驱动需调用 Class  类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名。

Class.forName(“com.mysql.jdbc.Driver”);

  

    注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序

      (1)使用 DriverManager.registerDriver() 来注册驱动

      (2)通常不用显示调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。

        下图是 MySQL 的 Driver 实现类的源码:

        

二、数据库连接要素二:URL

  JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。

  JDBC URL 的标准由三部分组成,各个部分间冒号分隔。

jdbc:子协议:子名称

协议:JDBC URL 中的协议总是 jdbc

子协议:子协议用于标识一个数据库驱动程序

子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的 IP地址),端口号,数据库名

  例如:

    

   几种常用的数据库的 JDBC URL

    (1)MySQL 的连接 URL 编写方式

jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值

jdbc:mysql://localhost:3306/test

jdbc:mysql://localhost:3306/test?seUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)

jdbc:mysql://localhost:3306/test?user=root&password=123456

  

    (2)Oracle9i 的连接 URL 编写方式

jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称

jdbc:oracle:thin:@localhost:1521:test

  

    (3)SQLServer 的连接 URL 编写方式

jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称

jdbc:sqlserver://localhost:1433:DatabaseName=test

  

三、数据库连接要素三:用户名和密码

  user, password 可以用 "属性名=属性值" 方式告诉数据库;

  可以调用 DriverManager 类的 getConnecion() 方法建立到数据库的连接

四、数据库连接方式

  1、连接方式一

 1     @Test
 2     public void testConnection1() {
 3         try {
 4             //1.提供java.sql.Driver接口实现类的对象
 5             Driver driver = null;
 6             driver = new com.mysql.jdbc.Driver();
 7 
 8             //2.提供url,指明具体操作的数据
 9             String url = "jdbc:mysql://localhost:3306/test";
10 
11             //3.提供Properties的对象,指明用户名和密码
12             Properties info = new Properties();
13             info.setProperty("user", "root");
14             info.setProperty("password", "root");
15 
16             //4.调用driver的connect(),获取连接
17             Connection conn = driver.connect(url, info);
18             System.out.println(conn);
19         } catch (SQLException e) {
20             e.printStackTrace();
21         }
22     }

    说明:上述代码中显示出现了第三方数据库的 API;

  2、连接方式二

 1     @Test
 2     public void testConnection2() {
 3         try {
 4             //1.实例化Driver
 5             String className = "com.mysql.jdbc.Driver";
 6             Class clazz = Class.forName(className);
 7             Driver driver = (Driver) clazz.newInstance();
 8 
 9             //2.提供url,指明具体操作的数据
10             String url = "jdbc:mysql://localhost:3306/test";
11 
12             //3.提供Properties的对象,指明用户名和密码
13             Properties info = new Properties();
14             info.setProperty("user", "root");
15             info.setProperty("password", "abc123");
16 
17             //4.调用driver的connect(),获取连接
18             Connection conn = driver.connect(url, info);
19             System.out.println(conn);
20 
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24     }

    说明:相较于方式一,这里使用反射实例化 Driver,不在代码中体现第三方数据库的 API。体现了面向接口编程思想,同时使得程序更好的可移植性。

  3、连接方式三

 1     @Test
 2     public void testConnection3() {
 3         try {
 4             //1.数据库连接的4个基本要素:
 5             String url = "jdbc:mysql://localhost:3306/test";
 6             String user = "root";
 7             String password = "abc123";
 8             String driverName = "com.mysql.jdbc.Driver";
 9 
10             //2.实例化Driver
11             Class clazz = Class.forName(driverName);
12             Driver driver = (Driver) clazz.newInstance();
13             //3.注册驱动
14             DriverManager.registerDriver(driver);
15             //4.获取连接
16             Connection conn = DriverManager.getConnection(url, user, password);
17             System.out.println(conn);
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21 
22     }

  4、连接方式四

 1     @Test
 2     public void testConnection4() {
 3         try {
 4             //1.数据库连接的4个基本要素:
 5             String url = "jdbc:mysql://localhost:3306/test";
 6             String user = "root";
 7             String password = "abc123";
 8             String driverName = "com.mysql.jdbc.Driver";
 9 
10             //2.加载驱动 (①实例化Driver ②注册驱动)
11             Class.forName(driverName);
12 
13 
14             //Driver driver = (Driver) clazz.newInstance();
15             //3.注册驱动
16             //DriverManager.registerDriver(driver);
17             /*
18             可以注释掉上述代码的原因,是因为在mysql的Driver类中声明有:
19             static {
20                 try {
21                     DriverManager.registerDriver(new Driver());
22                 } catch (SQLException var1) {
23                     throw new RuntimeException("Can't register driver!");
24                 }
25             }
26 
27              */
28 
29 
30             //3.获取连接
31             Connection conn = DriverManager.getConnection(url, user, password);
32             System.out.println(conn);
33         } catch (Exception e) {
34             e.printStackTrace();
35         }
36 
37     }

    说明:不必显示的注册驱动了。因为在 Driver 的源码中已经存在静态代码块,实现了驱动的注册。

  5、连接方式五

 1     @Test
 2     public  void testConnection5() throws Exception {
 3         //1.加载配置文件
 4         InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
 5         Properties pros = new Properties();
 6         pros.load(is);
 7         
 8         //2.读取配置信息
 9         String user = pros.getProperty("user");
10         String password = pros.getProperty("password");
11         String url = pros.getProperty("url");
12         String driverClass = pros.getProperty("driverClass");
13 
14         //3.加载驱动
15         Class.forName(driverClass);
16 
17         //4.获取连接
18         Connection conn = DriverManager.getConnection(url,user,password);
19         System.out.println(conn);
20 
21     }

    其中,配置文件声明在工程的 src 目录下:【jdbc.properties】

user=root
password=abc123
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver

      说明:使用配置文件的方式保存配置信息,在代码中加载配置文件。

    使用配置文件好处:

    ① 实现了代码和数据的分离,实现了解耦,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码;

    ② 如果修改了配置信息,省去重新编译的过程;

    

原文地址:https://www.cnblogs.com/niujifei/p/14994374.html