JDBC进阶知识总结

版权声明:转载请标明出处,谢谢合作 https://blog.csdn.net/Rao_Limon/article/details/82946927

JDBC中的接口和类

       JDBC API主要位于java.sql包中,关键的接口和类包括以下几种。

类/接口 描述

Driver接口

DriverManager类

前者表示驱动器

后者表示驱动管理器。

Connection接口 表示数据库的链接
Statement接口 负责执行SQL语句
PreparedStatement接口 负责执行预备的SQL语句
CallableStatement接口 负责执行SQL存储过程
ResultSet接口 表示SQL查询语句返回的结果集

 

一、DriverManager接口和DriverManager类

       所有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接口

       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接口

       Statement接口提供了3个执行SQL语句的方法

类/接口 描述
execute(String sql)

       执行各种SQL语句,该方法返回一个boolean类型的值。该方法返回的是boolean类型,表示SQL语句是否有结果集

       如果执行的是更新语句,那么还要调用int getUpdateCount()来获取insert、update、delete语句所影响的行数。

       如果执行的是查询语句,那么还要调用ResultSet对象的getResultSet()来获取select语句的查询结果。

executeUpdate(String sql) 执行SQL的insertupdatedelet语句,适用于不需要返回结果的SQL语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录的数目。
executeQuery(String sql) 执行SQL的select语句。查询操作会返回ResultSet对象,即结果集。


四、PrepareStatement接口

       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接口

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

 

阅读更多
换一批

没有更多推荐了,返回首页