一、加载驱动程序
在编程实现数据库连接时,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 :caizhengjie888@icloud.com * @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 :caizhengjie888@icloud.com * @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 :caizhengjie888@icloud.com * @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的文件输入流对象。
在开发和部署阶段使用文本编辑器修改该文件,不需要修改程序代码。