JDBC基础

1,JDBC是什么?

        JAVA DateBase Connectivity(JAVA语言连接数据库)

JDBC本质是:

        SUN公司制定的一套接口(interface)

                java.sql.*;(这个软件包下有很多接口。)

        接口都有调用者和实现者。(面向接口编程,解耦合,提高程序的扩展力)

2,为什么SUN制定一套JDBC接口?

        因为每一个数据库的底层实现原理不一样。

        如果没有这个接口,我们需要写很多实现。

        把接口的实现交给数据库的厂商来实现(实现者),Java程序员只需要去调用(调用者)。  面向接口去编程。

        

需要做的就是找到这些xxx.class文件。

        

Java程序员:自己编写的

JDBC接口: java.sql.*;(这个软件包下有很多接口。)

各大厂商的xxx.class文件需要去网上下载。(可以去各大厂商官网下载 )

        都是在一个jar包中,它们有一个特殊的名字“驱动”,驱动就是一个jar包

       MySQL 驱动,Oracle驱动,sqlserver驱动

编写模拟JDBC本质的简单过程:


SUN公司制定的接口:

/**
 * 模拟SUN公司制定这套接口
 */
public interface JDBC {
    /**
     * 连接数据库的方法
     */
    void getConnection();
}

各大厂商实现接口的类:

/**
 * MySQL的数据库厂家负责编写JDBC接口的实现类
 */
public class MySQL implements JDBC {

    @Override
    public void getConnection() {
        //具体这里的代码怎么写,对于我们Java程序员没关系
        //这段代码涉及到MySQL底层数据库实现原理
        System.out.println("连接MySQL数据库成功!");
    }
}


/**
 * Oracle的数据库厂家负责编写JDBC接口的实现类
 */
public class Oracle implements JDBC {

    @Override
    public void getConnection() {
        //具体这里的代码怎么写,对于我们Java程序员没关系
        //这段代码涉及到MySQL底层数据库实现原理
        System.out.println("连接Oracle数据库成功!");
    }
}

程序员的调用:

注意使用:ResourceBundle类的时候,要注意路径问题,

本例子使用了idea工具是一个maven项目,本例子不需要建立多余的包,全部在工程自带的Java包下。要确保运行后下面的classes下面有资源。

import java.util.ResourceBundle;

/**
 * java程序员调用JDBC接口
 * 不需要关心具体是哪个品牌的数据库,只需要面向JDBC接口写代码。
 * 面向接口编程,面向抽象编程,不要面向具体编程
 */
public class JavaProgrammer {
    public static void main(String[] args) throws ClassNotFoundException, 
                        InstantiationException, IllegalAccessException {

        //JDBC jdbc=new MySQL();
       // JDBC jdbc=new Oracle();

        //创建对象通过反射机制
        Class<?> c= Class.forName("MySQL");//只需要改文件路径就可以切换目标
        //需要自己强转
        JDBC o = (JDBC)c.newInstance();

        //通过配置文件获取
        ResourceBundle bundle = ResourceBundle.getBundle("JDBC");
        String className=bundle.getString("className");
        Class<?> c1 = Class.forName(className);
        //需要自己强转
        JDBC o1 = (JDBC)c1.newInstance();

        //以下代码都是面向接口调用方法,不需要改变
        o.getConnection();
        o1.getConnection();
    }
}

JDBC开发前的准备工作,

先从官网下载对应的jar包 ,然后将其配置到环境变量classpath中(可以去博客查找相关的步骤)(针对文本编辑器的开发方式,使用idea不需要以上配置)

       

之后的例子使用的是maven项目,可以直接导入依赖,管理jar包,没有配置环境变量。

没有使用maven项目,使用idea工具使用JDBC的准备工作。

然后去找下载jar包得路径导入就可以了。(每建一个项目都得重新导入)

使用maven可以直接导入 MySQL的依赖:

注意版本号的不同


    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
    </dependency>
        

JDBC编程六步:

第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)

第二步:获取连接(表示JVM的进程和数据库的进程之间的通道打开了)

                这属于进程之间的通信,使用完之后得关闭资源。

第三步:获取数据库操作对象(专门执行sql语句的对象)

第四步:执行SQL语句

第五步:处理查询结果集(只有第四步执行得是select语句得 时候,才有第五步)

第六步:释放资源

java.sql.*;

包下一个类:DriverManager,驱动管理器 :

       注册驱动的一个方法:

static voidregisterDriver(Driver driver)
          向 DriverManager 注册给定驱动程序。

Driver 是一个接口,由厂商实现。

MySQL实现该接口得类得路径是:com.mysql.jdbc.Driver(MySQL之前的版本)

8.0之后的版本建议使用:com.mysql.cj.jdbc.Driver

        获取连接的方法:

static ConnectiongetConnection(String url)
          试图建立到给定数据库 URL 的连接。
static ConnectiongetConnection(String url, Properties info)
          试图建立到给定数据库 URL 的连接。
static ConnectiongetConnection(String url, String user, String password)
          试图建立到给定数据库 URL 的连接。

返回的Connection是一个接口 

URL简单介绍:

url:统一资源定位符(网络中某个资源的绝对路径)

URL包括哪几部分:

        协议

        IP

        PORT

        资源名

http://182.61.200.7:80/index.html

http://通信协议(通信协议是通信之前就提前定好的数据传输格式。数据包具体怎么传输数据,格式提前定好的)

182.61.200.7 服务器IP地址

80   服务器上的软件的端口

index.html 服务器上某个资源名     

老版本:

jdbc:mysql://localhost:3306/db2

(local host是本机地址,3306是端口号,db2是数据库的名称,根据使用定)

 新版本:(后面一串好像是 保密的协议之类的。)

jdbc:mysql://localhost:3306/db2?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC

  

        获取数据库操作对象的方法

                是Connection接口的方法。实现交给厂商,我们只需要调用

StatementcreateStatement()
          创建一个 Statement 对象来将 SQL 语句发送到数据库。
 StatementcreateStatement(int resultSetType, int resultSetConcurrency)
          创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
 StatementcreateStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
          创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。

        执行SQL语句的方法:

                是Statement接口的方法。实现交给厂商,我们只需要调用

ResultSet

executeQuery(String sql)
          执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

执行的是select 语句。

 intexecuteUpdate(String sql)
          执行给定 SQL 语句,该语句可能为 INSERTUPDATEDELETE句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

 代码示例:

package com.bjpowernode;

import java.sql.*;

public class JDBCTest01 {
    public static void main(String[] args) {
        Statement stmt=null;
        Connection conn = null;
        try {
            //第一步:注册驱动
            //DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

            //拆成两步
            //如果导包(import java.sql.Driver;)可以写成下面的,不需要带包名
            Driver driver1 = new com.mysql.cj.jdbc.Driver();
            //Driver是一个接口,多态,父类指向子类对象
            java.sql.Driver driver = new com.mysql.cj.jdbc.Driver();
            DriverManager.registerDriver(driver);

            //第二步:获取连接
            String url = "jdbc:mysql://localhost:3306/自己的数据库名?
            useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
            String user = "root";
            String password = "自己的密码";
            conn = DriverManager.getConnection(url, user, password);

            //com.mysql.cj.jdbc.ConnectionImpl@50f8360d
            System.out.println("数据库连接对象:" + conn);

            //第三步:获取数据库操作对象(专门执行SQL的)
            stmt = conn.createStatement();

            //第四步:执行SQL
            String sql = "insert into sc values(10,02,99)";
            //专门执行DML语句(insert,delete,update) 语句
            //返回值是”影响数据库中的记录条数“
            int i = stmt.executeUpdate(sql);
            System.out.println(i);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
                try {
                    //6.释放资源
                    //为了保证资源一定释放,在finally语句块中关闭资源
                    //并且遵循从小到大的顺序,如果有多个需要分开来处理异常
                    if (stmt!=null) {
                        stmt.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                //6.释放资源
                //为了保证资源一定释放,在finally语句块中关闭资源
                //并且遵循从小到大的顺序,如果有多个需要分开来处理异常
                try {
                    if (conn != null) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值