JDBC是什么?
JDBC是java数据库连接(Java Database Connectivity),它是用于java编程语言和数据库之间的数据库无关连接的标准Java API,就是说,JDBC是用于在Java语言编程中与数据库连接的API。
与其他数据库编程环境相比,JDBC为数据库开发提供了标准的API,所以使用JDBC开发的数据库应用可以跨平台,跨数据库(全部使用标准SQL)运行。
所以,java的开发人员可以面向一组API访问不同的数据库,而API的实现交给各数据库厂商去实现,我们只需要更换不同的实现类,就可以达到更换数据库的目的。
JDBC的架构
JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:
- JDBC API:提供应用程序到JDBC管理器连接。
- JDBC驱动程序API:支持JDBC管理器到驱动程序连接。
JDBC API使用驱动程序管理器并指定数据库的驱动程序来提供与异构数据库的透明连接。
JDBC驱动程序管理器确保使用正确的驱动程序来访问每个数据源。 驱动程序管理器能够支持连接到多个异构数据库的多个并发驱动程序。
以下是架构图,它显示了驱动程序管理器相对于JDBC驱动程序和Java应用程序的位置 -
JDBC常用组件
DriverManager:它管理数据库驱动程序列表, 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。
Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。
但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
Statement/PreparedStatement/CallableStatement:Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。
它作为一个迭代器并可移动ResultSet对象查询的数据。
它作为一个迭代器并可移动ResultSet对象查询的数据。
RowSet:RowSet继承了ResultSet,与ResultSet相比,RowSet默认是可滚动,可更新,可序列化的结果集。它有四个离线的RowSet子接口,可以无须保持与数据库的连接
JDBC实例
数据库:mysql
开发工具:idea
使用JDBC的使用主要有以下几个步骤:
1.注册驱动
2.打开连接
3.执行查询
4.接收数据库
下面咱们敲一个实际的例子来学习一下
数据库连接
private static Connection getConn(){
String driver ="com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/samp_db";
String username = "mysql";
String password = "mysql";
Connection conn = null;
try {
Class.forName(driver);
conn= DriverManager.getConnection(url,username,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
添加/修改代码
private static int insert(Student student){
Connection conn= getConn();
int i =0;
String sql = "insert into students(Name,Sex,Age) values(?,?,?)";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1,student.getName());
pstmt.setString(2,student.getSex());
pstmt.setString(3,student.getAge());
i=pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
} private static int update(Student student) {
Connection conn = getConn();
int i = 0;
String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
查询代码
private static Integer getAll() {
Connection conn = getConn();
String sql = "select * from students";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();
System.out.println("============================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("============================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
测试代码
测试代码写到当前类就可以
public static void main(String args[]) {
JDBCOperation.getAll();
JDBCOperation.insert(new Student("Achilles", "Male", "14"));
JDBCOperation.getAll();
JDBCOperation.update(new Student("Bean", "", "7"));
JDBCOperation.getAll();
}
总结
Jdbc是J2EE的十三个规范之一,它提供了一组标准的API接口,各家厂商都可以将自己的数据库与之适配,它减少了程序员的学习成本,增加了开发的效率。