JDBC为Java开发者使用数据库提供了统一的编程接口,它由一组Java类和接口组成。是Java程序与数据库系统通信的便准API。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并执行相应的操作。
sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此,sun公司决定自己提供一套API,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口,而数据库厂商的JDBC实现,我们就叫他此数据库的数据库驱动
下面先介绍JDBC里面常用的接口与类
介绍一些JDBC之中常用的接口和类,这些接口和类都在Java.sql包里面。
Connection接口代表与特定的数据库的连接,在连接上下文中执行SQL语句并返回结果。Connection接口常用的方法如下表格
Statement接口用于在已经建立连接的基础上向数据库发送SQL语句,在JDBC中有三种Statement对象,分别是Statement、PreparedStatement 和CallableStatement。Statement对象用于执行不带参数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用于执行对数据库的存储过程(存储过程是Mysql里面的术语,具体需要参考Mysql数据库的内容)的调用。Statement接口的常用方法如下
PreparedStatement接口用来动态地执行SQL语句。通过PreparedStatement实例执行的动态SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复地执行该SQL语句。PreparedStatement接口常用的方法如下
DriverManager 类用来管理数据库中的所有驱动程序。**它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接。**如果通过getConnection()方法可以建立连接,则经连接返回,否则抛出SQLException异常。DriverManager 类的常用方法如下所示。
ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移。
在JDBC2.0(JDK 1.2)之后,该接口添加了一组更新方法updateXXX(),该方法有两个重载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对数据进行的操作同步到数据库中,需要执行updateRow()或insertRow()方法更新数据库。ResultSet接口的常用方法如下表
要访问数据库,首先要加载数据库的驱动程序(只需要在第一次访问数据库时加载一次),然后每次访问数据库时创建一个Connection对象,接着执行操作数据库的SQL语句,最后在完成数据库操作后销毁前面创建的Connection对象,释放与数据库的连接。 主要的步骤如下
1.加载JDBC驱动程序
2.建立与数据库的连接
3.发送SQL语句
4.得到查询结果
看如下代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 测试跟数据库建立连接
*/
public class jdbc01 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接(建立连接对象内部其实 包含了 Socket对象,是一个远程的连接,比较耗时!这是Connection对象管理的一个要点)
//真正开发中,为了提高效率,都会使用连接池来管理连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
stmt = conn.createStatement();//The object used for executing a static SQL statement and returning the results it produces.
String sql = "CREATE TABLE `t_user2` (\n" +
" `id` int(10) NOT NULL AUTO_INCREMENT,\n" +
" `username` varchar(30) DEFAULT NULL,\n" +
" `pwd` varchar(30) DEFAULT NULL,\n" +
" `regTime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;\n";
stmt.execute(sql);
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
代码分析:
1.首先加载驱动类
Class.forName("com.mysql.jdbc.Driver");
Class类是java.lang包中的一个类,通过该类的静态方法forName()可加载com.mysql.jdbc.Driver驱动类。
2.使用java.sql包中的Connection接口,并通过DriverManger类的静态方法getConnection()创建连接对象,代码如下
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
3.向数据库发送SQL语句。使用Statement接口声明一个SQL语句对象,并通过刚才创建的连接数据库对象conn的createStatement()方法创建SQL对象,代码如下
stmt = conn.createStatement();//The object used for executing a static SQL statement and returning the results it produces.
4.接下来就可以对数据库里面的数据执行查找、添加、修改、删除等操作
5.销毁(销毁)创建的对象及连接,顺序按照下面的规则;
6.关闭的顺序:
ResultSet—>Statement---->Connection的顺序关闭(后开的先关闭),一定要将三个try catch分开写
package com.bjsxt.jdbc;
import java.sql.*;
/**
* 测试 PreparedStatement 基本用法
*/
public class jdbc02 {
public static void main(String[] args) {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
String sql = "insert into t_user1 (username,pwd,regTime) values (?,?,?)";
//参数索引是从1开始而不是0;
//?表示占位符
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"李剑1");
ps.setString(2,"123456t");
ps.setDate(3,new java.sql.Date(System.currentTimeMillis()));
//也可以不考虑数据的类型而使用ps.setObject()方法来直接赋值;
System.out.println("插入一条记录");
ps.execute();//执行语句
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.bjsxt.jdbc;
import java.sql.*;
/**
* 测试 ResultSet 基本用法
*/
public class jdbc03 {
public static void main(String[] args) {
try {
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//建立连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","123456");
String sql = "select id,username,pwd from t_user1 where id >=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,1);
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getInt(1)+"---"+rs.getString(2)+"---"+rs.getString(3));
}
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}