什么是JDBC技术?Java中经常说的数据库驱动又是什么?
专业的说法:
JDBC(Java Data BaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API 编写数据库应用程序。
通俗的说:
JDBC(JavaData Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成的。
说白了,所谓的JDBC技术其实就是Java中定义的一系列用于访问数据库的接口(也就是所谓的规范)。然后各大数据库厂家均按照这个接口规范去开发能访问他们自己数据库的类库。当然,既然按照规范去开发,那么他们就需要去实现这些接口。
以下是JDBC中最为重要的几个接口,这些接口都在java.sql和javax.sql包下:
接口/类
所属jar包
作用
DriverManger 类
java.sql
用于管理数据库驱动的实例
Connection 接口
java.sql
用于和数据库建立用于通讯的连接
Statement 接口
java.sql
用于执行sql语句
PreparedStatement 接口
java.sql
用于执行参数化的sql语句
ResultSet 接口
java.sql
用于存储select查询语句所返回的结果集合
DataSource接口
javax.sql
接口的详细信息请查看Java文档(Java 1.6中文文档下载)
数据库驱动:
各大数据库厂商根据jdbc技术规范开发的能够访问他们的数据库的类库(jar包)就称之为数据库驱动。
学习JDBC应该学习些什么?怎样学习?
其实学习JDBC技术就是学习这一系列的接口、以及这些接口的实现类(即各大厂商的数据库驱动),学会如何使用数据库驱动去访问数据库。访问架构如下图 :
废话少说,直接上例子,以mysql数据库为例:
1、导入驱动jar包。
2、注册驱动,
3、获取连接Connection,
4、通过Connection对象获取可以操作sql语句的Statement对象,
5、使用statement对象执行sql语句得到ResultSet结果集,
6、对结果集ResultSet进行遍历,得到信息,
7、释放资源。
package cn.demo.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mysql.jdbc.Driver; public class JdbcDemo1 { public static void main(String[] args) throws SQLException { // 1.注册驱动到驱动管理类中 DriverManager.registerDriver(new Driver()); // 2.通过DriverManager获取连接对象,需要数据库连接URL、用户名、登陆密码 String url = "jdbc:mysql://localhost:3306/day17"; String username = "root"; String password = "abc"; Connection con = DriverManager.getConnection(url, username, password); // 3.通过Connection对象获取一个可以操作sql的Statement对象 Statement st = con.createStatement(); //4.执行sql语句. String sql="select * from user"; ResultSet rs=st.executeQuery(sql); //5.对ResultSet进行遍历,得到信息. while(rs.next()){ int id=rs.getInt("id"); String name=rs.getString("name"); String sex=rs.getString("sex"); System.out.println("ID:"+id+" NAME:"+name+" SEX:"+sex); } //6.关闭资源 rs.close(); st.close(); con.close(); } }
注意:
1、在开发中,一般都是使用多态性,来构建访问数据库所需对象对象。
2、URL格式根据数据库的不同有所不同,格式为:
主协议 子协议 主机名 端口 数据库名
jdbc : mysql : //localhost : 3306 / mydb
以上只是展示如何使用jdbc访问数据库,但是其实是有问题的。问题有以下两个。
问题1:数据库驱动多次注册问题。
com.mysql.jdbc.Driver类的源码如下:
package com.mysql.jdbc;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
}
}
该类中的静态构造代码块其实已经将一个Driver类的实例注册到了DriverManager中。所以我们手动将创建一个实例注册到了DriverManager中,就相当于注册了两个实例,这会浪费资源。所以上面中注册代码:
DriverManager.registerDriver(newDriver());
改为使用反射,将类加载即可(因为加载类时会执行静态代码块)
Class.forName("com.mysql.jdbc.Driver");
问题2: sql注入攻击漏洞问题。
使用statement对象去执行拼接的sql语句,会存在sql注入攻击漏洞。实际开发中,一般不会使用这种方式。解决sql注入攻击漏洞的办法详见下一篇文章《JDBC技术详解(二)-- sql注入攻击问题 》
本文为原创,如需转载,请注明出处!