JDBC
什么是JDBC
其实JDBC就是一套统一的java代码,这套代码,可以操作所有的关系型数据库。
接口需要实现类,每一个不同的数据库产商定义了不同的实现类,但是每一个实现类都实现类了相同的JDBC接口。
我们写代码的时候,只需要实现接口的调用,实现类是由不同的数据库厂商来实现的。(实现类也叫数据库驱动)
JDBC的本质
官方(sun)公司定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行代码是驱动jar包中的实现类。
两个层次:
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC驱动程序:各个数据库厂商根据JDBC的规范制作的 JDBC 实现类的类库
JDBC驱动程序总共有四种类型:
第一类:JDBC-ODBC桥。
第二类:部分本地API部分Java的驱动程序。
第三类:JDBC网络纯Java驱动程序。
第四类:本地协议的纯 Java 驱动程序。
JDBC常用的API
一、Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。
在编写JDBC程序时,必须把所使用的数据库驱动程序或者类库加载到项目的classpath中(这里指MySQL驱动JAR包)
二、DriverManager类
DriverManager类用于加载JDBC驱动,并且创建与数据库的连接
在DriverManager类中,定义了两个比较重要的静态方法。
方法名称 | 功能描述 |
---|---|
static void registerDriver(Driver driver) | 该方法用于向DriverManager中注册给定的JDBC驱动程序 |
static Connection getConnection(String url,String user,String pwd) | 该方法用于建立和数据库的连接,并返回表示连接的Connection对象 |
三、Connection接口
Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表
方法名称 | 功能描述 |
---|---|
DatabaseMetaData getMetaData() | 该方法用于返回表示数据库的元数据的DatabaseMetaData对象 |
Statement createStatement() | 用于创建一个Statement对象来将SQL语句发送到数据库 |
PreparedStatement preparStatement(String sql) | 用于创建一个PreparedStatement对象来将参数化的SQL语句发送到数据库 |
CallableStatement prepareCall(String sql) | 用于创建一个CallableStatement对象来调用数据库存储过程 |
四、Statement接口
Statement接口用于执行静态的SQL语句,并返回一个结果对象。
Statement接口对象可以通过Connection实例的createStatement()方法获取,该对象会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。
在Statement接口中,提供了3个常用的执行SQL语句的方法
方法名称 | 功能描述 |
---|---|
boolean execute(String sql) | 用于执行各种SQL语句,该方法返回一个Boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可通过Statement的getResultSet()方法获得查询结果 |
int executeUpdate(String sql) | 用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数 |
ResultSet executeQuecry(String sql) | 用于执行SQl中的select语句,该方法返回一个表示查询结果的ResultSet对象 |
五、PreparedStatement接口
PreparedStatement 是 Statement的子接口,用于执行预编译的SQL语句。
该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符 “?” 来替代其参数,然后通过 setXxx()方法为SQL 语句的参数赋值。
方法名称 | 功能描述 |
---|---|
int executeUpdate() | 在此PreparedStatement对象中执行SQL语句,该语句必须是一个DML语句或者是无返回内容的SQL语句,如DDL语句 |
ResultSet executeQuery() | 在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象 |
void setInt(int parameterIndex,int x) | 将指定参数设置为给定的int值 |
void setFloat(int parameterIndex,float x) | 将指定参数设置为给定的float值 |
void setString(int parameterIndex,String x) | 将指定参数设置为给定的String值 |
void setDate(int parameterIndex,Date x) | 将指定参数设置为给定的Date值 |
将一组参数添加到此Pre对象的处理命令 |
在通过setXxx()方法为SQL语句中的参数赋值时,可以通过输入参数的已定义SQL类型兼容的方法(例如,如果参数具有SQL类型为Integer,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数)
需要注意的是,表中的setDate()方法可以设置日期内容,但参数Date的类型是java.sql.Date,而不是java.util.Date
六、ResultSet接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装再一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法作为while循环的条件来迭代ResultSet结果集。ResultSet接口中的常用方法如下所示。
ResultSet接口定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第一列字段名为id,字段类型为int,那么既可以使用getInt(1)获取该列的值,也可以使用getInt(“id”)获取该列的值。
实现第一个JDBC程序
1.搭建数据库环境
在MySQL中创建一一个名称为jdbc 的数据库,然后在该数据库中创建一一个users表,并向其插入数据
2.创建项目环境,导入数据库驱动
在Eclipse中新建一一个名称为chapter09的Web项目,将下载好的MySQL的数据库驱动文件mysql-connector-java-5.0.8- bnjan复制到项目的ib目录中,并发布到类路径下(MsSQL驱动文件可以在其官网地址: ht:/:/v.mysal.om/downloadsco.e.cor/页面中下载在浏览器中输入该地址后即可进入下载页面,单击页面Generally Available (GA) Releases窗口中的Looking for previous GA versions超链接后,在显示出的下拉框中下载所需的驱动版本即可
编写JDBC程序
在项目chapter09的srC目录下,新建一一个名称为cn.itcast.jdbc.example的包,在该包中创建类Example01,该类用于读取数据库中的users表,并将结果输出到控制台
package cn.itcast.jbdc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Example01 {
public static void main(String[] args) throws SQLException {
Statement stmt=null;
ResultSet rs=null;
Connection conn=null;
try {
//1.注册数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过DriverManager获取数据库连接
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "123456";
conn=DriverManager.getConnection(url, username, password);
//3.通过Connection对象获取Statement对象
stmt=conn.createStatement();
//4.使用Statement执行SQL语句
String sql="select * from users";
rs=stmt.executeQuery(sql);
//5.操作ResultSet结果集
System.out.println("id | name | password | email | birthday");
while (rs.next()) {
int id=rs.getInt("id"); //通过列名获取指定字段的值
String name = rs.getString("name");
String psw = rs.getString("password");
String email = rs.getString("email");
String birthday = rs.getString("birthday");
System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
}
}catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
//6.回收数据库资源
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
}
PreparedStatement 对象
创建一个名称为Example02的类,在该类中使用PreparedStatement 对象对数据库进行插入数据的操作
package cn.itcast.jbdc.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Example02 {
public static void main(String[] args) throws SQLException {
Connection conn=null;
PreparedStatement preStmt=null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/jdbc";
String username="root";
String password