本文共 6933 字,大约阅读时间需要 23 分钟。
版权声明
- 本文原创作者:
- 作者博客地址:
本文简介
本文主要介绍JDBC的基础知识及其用法。
JDBC简介
JDBC(java database connectivity)是SUN公司提供的一套利用Java语言操作数据库的标准规范。
在JDBC中定义了许多接口而数据库厂商在其数据库驱动中实现了这些接口。关于JDBC与数据库驱动的关系,请参见下图:JDBC中定义的接口(规范),各数据库厂商(比如MySQL,Oracle,DB2等)在其数据库驱动中实现了这些接口(规范)。所以,JDBC屏蔽了Java与不同数据库打交道的细节问题;假如项目原本使用的是MySQL,在某段时间后换成了Oracle,那我们基本不用去修改原来项目中的SQL语句,只需要把JDBC中MySQL的数据库驱动切换成Oracle对应的数据库驱动即可。
JDBC的核心技术点:
- DriverManager:用于加载驱动
- Connection: 用于创建与数据库的连接
- Statement: 用于操作sql语句
- ResultSet: 结果集或一张虚拟表
JDBC的操作步骤:
- 加载驱动
- 创建连接
- 创建Statement对象
- 执行sql语句且返回结果
- 处理结果
- 关闭资源
嗯哼,在了解这些之后我们来看一个简单的示例,代码如下:
package cn.com;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;/** * 原创作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class UnitTest { @Test public void testJDBC1() { Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root"); statement = connection.createStatement(); String sql = "select * from student"; resultSet = statement.executeQuery(sql); while (resultSet.next()) { Student student = new Student(); int id = resultSet.getInt("studentid"); String name = resultSet.getString("studentname"); student.setStudentID(id); student.setStudentName(name); System.out.println(student); } } catch (Exception e) { e.printStackTrace(); } finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } resultSet = null; } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } statement = null; } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } connection = null; } } }}
在该示例中,利用JDBC从数据库查询数据。代码解析如下:
- 第一步: 加载MySQL数据库驱动,请参见代码第22行
- 第二步: 创建与数据的连接,请参见代码第23行
- 第三步: 创建用于执行SQL语句的Statement对象,请参见代码第24行
- 第四步: 利用Statement执行SQL语句且得到结果集,请参见代码第26行
- 第五步: 处理结果集,请参见代码第27-34行
- 第六步: 关闭资源,请参见代码第37-64行
详解JDBC常用类和接口
通过刚才的例子,我们对于JDBC的使用有了初步的了解和认知,现在此基础上详解JDBC常用的类和接口
java.sql.Drivermanager类
java.sql.Drivermanager类用于加载(注册)驱动和与数据库建立连接。
利用java.sql.Drivermanager类用于加载(注册)驱动
在此,我们采用的是:
Class.forName(“com.mysql.jdbc.Driver”);
还有另外一种方式:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
该方式不但强烈依赖数据库的驱动jar而且会导致驱动被重复注册2次。故不建议使用该方式
利用java.sql.Drivermanager类与数据库建立连接
比如,该示例中:
DriverManager.getConnection(“jdbc:mysql://localhost:3306/db1”,”root”, “root”);
其中jdbc表示协议,mysql表示子协议,localhost代表IP,3306表示端口号,db1表示要连接的数据库,第一个root表示用户名,第二个root表示密码。这些值是我示例中的配置,在项目中使用时请替换这些值。
java.sql.Connection接口
java.sql.Connection是一个接口,它用于与数据库交互;各数据库驱动中均实现了该接口。java.sql.Connection最常用的操作是创建用于执行SQL语句的Statement,即:
connection.createStatement();
java.sql.Statement接口
java.sql.Statement接口用于操作SQL语句并返回相应的结果集;各数据库驱动中均实现了该接口。java.sql.Statement的常用方法如下:
- executeQuery(String sql) 该方法用于执行select语句并根据查询语句返回结果集
- executeUpdate(String sql) 该方法用于执行insert、update、delete语句并返回受影响的行数
- execute(String sql) 此方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false
java.sql.ResultSet接口
java.sql.ResultSet用于保存执行SQL语句之后得到的结果集;各数据库驱动中均实现了该接口。
ResultSet对外暴露一个游标,该游标默认指向结果集第一行之前。ResultSet常见方法释义如下:
boolean next()
将游标从当前位置向下移动一行
boolean previous()
将光标移动到此ResultSet对象的上一行。
void afterLast()
将光标移动到末尾,正好位于最后一行之后。
void beforeFirst()
将光标移动到开头,正好位于第一行之前。
Object getObject(int columnIndex);
根据序号取值,索引从1开始
Object getObject(String ColomnName);
根据列名取值
int getInt(int colIndex)
以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel)
以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex)
以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel)
以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex)
以String形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel)
以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);
以Date形式获取ResultSet结果集当前行指定列号值
Date getDate(String columnName);
以Date形式获取ResultSet结果集当前行指定列号值
void close()
关闭ResultSet对象
在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中;在此请注意Java的数据类型与数据库的数据类型的对应关系:
利用preparedStatement防止SQL注入
preparedStatement(预编译对象)是Statement的子类,它具有如下特点:
- 预先编译SQL语句
- 性能优异
- 在SQL语句中使用占位符
在此利用preparedStatement优化刚才的示例,代码如下:
package cn.com;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;/** * 原创作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class UnitTest { @Test public void testJDBC2() { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root"); String sql = "select * from student where studentid=? and studentname=?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 4); preparedStatement.setString(2, "波少野结衣"); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { Student student = new Student(); int id = resultSet.getInt("studentid"); String name = resultSet.getString("studentname"); student.setStudentID(id); student.setStudentName(name); System.out.println(student); } } catch (Exception e) { e.printStackTrace(); } finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } resultSet = null; } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } preparedStatement = null; } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } connection = null; } } }}
至此,关于JDBC的基础知识就介绍完了,谢谢。
转载地址:https://it9527.blog.csdn.net/article/details/54810998 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!