一、数据库连接步骤:
1.利用反射机制,将数据库驱动加载入虚拟机。
2.建立Connection连接。
3.通过Connection类的引用conn 获取连接方式Statment 的引用 stmt ,然后便可以通过stmt进行对数据库的操作。
下面为JDBC连接的详细过程:
private static final String driver = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/imooc2";
private static final String USER = "**";
private static final String PASSWORD = "**";
准备数据库连接资源。
private static Connection conn;
static{
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
获取数据库连接。
PreparedStatement stmt = null;
stmt = conn.prepareStatement(sql);
最后是拿到数据库的连接方式的引用,及进行查询。
知识理解:
*Class.forName()方法的使用理解:
前言:当我们运行一个程序时,并非整个程序都被加载进入内存,java程序的运行也是如此,当我们运行一个Java程序时,JVM不会无缘无故加载一个类进入方法区,只有当你请求时,它才会将你请求的类加载进入方法区。现在,我所知道的请求虚拟机加载的方法有两种:1.通过new来请求加载 2.通过反射机制加载。
然后:为什么要通过反射机制加载JDBC驱动?
如上:getConnection()本来就是静态方法,结合我以前学过的静态方法可以直接通过类名加方法名的方式进行调用,我尝试了一下不通过反射加载驱动,直接通过DriverManager.getConection()方法调用也是是可以的。但是,却并不能这样理解,因为驱动的引入是靠DriverManager的静态方法块引入的,他是在getConnection()方法执行前被执行的,getConnection()方法可用,是因为它已经被执行了。那么没有利用反射机制引入驱动的情况下,驱动是如何被引入的呢?
参考如下:https://blog.csdn.net/weixin_37139197/article/details/78848637
原来是JDBC4.0之后,DriverManager会在我们classpath中jar(数据库驱动包)中查找,使用META-INF\services\java.sql.Driver文本中的类名称去注册。
那么,它是如何找到我们需要的数据库驱动呢?或者说,如果一个项目下我们有不同的数据库驱动,它是如何找到正确的数据库驱动的呢?
package com.mysql.jdbc;
import java.sql.SQLException;
/**
* The Java SQL framework allows for multiple database drivers. Each driver should supply a class that implements the Driver interface
*
* <p>
* The DriverManager will try to load as many drivers as it can find and then for any given connection request, it will ask each driver in turn to try to
* connect to the target URL.
大概意思:DriverManager尽它所能去加载足够多的驱动,然后拿获取到的连接资源,用驱动依次测试连接资源,直到能够正常使用。
*
* <p>
* It is strongly recommended that each Driver class should be small and standalone so that the Driver class can be loaded and queried without bringing in vast
* quantities of supporting code.
*
* <p>
* When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a
* driver by doing Class.forName("foo.bah.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!");
}
}
/**
* 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()
}
}
结合以上:在没有利用反射机制引入数据库驱动时,JDBC4.0之后,DriverManager会在我们classpath中jar(数据库驱动包)中查找,使用META-INF\services\java.sql.Driver文本中的类名称去注册。然后用它们来测试数据库连接资源,直到能够正常连接,否则就会报错。在此情况下,当我们删除数据库驱动包中的文本时,由于DriverManager无法自动加载到SqlServler驱动,就所以就会报错,如下。但是,如果在这种情况下,直接通过反射机制引入应该是可以的,我尝试了一下,果真是可以的。
总结一下就是在JDBC4.0之后,不用反射机制直接调用DriverManager的getConnection()方法也是可以的,当项目只有一个数据库驱动时,理论上跟反射机制没有太多区别。但是在有多个数据库驱动时,DriverManager可能要加载多个驱动,尝试多次连接,这就会带来效率的问题。而反射机制,通过直接准确的将需要的数据库驱动引入,可以极大的提高效率。
关于通过 直接new的方式引入Driver驱动程序,这样做会增加程序的耦合度,当程序需要换数据库时,不利于修改。其实,数据库的的动态加载只是反射机制的一个小的使用方面,它主要的使用方面是依赖注入,用于解耦。
二、数据库连接的三种方式
1.createStatement():
2.preparedStatement();
3.callableStatement();
也不是很简单,等以后熟悉下存储体,再总结吧!