JDBC技术(MySQL)之建立数据库连接

一、加载驱动程序

在编程实现数据库连接时,JVM必须先加载特定厂商提供的数据库驱动程序。使用Class.forName()方 法实现驱动程序加载过程

不同驱动程序的装载方法如下:

//JDBC-ODBC桥接,Java自带
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
//数据库厂商提供
Class.forName("特定的JDBC驱动程序类名");

例如加载MySQL驱动程序代码如下:

Class.forName("com.mysql.jdbc.Driver");

问题:在运行时有时会抛出这个东西

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

解决方法:

Class.forName("com.mysql.cj.jdbc.Driver");

如果直接这样运行程序会抛出如下的ClassNotFoundException异常。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

原因是程序无法找到MySQL驱动程序com.mysql.jdbc.Driver类。MySQL驱动程序是在MySQL的Connector.J X文件中的mysql-connector-java-xxx.jar文件中,也就是说需要导入这个jar包。

导入这个jar包具体操作见链接https://blog.csdn.net/weixin_45366499/article/details/104579591

这里有一个测试代码:

public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }
    }
}

二、建立数据连接

驱动程序加载成功就可以进行数据库连接了。建立数据库连接可以通过调用DriverManager类的 **getConnection()**方法实现。

  • static Connection getConnection(String url):尝试通过一个URL建立数据库连接,调用此方法时,DriverManager会试图从已注册的驱动中选择恰当的驱动来建立连接。
  • static Connection getConnection(String url,Properties info):尝试通过一个URL建立数据库连接,一些连接参数(如user和password)可以按照键值对的形式放置到info中,Properties是Hashtable的子类,它是一种Map结构。
  • static Connection getConnection(String url, String user, String password):尝试通过一个URL建立数据库连接,指定数据库用户名和密码。

上面的几个getConnection()方法都会抛出受检查的SQLException异常,注意处理这些异常。

JDBC的URL类似于其他场合的URL,它的语法如下:

jdbc:<subprotocol>:<subname>

这里有三个部分,它们用冒号隔离。

  • 协议:jdbc表示协议,它是唯一的,JDBC只有这一种协议。
  • 子协议:主要用于识别数据库驱动程序,也就是说,不同的数据库驱动程序的子协议不同。
  • 子名:它属于专门的驱动程序,不同的专有驱动程序可以采用不同的实现。

对于不同的数据库,厂商提供的驱动程序和连接的URL都不同,如图总结:
在这里插入图片描述
以MySQL为例,他的URL为
url = "jdbc:mysql://localhost:3306/数据库名"

建立数据连接示例代码如下(第一种写法):

mport java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author : 蔡政洁
 * @email :[email protected]
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }

        String url = "jdbc:mysql://localhost:3306/JAVA";
        String user = "root";
        String password = "199911";
        
        try (Connection conn = DriverManager.getConnection(url,user,password){
            System.out.println("数据库连接成功"+conn);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Connection对象代表的数据连接不能被JVM的垃圾收集器回收,在使用完连接后必须关闭 (调用close()方法),否则连接会保持一段比较长的时间,直到超时。这里是通过自动资源管理技术释放资源的。
 
上面代码虽然可以成功建立连接,但是有时控制台会有警告,这是由于现在的网络通信为了提高网络完全,都要求使用SSL (Secure Sockets Layer 安全套接层) 安全 协议。但是由于各种原因,很多服务器并未使用SSL安全协议,特别是对于学习和测试阶段可以不使 用SSL安全协议。为此,需要修改url连接字符串:

"jdbc:mysql://localhost:3306/MyDB?verifyServerCertificate=false&useSSL=false"

verifyServerCertificate设置为false表示不进行安全认证,useSSL设置为false表示不使用SSL进行网 络通信。

有的url字符串会很长维护起来不方便,可以把这些参数对放置到Properties对象中,示例代码如 下(第二种写法):

mport java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author : 蔡政洁
 * @email :[email protected]
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }

        String url = "jdbc:mysql://localhost:3306/JAVA";
        
//        第二种写法
//        创建Properties对象
        Properties info = new Properties();
        info.setProperty("user","root");
        info.setProperty("password","199911");
        info.setProperty("verifyServerCertificate","false");
        info.setProperty("useSSL","false");

        try (Connection conn = DriverManager.getConnection(url,info)){
            System.out.println("数据库连接成功"+conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

上述代码代码通过创建Properties对象,调用setProperty()方法,法键和值都是 字符串类型。解决了数据连接的url字符串有很多参数对的问题,和有的url字符串会很长维护起来不方便的问题。
但是上述代码还是有不足的地方,就是这些参数都是“硬编码 ”。在程序代码中的,程序编译之后不能修改。但是数据库用户名、密码、服务器主机名、端口等等这一切,在开发阶段和部署阶段可能完全不同,这些参数信息应该可以配置的,可以放到一个属性文件中,借助于输入流,可以在运行时读 取属性文件内容到Properties对象中。

如何创建配置文件:config.properties:
在src文件夹下创建文件。
在这里插入图片描述
在config.properties文件中写下内容如下:

user=root
password=199911
useSSL=false
verifyServerCertificate=false

示例代码如下(第三种写法):

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author : 蔡政洁
 * @email :[email protected]
 * @date : 2020/2/29
 * @time : 4:21 下午
 */
public class HelloWorld {
    public static void main(String[] args) {
//        加载驱动程序
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动程序加载失败");
            return;
        }

        String url = "jdbc:mysql://localhost:3306/JAVA";

//        第三种写法
        Properties info = new Properties();
        try {
//            获得config.properties配置文件的输入流对象,需要自己创建在src文件里
            InputStream inputStream = HelloWorld.class.getClassLoader().getResourceAsStream("config.properties");
//            从流中加载信息到properties对象中
            info.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        try (Connection conn = DriverManager.getConnection(url,info)){
            System.out.println("数据库连接成功"+conn);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

注意:属性 文件一般放到src目录与源代码文件放置在一起,但是编译时,这些文件会复制到字节码文件所在的目录中,这种目录称为资源目录,获得资源目录要通过Java反射机制,
格式如下:

类名.class.getClassLoader().getResourceAsStream("config.properties")

语句能够获得运 行时config.properties的文件输入流对象。

在开发和部署阶段使用文本编辑器修改该文件,不需要修改程序代码。

以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

发布了93 篇原创文章 · 获赞 10 · 访问量 5204

猜你喜欢

转载自blog.csdn.net/weixin_45366499/article/details/104617637