上一节说到Java的驱动是由各个数据库实现并提供,通常我们连接一个数据,需要有一个入口,这个入口就是java.sql.Driver实现,这也是狭义上的驱动。
首先我们写个最简单的JDBC调用程序访问数据库
JDBC访问数据库DEMO
public static void main(String[] args) throws Exception {
// 1、加载驱动类
Class.forName("com.mysql.jdbc.Driver");
// 定义url、用户名和密码
String url = "jdbc:mysql://localhost:3306/test?socketTimeout=30000";
String user = "root";
String password = "123456";
// 2、创建连接
Connection connection = DriverManager.getConnection(url, user, password);
// 3、创建执行声明
PreparedStatement statement = connection.prepareStatement("select * from test");
// 简单执行,不返回结果
statement.execute("select 1");
// 4、返回结果
ResultSet resultSet = statement.executeQuery();
// 5、遍历结果
while (resultSet.next()) {
// 获取当前行的第一列数据
Object dataAtColumn1 = resultSet.getString(1);
// 也可以直接用列名获取当前行的名叫testName的列的数据
Object dataAtColumnName = resultSet.getString("<testName>");
}
resultSet.close();
statement.close();
connection.close();
}
1、注册驱动类(驱动器)
也就是Driver的数据库实现,比如mysql的Driver实现叫com.mysql.jdbc.Driver,Oracle的叫oracle.jdbc.driver.OracleDriver;通过Class.forName加载驱动到JVM的安全上下文中(实际上是驱动主动调用DriverManager.registerDriver),这样驱动管理器就可以根据url里的协议匹配要用的驱动了;
比如url是jdbc:mysql://localhost,就会遍历所以加载到的驱动,去匹配这个url,如果匹配到就使用这个驱动。
2、创建连接
注册驱动类后,驱动管理器会自动根据url来匹配驱动类,创建连接,获得连接后,表示建立和数据库的通信,可以向数据库发送命令了;
3、创建查询实体
连接建立后如果直接发送命令,会有很多功能实现上的不便,需要从连接创建一个statement,可以理解为一次查询的抽象,这里简单的认为是SQL语句的对象化,至于为什么要这样可以参考我之前写的一篇文章为什么要有Statement?
一个比较常见的Statement实现是PreparedStatement,比如一个SQL(select * from people where job = @job and age > @age;)有两个参数job和age,需要设置,此时就需要PreparedStatement。
例如,我们利用teacher和20两个参数去查询:
带参数SQL的执行
String sql = "select * from people where job = ? and age > ?";
Connection connection;
// 创建PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 根据参数位置设置参数
preparedStatement.setString(1, "teacher");
preparedStatement.setInt(2, 20);
// 此时SQL是什么样子的?
// 执行
ResultSet resultSet = preparedStatement.executeQuery();
通常带参数的SQL可以通过PreparedStatement这种方式防注入。
4、执行查询返回结果
执行statement查询得到结果集ResultSet,这里只说最常见的使用,还有批量执行、无结果执行、更新等操作;
5、遍历结果
ResultSet就是你认为的那个东西了,结果集,结果集并不是一次性从数据库拿回所有结果,而是相当于描述结果信息和结果存放区域的对象。
这里的信息可以分为两类:
元数据,ResultMetaData,它包括查询结果列数、列名、列的数据类型
数据行,数据行通过提供一个迭代器(也可以形象的称为游标)去遍历,游标移动到哪一行就可以获取哪一行的数据。