JDBC入门及JDBC的基本操作 参考黑马程序员Java web

JDBC概述

什么是JDBC

  • JDBC全称是Java数据库连接,它是用一套用于执行SQL的Java API。应用程序可以通过这套API连接到关联数据库,并使用SQL语句对数据库中数据进行查询、更新和删除等操作。
应用程序
JDBC
MySQL驱动
MySQL
Oracle驱动
Oracle

由图可知: 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混合类型:此类型是参数传入,然后返回。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊~小 l i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值