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(); } } }