JDBC全内容详解

1. 什么是JDBC?

Java DataBase Connectivity

在java语言中编写sql语句,对mysql数据库中的数据进行CRUD操作

操作:增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)

2. JDBC相关的类库在哪里?

java.sql.*;

3. JDBC本质上是一堆什么呢?

  • java.sql.; 这个包下都是JDBC的接口*,SUN公司制定的!
  • JDBC是体现“接口作用”的非常经典的例子。
  • JDBC降低了耦合度,提高了扩展力。
  • 对于java程序员来说,不需要关心数据库是哪个品牌。只要面向JDBC接口编程就行!

4. JDBC整个程序的结构当中有三波人?

第一波

SUN公司,负责制定JDBC接口。这些接口已经写好了,在java.sql.*;

代码实例:

package com.jdbc.Demo01;

//SUM公司负责制定这套JDBC接口
public interface Jdbc {
   
    //连接数据库的方法
    void getConnection();
}

第二波

java.sql.*下面的所有接口都要有实现类,这些实现类是数据库厂家编写的。我们连接的是mysql数据库,mysql数据库厂家的实现类在哪里呢?mysql-connector-java-5.1.23-bin.jar。jar包中很多.class字节码文件,这是mysql数据库厂家写的接口实现

注意:如果连接的是oracle数据库,你需要从网上下载oracle的jar包。也叫做oracle的驱动

mysql-connector-java-5.1.23-bin.jar 这个jar包有一个专业的术语,大家记住就行:mysql的驱动。

如果是oracle的jar,被称为oracle的驱动。

代码实例:

package com.jdbc.Demo01;

//MYSQL的数据库厂家负责编写JDBC接口的实现类
public class Mysql implements Jdbc {
   
    @Override
    //实现类被称为驱动。(MYSQL驱动)
    public void getConnection() {
   
        //具体这里的代码怎么写,对于我们这些java程序员没关系
        System.out.println("连接MYSQL数据库");
    }
}
package com.jdbc.Demo01;

//Oracle 的数据库厂家负责编写JDBC接口的实现类
public class Oracle implements Jdbc {
   
    @Override
    //实现类被称为驱动。(Oracle驱动)
    public void getConnection() {
   
        //具体这里的代码怎么写,对于我们这些java程序员没关系
        System.out.println("连接Oracle数据库");
    }
}

第三波

我们java程序员,面向JDBC接口写代码就行!

代码实例:

package com.jdbc.Demo01;

public class JavaProgrammer {
   
    public static void main(String[] args) {
   
        //面向JDBC接口写代码

        Jdbc j = new Mysql();//连接MYSQL数据库
        //Jdbc j = new Oracle();//连接Oracle数据库

        //连接数据库
        //调用方法的时候,面向JDBC接口调用,JDBC接口中有什么方法就调用什么方法。
        j.getConnection();

        //...以下几百行代码都是面向jdbc接口调用的,不需要修改
        //...
    }
}

5. JDBC开发之前的准备工作?

  1. mysql的驱动jar包,需要配置到classpath当中吗?
    mysql-connector-java-5.1.23-bin.jar里是字节码,是class文件
    Java虚拟机的类加载器会去加载class文件

  2. 类加载器怎么能够找到这些class文件呢?
    classpath没有配置的情况下,默认从当前路径下加载class。
    classpath如果配置死了,例如:classpath=D:\abc,则表示固定只从d:\abc目录下找class

所以是:classpath=.;D:\course\04-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

  1. 其中的 . 代表什么?

    当前路径

  2. 以上的classpath什么意思?

    类加载器从当前路径下加载class,如果当前路径下没找到,
    则去D:\course\04-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar找class文件。

  3. jar包需要解压吗?

    不需要解压,java虚拟机的类加载器有这个能力找到class文件。

注意事项:

如果使用IDEA工具的话的,就不需要配置,但是IDEA工具有自己的配置!!

6. JDBC编程六步

  1. 注册驱动

    (通知java超限额我们即将要连接的是那个品牌的数据库)

  2. 获取数据库连接

    (java进程和mysql进程,两个进程之间的通道开启了)

    (java进程可能在北京,mysql进程可能在上海)

  3. 获取数据库操作对象

    (这个对象很重要,用这个对象执行SQL的)

  4. 执行SQL语句

    (执行CRUD操作)

  5. 处理查询结果集

    (如果第四部是select语句,才有这个第五步)

  6. 释放资源

    (关闭所有的资源,因为JDBC毕竟是进程之间的通信,占用很多的资源,需要关闭)

7. 代码实例—Test01

se ——数据库名称

example -——se数据库下的表

在这里插入图片描述

package com.jdbc.Demo02;
import java.sql.*;

public class Test01 {
   
    public static void main(String[] args) {
   
        Connection conn=null;
        Statement stmt = null;
        try{
   //1.注册驱动

        //com.mysql.jdbc.Driver是mysql数据库厂家写的,实现Java.sql.Driver接口
        //如果是Oracle数据库的话,类名就不一样了,(oracle.jdbc.driver.OracleDreiver)

            Driver driver = new com.mysql.cj.jdbc.Driver();//mysql的。
         // Driver driver = new com.oracle.jdbc.OracleDriver();//Oracle的。

            DriverManager.registerDriver(driver);

            //2、获取数据库连接
            /*
              url:统一资源定位符(网络中某个资源的绝对路径)
              http://www.baidu.com/ 这就是URL。
              URL包括哪几部分?
                协议
                IP
                PORT
                资源名
                http:// 182.61.200.7:80/index.html

                http:// 通信协议
                182.61.200.7服务器ip地址
                80服务器上软件的端口
                index.html是服务器上某个资源名

                ip是计算机的代号,端口是软件应用的代号

               jdbc:mysql://localhost:3306/se?serverTimezone=UTC
               jdbc:mysql://     这是java程序和mysql通信的协议
               localhost         这是本机IP地址,本机地址还可以写成127.0.0.1
               3306               mysql数据库端口号
               se                 mysql数据库表名称

               说明localhost 和127.0.0.1都是本机ip地址。
               什么是通信协议,有什么用?
                    通信协议是通信之前就提前定好的数据传送格式。
                    数据包具体怎么传数据,格式提前定好的。

             oracle的url:
               jdbc:oracle:thin:@localhost:1521:orcl
               dbc:oracle:thin:@    这是java程序和oracle通信的协议
               localhost            这是本机IP地址
               1521                  oracle数据库端口号
               se                    oracle数据库表名称
             */
            String url = "jdbc:mysql://localhost:3306/se?serverTimezone=UTC";
            String user = "root";
            String password = "1111";

            conn = DriverManager.getConnection(url,user,password);
            //输出连接对象的内存地址
            System.out.println(conn);//com.mysql.cj.jdbc.ConnectionImpl@5e25a92e
            //com.mysql.cj.jdbc.Connection类实现了java.sql.Connection接口
            //实际上我们后续开发并不需要关心底层具体是那个对象,因为面向接口编程

            //3.获取数据库操作对象(statement专门执行sql语句的)

            //创建一个Statement对象来将SQL语句发送到数据库
            stmt = conn.createStatement();
            System.out.println(stmt);

            //通过一个连接对象Connection是可以创建对个Statement对象的
            //Statement stmt2 = conn.createStatement();
            //System.out.println(stmt2);

            //4.执行SQL语句(insert,delete,update)
            // Statement接口中的executeUpdate方法专门来执行SQL语句的
            //该方法的返回值表示,影响了数据库表中的总记录条数

            //insert(插入数据)
            String insertsql = "insert into example (id,content) values (6,'实验')";
            int count = stmt.executeUpdate(insertsql);
            System.out.println(count);

            //update(更改数据)
            String updatesql = "update example set content = '再实验' where id = 6";
            int count2 = stmt.executeUpdate(updatesql);
            System.out.println(count2);

            //delete(删除数据)
            String deletesql = "delete from example where id = 6";
            int count3 = stmt.executeUpdate(deletesql);
            System.out.println(count3);

        } catch (SQLException e) {
   
            e.printStackTrace();
        }finally {
   
            //6. 释放资源
            //先释放statement,再释放Connection
            //分别进行try,catch处理
            //放到finally中关闭
            if(stmt !=null){
   
                try {
   
                    stmt.close();
                }catch (SQLException e){
   
                    e.printStackTrace();
                }
            }
            if(conn != null){
   
                try {
   
                    conn.close();
                }catch (SQLException e){
   
                    e.printStackTrace();
                }
            }

        }
    }
}

8. 代码实例—Test02

(1)代码实例

package com.jdbc.Demo02;
import java.sql.*;
//提醒一下: jdbc中所有的下标都是从1开始的
public class Test02 {
   
    public static void main(String[] args) {
   
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try{
   
            //1.注册驱动
            DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
            //2.建立连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/se?serverTimezone=UTC","root","1111");
            //3.获取数据库操作对象
            stmt = conn.createStatement();
            //4.执行SQL语句
            //jdbc中的SQL语句不需要 ; 结尾
            String sql = "select id,content from example";
            //执行查询语句是这个方法:executeQuery
            //ResultSet 就是查询结果集对象,查询的结果都在这个对象当中
            rs = stmt.executeQuery(sql);

            //5.处理查询结果集
            //目前没有什么好处理的,直接把结果集中的数据遍历输出吧。
            /*
            ResultSet 对象中有以下的数据:
            +----+---------+
            | id | content |
            +----+---------+
            |  1 | 测试1   |
            |  2 | 测试2   |
            |  3 | 测试3   |
            |  4 | 测试4   |
            |  5 | 测试5   |
            +----+---------+
            调用ResultSet接口中相应的方法来遍历结果集

             */
            boolean has = rs.next();//光标向前移动一位
            if(has){
   
                //条件成立表示光标指向的行 有记录
                //取当前行的第1个值
                String id = rs.getString(1);//注意:getString这个方法是不管底层数据库表中的是什么类型,统一以String是我形式返回

                //取当前行的第2个值
                String content = rs.getString(2);
                System.out.println("第1行为"+id+","+content);
            }
            //光标下移,求下一行
            has = rs.next();//光标向前移动一位
            if(has){
   //条件成立表示光标指向的行 有记录

                //取当前行的第1个值
                String id = rs.getString(1);

                //取当前行的第2个值
                String content = rs.getString(2);
                System.out.println("第2行为"+id+","+content);
            }

            //使用循环求剩下几行的数据
            while (rs.next()){
   
                //根据下标来取值的,并且都是以String类型取出的!!!
                /*
                String id = rs.getString(1);
                String content = rs.getString(2);
                System.out.println(id+","+content);
                */

                //根据下标来取值的,以特定的类型取出!!!
                /*int id = rs.getInt(1);
                String content = rs.getString(2);
                System.out.println(id+","+content);
                */

                //根据查询结果的列名
                //以后常用这种方式,健壮。
                int id = rs.getInt("id");//id并不是字段的名称,是查询结果的列名
                String content = rs.getString("content");
                System.out.println(id+","+content);

            }

        }catch(SQLException e){
   
            e.printStackTrace();

        }finally {
   
            //6.释放资源
            if(rs != null){
   
                try{
   
                    rs.close();
                }catch (SQLException e){
   
                    e.printStackTrace();
                }
            }
            if(stmt != null){
   
                try{
   
                    stmt.close();
                }catch (SQLException e){
   
                    e.printStackTrace();
                }
            }
            if(conn != null){
   
                try{
   
                    conn.close();
                }catch (SQLException e){
   
                    e.printStackTrace();
                }
            }
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值