JDBC
学习(一)
加载驱动
首先加载驱动,这是一切的开始。但是注意的是,JAVA
只提供Driver
的接口,并没有去实现,也就是说,各个数据库的厂商需要自己去实现这个接口。因此还需数据库的jar
包,我使用的是MySQL
。
Class.forName("com.mysql.cj.jdbc.Driver");
通过Class.forName()
来加载和初始化类。为什么不使用new
呢,首先JDBC
约定通过 Class.forName
加载驱动程序类,其次new
可能违反单例设计模式,绕过 DriverManager
的管理,总之就是这么规定的。
但是,从 JDBC 4.0
开始,如果驱动程序在其jar
包的 META-INF/services/java.sql.Driver
文件中注册了自己,DriverManager
将自动加载这些驱动程序,这减少了显式调用 Class.forName()
的需要。我使用mysql8
已经有了,这行代码可写可不写,建议写,鬼知道会不会出现bug。
当加载Driver
会触发static
代码块。使用DriverManager
的registerDriver
相当于注册这个Driver
,加载驱动。
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
我们可以进入registerDriver
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);
}
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
这是个关键。
而registeredDrivers
在开头已经声明
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
很明显一定是个容器,将driver
添加进去,完成注册。
建立连接
String myUrl = "jdbc:mysql://localhost:3306/myDatabase";
String username = "myUsername";
String passwd = "myPassword";
Connection conn = DriverManager.getConnection(myUrl, username, passwd);
这个DriverManager
它是一个工厂类,负责管理JDBC驱动程序,并提供方法来获取数据库连接。上面的注册registerDriver
也是他的。
这个getConnection
就干一件事,循环上面那个容器里面的driver
,(因为可能有多个driver
被加载进去)找到可以连接的进行连接。
for(DriverInfo aDriver : registeredDrivers) {
//todo
}
执行语句
String sql = "INSERT INTO myTable (column1, column2) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "value1");
pstmt.setInt(2, 123);
//int rowsAffected = pstmt.executeUpdate();
//ResultSet res = pstmt.executeQuery();
executeUpdate
执行INSERT、UPDATE、DELETE等修改数据的SQL语句,返回一个整数,表示受影响的行数(即被插入、更新或删除的行数)。
executeQuery
执行SELECT语句,返回一个 ResultSet
对象,它包含了查询结果集,通过 ResultSet
对象遍历和读取返回的数据。
String sql = "SELECT * FROM Employees WHERE department = 'Sales'";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
// 访问ResultSet中的数据
int id = rs.getInt("id");
String name = rs.getString("name");
// ...
}
小结
综上,四个对象很重要
DriverManager
、Connection
、PreparedStatement
、ResultSet
他们之间环环相扣。