在开发项目时我们经常会需要与数据库进行交互,为了统一标准,在java jdk中提供了一组与数据库交互的api(java.sql.*),每个厂商通过继承实现sql包下的接口和类完成与数据库交互的工作。以mysql为例:
public static void main(String[] arg) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
PreparedStatement prepareStatement=connection.prepareStatement("select * from student");
ResultSet resultSet=prepareStatement.executeQuery();
while(resultSet.next()){
System.out.println(resultSet.getString("id")+":"+resultSet.getString("studname"));
}
connection.close();
}
主要涉及到的类有:
- connection:接口类,mysql封装了连接数据库的参数,辅助类,提供了sql语句执行,创建statement对象,提交,回滚等功能。
- preparedStatement:接口类,保存sql执行语句,并提供查询,修改等方法。
- Driver:驱动类,子类提供了返回connection对象方法的实现,以及一些辅助方法
- DriverManager:驱动管理类,注册Driver对象
下面我们来一步步解析查询数据库的过程
1.驱动类加载
Class.forName("com.mysql.jdbc.Driver")
当我们看到这行代码时我们可能会有些疑惑:为什么开始要加载初始化这个驱动?那我们先看看它里面有什么。
//Driver 类
static {
try {
java.sql.DriverManager.registerDriver(new Driver()); //注册驱动
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
//DriverManager 类
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da)); //封装注册类并村主导
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
看到这里我们知道初始化类是为了调用DriverManager.regi