JDBC API主要位于java.sql包中,关键的接口和类包括以下几种。
类/接口 | 描述 |
Driver接口 DriverManager类 |
前者表示驱动器 后者表示驱动管理器。 |
Connection接口 | 表示数据库的链接 |
Statement接口 | 负责执行SQL语句 |
PreparedStatement接口 | 负责执行预备的SQL语句 |
CallableStatement接口 | 负责执行SQL存储过程 |
ResultSet接口 | 表示SQL查询语句返回的结果集 |
所有JDBC驱动器都必须实现Driver接口,JDBC驱动器由数据库厂商或第三方提供。在编写数据库的Java程序时,必须把特定数据库的JDBC驱动器的类库加入到classpath中。
DriverManager类用来建立和数据库的连接及管理JDBC驱动器。DriverManager类的方法都是静态的,主要包括以下几种
类/接口 | 描述 |
registerDriver(Driver driver) | 在DriverManeger中注册JDBC驱动器 |
getConnection(String url,String user,String password) | 建立和数据的连接 |
setLoginTime(int seconds) | 设定等待建立数据连接的超时时间 |
setlogWriter(PrintWriter out) | 设定输出JDBC日志的PrintWriter对象 |
连接数据库的代码如下:
//注册数据库的驱动
Class.forName("com.MySQL.jdbc.Driver");
//创建数据库的链接信息(指定要连接那个数据库):数据库路径、数据库的账号和密码
String url = "jdbc:mysql://localhost:3306/dataBase_Name";
String account = "root";
String password = "12345";
//连接数据库,返回连接结果,该结果的类型是Connection
Connection conn = DriverManager.getConnection(url,account,password);//获得连接
注意,上面代码可能出现的两种异常:
1、ClassNotFoundException:这个异常是在加载数据库驱动的时候,出现这个异常有两个可能:
a、检查是否导入了Mysql的jar包
b、将数据库的驱动名打错,检查是否是com.MySQL.jdbc.Driver
2、SQLException:这个异常出现在连接数据库的过程,出现这个异常就是三个参数的问题。
Connection接口代表Java程序和数据库的连接,主要包括以下方法。
类/接口 | 描述 |
getMetaData() | 返回表示数据库的元数据的DatabaseMetaData对象,元数据包含了描述数据库的相关信息 |
createStatement() | 创建并返回Statement对象 |
prepareStatement() | 创建并返回prepareStatement对象 |
Connection最为重要的方法就是获取Statement或者prepareStatement对象
//Statement的用法
Statement stmt = conn.createStatement(sql);
ResultSet rs = stmt.executeQuery();
//prepareStatement的用法
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
Statement接口提供了3个执行SQL语句的方法
类/接口 | 描述 |
execute(String sql) | 执行各种SQL语句,该方法返回一个boolean类型的值。该方法返回的是boolean类型,表示SQL语句是否有结果集。 如果执行的是更新语句,那么还要调用int getUpdateCount()来获取insert、update、delete语句所影响的行数。 如果执行的是查询语句,那么还要调用ResultSet对象的getResultSet()来获取select语句的查询结果。 |
executeUpdate(String sql) | 执行SQL的insert、update和delet等语句,适用于不需要返回结果的SQL语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录的数目。 |
executeQuery(String sql) | 执行SQL的select语句。查询操作会返回ResultSet对象,即结果集。 |
PrepareStatement接口继承了Statement接口,用来执行准备的SQL语句。在访问数据库时,可能会遇到某条SQL语句被多次执行,但是其中的参数却不同的情况。例如:
Select * From users Where name = "叶XX" And sex = 男 And age = 12";
Select * From users Where name = "黄X" And sex = 男 And age = 12";
Select * From users Where name = "陈X" And sex = 女 And age = 12";
从上面的SQL语句中我们可以发现,除了特定值之外都是相同的,所以我们可以将上面的SQL语句转化为如下所示:
Select * From users Where name = ? And sex = ? And age = ?;
上面代码中的?表示要插入的值,在这种情况下,使用PrepareStatement,而不是Statement来执行SQL语句,这样做具有以下优点:
(a)、简化程序代码,是程序更加灵活。例如:
//创建SQL语句
String sql = "Select * From users Where name = ? And sex = ? And age = ?";
//设置参数值
ps.setString(1,"LaoYe"); //此处的1表示name中的?,而LaoYe表示name的值,下面同理
ps.isBoolean(2,true);
ps.setInt(3,18);
(b)、提高访问数据库的性能。PrepareStatement执行预准备的SQL语句,数据库只需对这种SQL语句编译一次,然后就 可以多次执行。而每次用Statement执行SQL语句时,数据库都需要对该SQL语句进行编译。
//1、创建SQL语句
String sql = "Insert Into users(name,sex,age) Values(?,?,?)";
//2、连接数据库,获取连接对象
Connection conn = DriverManager.getConnection(url,account,password);
//3、预准备SQL语句
PrepareStatement ps = conn.prepareStatement(sql);
//第一次插入
ps.setString(1,"LaoYe"); //此处的1表示name中的?,而LaoYe表示name的值,下面同理
ps.isBoolean(2,true);
ps.setInt(3,18);
ps.executeUpdate();
第二次插入
ps.setString(1,"LaoCheng"); //此处的1表示name中的?,而LaoYe表示name的值,下面同理
ps.isBoolean(2,false);
ps.setInt(3,18);
ps.executeUpdate();
//结论:可以看出除了值,几乎是重复的,所以视情况可以循环插入,提高开发效率
(c)、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。
PrepareStatement的使用步骤如下:
(1)、创建SQL语句
//1、创建SQL语句
String sql = "Select * From users Where name = ? And sex = ? And age = ?";
(2)、通过Connection对象的prepareStatement()方法生成PrepareStatement对象。
//2、连接数据库,获取连接对象
Connection conn = DriverManager.getConnection(url,account,password);
//3、预准备SQL语句
PrepareStatement ps = conn.prepareStatement(sql);
3)、调用PreparedStatement的setXXX方法,给参数赋值
//4、将参数插入SQL语句中的指定位置
//其中1表示的是第一个?,即第一个位置,而name的数据类型必须是String,其它同理。
ps.setString(1,name);
ps.setString(2,sex);
ps.setInt(3,age);
(4)、执行SQL语句
//5、执行SQL语句,返回结果集(适用于Select语句)
ps.executeQuery();
setXxx 方法中的 Xxx 是 Java 类型。它是一种隐含的 JDBC 类型(一般 SQL 类型),因为驱动程序将把 Java 类型映射为相应的 JDBC 类型,并将该 JDBC 类型发送给数据库。例如,以下代码段将 PreparedStatement 对象 ps的第二个参数设置为 44,Java 类型为 short:
ps.setShort(2, 44);
驱动程序将 44 作为 JDBC SMALLINT 发送给数据库,它是 Java short 类型的标准映射。
程序员的责任是确保将每个 IN 参数的 Java 类型映射为与数据库所需的 JDBC 数据类型兼容的 JDBC 类型。不妨考虑数据库需要 JDBC SMALLINT 的情况。如果使用方法 setByte ,则驱动程序将 JDBC TINYINT 发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常 TINYINT 可用于SMALLINT 适用的任何地方。
ResultSet接口表示select查询语句得到的结果集。调用ResultSet对象的next()方法,可以使游标定位到结果集的下一条记录。调用ResultSet对象的getXxx()方法可以获得一条记录中某个字段的值(Xxx对应该字段的数据类型)。ResultSet接口定义了以下常用的getXxx()方法。
数据类型 | 方法名 | 描述 |
String | getString(String columnName) | 返回数据类型是String类型指定字段值 |
int | getInt(String columnName) | 返回数据类型是int类型指定字段值 |
float | getFloat | 返回数据类型是float类型指定字段值 |
boolean | getBoolean | 返回数据类型是boolean类型指定字段值 |
获取结果集的代码如下:
//5、执行SQL语句,获取结果集
ResultSet rs = ps.executeQuery();