JDBC入门及JDBC的基本操作&&大数据处理
JDBC概述
什么是JDBC
- JDBC全称是Java数据库连接,它是用一套用于执行SQL的Java API。应用程序可以通过这套API连接到关联数据库,并使用SQL语句对数据库中数据进行查询、更新和删除等操作。
由图可知: JDBC访问不同的数据库需要不同的数据库驱动进行连接,为了使应用程序与数据库进行连接JDBC不仅需要提供访问数据的API,还要封装各种数据库服务器通信细节。
JDBC 常用 API
1.Driver接口
Driver 接口是所有JDBC驱动程序必须实现现的接口,该接口专门提供给数据库厂商使用。在编写
JDBC程序时必须要把指定数据库驱动程序或类库加载到项目的classpath中。
2.DirverManager类
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法,如表所示。
方法名称 | 功能描述 |
---|---|
registerDriver(Driver driver) | 该方法用于向DiverMangr中注册给定的JDBC驱动程序 |
getConnection(String url,String user,String pwd) | 该方法用 于建立和数据库的连接,并返回表示连接的Cnnetion对象 |
3.Connection接口
Connection接口代表Java程序和数据库的连接,在Connection接口中,定义了一系列方法,具体如表所示。
方法名称 | 功能描述 |
---|---|
getMetaData( ) | 该方法用于返回表示数据库的元数据的DatabaseMetaData对象 |
createStatement( ) | 用于创建一个Statement 对象来将SQL. 语句发送到数据库 |
prepareStatement(String sql) | 用于创建个PreparedStatement 对象来将参数化的SQL语句发送数据库 |
prepareCall(String sql) | 用于创建一个CallableStaterment对象来调用数据库存储过程 |
4.Statement接口
Statement接口用于向数据库发送SQL语句,在Statement接口中,提供了三个执行SQL语句的方法,具体如表所示。
方法名称 | 功能描述 |
---|---|
execute(String sql) | 用于执行各种SQL语句,该方法返回一个boolean 类型的值,如果为true,表示,表示所执行的SQL语句具备查询结果,可通过Statement的getResultSet()方法获得查询结果 |
executeUpdate(String sql) | 用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录的数目 |
executeQuery(String sql) | 用于执行SQL中的select 语句,该方法返回一个表示查询结果的ResultSet对象 |
需要注意的是,表中的setDate()方法可以设置日期内容,但参数Date的类型是java. sql. Date,而不是
java. util. Date.
5.PreparedStatement接口
PreparedStatement是Statement 的子接口,用于执行预编译的SQL语句。在PreparedStatement接口中,提供了一些基本操作的方法,具体如表所示。
方法名称 | 功能描述 |
---|---|
executeUpdate( ) | 在此PreparedStatement对象中执行SQL语句,该语句必须是个DML语句或者是无返回内容的SQL语句,比如DDL语句 |
executeQuery() | 在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet 对象 |
setInt(int parameterIndex, int x) | 将指定参数设置为给定的int值 |
setFloat( int parameterIndex, float x) | 将指定参数设置为给定的float值 |
eSring( int parameterIndex.String x) | 将指定参数设置为给定的Sring值 |
serDate( int parameterIndex,Date x) | 将指定参数设置给Data值 |
addBatch() | 将一组参数添添加到此PreparedStatement对象处理命令中 |
setCharacterStream( parametaterIndex,reader,length) | 将指定输入流写入数据库文本 |
setBinaryStream( parametaterIndex,x,length) | 将二进制的输入流写入到二进制字段中 |
6.CallableStatement接口
CallableStatement是PreparedssSatmen的子接口,用于执行SQL存储过程。在CallableStatement接口中,提供了一些基本操作的方法,具体如表所示。
方法名称 | 功能描述 |
---|---|
registerOutParameter(int parameterIndex,int sqlType) | 按顺序位置将OUT参数注册为SQL类型。其中,parameterIndex表示顺序位置,sqlType表示SQL类型 |
setNull(String parameterName, int sqlType) | 将指定参数设置为SQL类型的NULL |
setString(String parameterName, String x) | 将指定参数设置为给定的Java类型的String值 |
wasNull() | 查询最后一个读取的 OuT参数是否为SQL类型的NULL值 |
getInt(int parameterIndex) | 以Java语言中int值的形式获取指定的数据库中INTEGER类型参数的值 |
需要注意的是,由于PreparedStatement接口又继Clelumaer接口继承了Peardrte待有的方法,也同时拥有了这两越两个交我中国此Calailaian接口中除了拥有自己两个父接口中的方法。
7.ResultSet接口
ResultSet接口表示南个一技口内部有一个指向表格数我据行的游标,ResulSses对象初始化时,游标在表格的第一行之前。从下表可以看看出,esutSetRuett接口中的常用方法。
段的索引来获取接口中定义了了大量的getXxx()方法,采用哪种getXxx()方法取决于字段为数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字体字段索引来获取指定数据。
方法名称 | 功能描述 |
---|---|
getString(int columnIndex) | 用于获取指定字段的String类型的值,参数columnIndex代表字段的索引 |
getring(String columnName) | 用于获取指定字段的String类型的值,参数columnName代表字段的名称 |
getInt(int columnIndex) | 用于获取指定字段的int类型的值,参数columnIndex代表字段的索引 |
Betnt(String columnName) | 用于获取指定字段的int类型的值,参数clumName代表字段的名称 |
getDate(int columnlndex) | 用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引 |
BetDateString columnName) | 用于 获取指定字段的Date类型的值.参数columnName代表字段的名称next() |
next() | 将游标从当前位置向下移一行 |
absolute(int row) | 将游标移动到此ResultSet对象的指定行 |
afterLast() | 将游标移动到此ResultSet 对象的末尾,即最后行之后 |
beforeFirst() | 将游标移动到此ResultSet对象的开头,即第一行之前 |
previous( ) | 将游标移动到此ResultSet对象的上–行 |
last( ) | 将游标移动到此ResultSet对象的最后一行 |
实现第一个JDBC程序
(1)加载并注册数据库驱动,具体方式如下。
DriverManager,registerDriver (Driver driver);
(2)通过DriverManager获取数据库连接,具体方式如下。
Connection conn= DriverManager ,getConnection (String url, String user, string pass);
从上述方式可以看出,getConnection()方法中有三个参数,它们分别表示数据库url、登录数据库的用户名和密码。数据库url通常遵循如下形式的写法。
jdbc:subprotocol:subname
上面的url写法中jdbe部分是固定的:subprotocol指定连接到特定数据库的驱动程序,而subname部分则很不固定,也没有什么规律,不同数据库的url形式可能存在较大差异,以MySQL数据库url为例,其形式如下。
jdbc:mysq1://hostname;port/databasename
(3)通过Cmeteon对象获取Sseme对象。Comein创建Sutere万式有I如下三种。
①createStatement():创建基本的Statement对象。
②prepareStatement():创建PreparedStatement对象。
③prepareCall():创建CallableStatement对象。
以创建基本的Statement对象为例,具体方式如下。
Statement stmt= conn.createStatement();
(4)使用Statement执行SQL语句。所有的Statement都有如下三种方法来执行SQL语句。
①execute():可以执行任何SQL语句。
②executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet 对象。③executeUpdate():主要用于执行DML和DDL语句。执行DMI语句,如INSERT、UPDATE或DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0。以executeQuery()方法为例,具体方式如下。
//执行SQL语句,获取结果集ResultSet
ResultSet rs=stmt. executeQuery(sq1) ;
(5)操作ResultSet结果集。如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。程序可以通过操作该ResultSet对象来取出查询结果。ResultSet 对象提供的方法主要可以分为以下两类。
①next()、previous()、first()、last()、beforeFirst()、afterLast()、abolute()等移动记录指针的方法。
②getXxx()获取指针指向行,特定列的值。
(6)回收数据库资源。关闭数据库连接,释放资源,包括关闭ResultSet、Statement和Connection等资源。
环境搭建
在MySQL中创建一个chapter01的数据库创建一个users表,代码如下:
CREATE DATABASE chapter01;
USE chapter01;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(40),
password VARCHAR (40 ),
emil VARCHAR (60),
brithday DATE)CHARACTER SET utf8 COLLATE utf8_general_ci;
添加数据并查询
导入数据库驱动驱动
在Java工程下导入数据库驱动文件添加到classpath中,用于访问数据库驱动。例如IDEA导入Java-connector-java详情见此处
编写JDBC程序
例子
package jdbc;
import java.sql.*;
public class Example01 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//通过DriverManager获取连接
String url = "jdbc:mysql://localhost:3306/chapter01?serverTimezone=GMT%2B8";
String name = "root";
String password = "2001";
Connection connection = DriverManager.getConnection(url,name,password);
//获取Connection对象获取Statement对象
Statement statement = connection.createStatement();
//执行SQl语句
String sql = "select * from users";
ResultSet resultSet = statement.executeQuery(sql);
//操作ResultSet
System.out.println("id|name|password|email|birthday");
while (resultSet.next()){
int id = resultSet.getInt("id");
String name1 = resultSet.getString("name");
String password1 = resultSet.getString("password");
String email = resultSet.getString("emil");
Date birthday = resultSet.getDate("brithday");
System.out.println(id+"|"+name1+"|"+password1+"|"+email+"|"+birthday);
}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;
}
}
}
1、注册数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2、释放资源
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;
}
}
PreparedStatment对象
Statment提供了一个子类PreparedStatment。PreparedStatment对象可以实现对SQL语句进行预编译。也就是说,当相同的SQL再次执行时,数据库只需要使用缓冲区中的数据,而不需要对SQL语句再次编译,从而提高数据的访问效率。例子如下:
package jdbc;
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, ClassNotFoundException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/chapter01?serverTimezone=GMT%2B8";
String username = "root";
String password = "2001";
//创建应用程序与数据库连接的Connection对象
connection = DriverManager.getConnection(url,username,password);
//执行SQL
String sql = "INSERT INTO users(name,password,emil,brithday)"+"VALUES(?,?,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"zw");
preparedStatement.setString(2,"123456");
preparedStatement.setString(3,"zw@163.com");
preparedStatement.setString(4,"2217-6-9");
preparedStatement.executeUpdate();
}catch (ClassNotFoundException e){
e.printStackTrace();
}finally {
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;
}
}
}
}
例子使用PreparedStatment对象执行SQL语句的步骤首先通过Connection对象的PreparedStatment()方法生成PreparedStatment对象,然后调用PreparedStatment对象的setXXX()方法,给SQL语句赋值,然后通过调用executeUpdate()方法执行SQL语句。
查询表信息
CallableStatement对象
CallableStatement接口用于执行SQL存储过程,它继承自PreparedStatement接口,JDBC API提供了一个储存过程SQL的转义语法,该语法允许所有关系型数据库管理系统(RDBMS)使用的标准方式调用储存过程。此语法有一个包含结果参数的形式和一个不包含结果参数的形式,具体如下所示:
{?=call<procedure-name>[(<arg1>,<arg2>,.....)]}
{call<procedure-name>[(<arg1>,<arg2>,.....)]}
上述语法中,( < arg1 > ,< arg2 >,… )有三种不同形式,具体如下:
- IN 类型:此类型是用于参数从外部传递给储存过程使用。
- OUT 类型:此类型是储存过程执行中的返回值。
- IN、OUT混合类型:此类型是参数传入,然后返回。