JDBC从入门到精通

课程地址:

https://www.bilibili.com/video/BV1Bt41137iB?spm_id_from=333.999.0.0

P1  JDBC课程的目录结构介绍

 P2  对JDBC本质的理解

1、JDBC:Java DataBase Connecttivity(Java语言链接数据库)

2、JDBC本质:

  JDBC是SUN公司指定的一套接口(interface)

  接口都有调用者和实现者

  面向接口调用、面向接口写实现类,这都属于面向接口编程。

 

  为什么要面向接口编程:

    解耦合:降低程序的耦合度,提供程序的扩展力

    多态机制就是非常典型的:面向对象编程。(不要面向具体编程)  

    建议:

      Animal a=new Cat();

      Animal a=new Dog();

      喂养的方法:

      public void feed(Animal a){   //面向父类型编程。

        

      }

      不建议:

        Dog d=new Dog();

        Cat c=new Cat();

 

思考:为什么SUN指定一套JDBC接口:

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

  Oracle数据库有自己的原理。

  MySQL数据库有自己的原理。

  。。。

  每一个数据库产品都有自己独特的实现原理。

案例文件信息: 

SqlServer.java

 

复制代码
/*
    SqlServer的数据库厂家负责编写JDBC接口的实现类:
*/
public class SqlServer implements JDBC{
    public void getConnection(){
        //这段代码涉及到SqlServer底层数据库的实现原理。
        System.out.println("连接SqlServer数据库成功!");
    }
}
//实现类被称为驱动。(SqlServer驱动)
复制代码

 

Oracle.java

 

 

复制代码
/*
    Oracle的数据库厂家负责编写JDBC接口的实现类:
*/
public class Oracle implements JDBC{
    public void getConnection(){
        //这段代码涉及到Oracle底层数据库的实现原理。
        System.out.println("连接Oracle数据库成功!");
    }
}
//实现类被称为驱动。(Oracle驱动)
复制代码

 

MySQL.java

 

复制代码
/*
    MySQL的数据库厂家负责编写JDBC接口的实现类:
*/
public class MySQL implements JDBC{
    public void getConnection(){
        //这段代码涉及到mySQL底层数据库的实现原理。
        System.out.println("连接MySQL数据库成功!");
    }
}
//实现类被称为驱动。(mysql驱动)
复制代码

 

 

 

JDBC.java

 

复制代码
/*
    SUN公司负责指定这套JDBC接口。
*/
public interface JDBC{
    /*
        连接数据库的方法:
    */
    void getConnection();
}
复制代码

 

 

 

jdbc.properties

 

1
className=SqlServer

 

JavaProgrammer.java

 

 

复制代码
/*
    Java程序员角色:
    不需要关心具体是那个品牌的数据库,只需要面向JDB接口写代码。
    面向接口编程,面向抽象编程,不要面向具体编程。
*/
import java.util.*;
public class JavaProgrammer{
    public static void main(String[] args) throws Exception{
        //JDBC jdbc= new MySQL();
        //JDBC jdbc= new SqlServer();
        
        
        //创建对象可以通过反射机制
        ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
        String className=bundle.getString("className");
        Class c = Class.forName(className);
        
        JDBC jdbc=(JDBC)c.newInstance();
        
        //以下代码就是面向接口调用方法,不需要修改:
        jdbc.getConnection();
    }
}
复制代码

 

 

P3  编写程序模拟JDBC本质

  JDBC的本质是什么:一套接口

 

 P4  将驱动jar配置到环境变量classpath中

3.JDBC开发前的准备工作:

  先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。

 

 P5  JDBC编程六步的概述

 P6  注册驱动和获取链接

复制代码
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class JDBCTest01{
    public static void main(String[] args){
        try{
            //1、注册驱动:
            Driver driver=new com.mysql.jdbc.Driver();//多态,父类型引用指向子类型对象。
            DriverManager.registerDriver(driver);
            //2.获取链接:
            /*
                url:统一资源定位符(网络中某个资源的绝对路径)
                https://www.baidu.com/  这就是URL
                URL包括那几部分:
                    协议
                    IP
                    PORT
                    资源名
                
                http://182.61.200.7:80/index.html
                    http://通信协议
                    182.61.200.7服务器IP地址
                    80 服务器上软件的端口
                    index.html是服务器上某个资源名。
                    
                jdbc:mysql://127.0.0.1:3306/test
                    jdbc:mysql 协议
                    127.0.0.1 IP地址
                    3306 mysql数据库端口号
                    test具体的数据库实例名
                    
                说明:localhost和127.0.0.1都是本机IP地址。
                
                什么事通信协议,有什么用:
                    通信协议是通信之前就订好的数据传送格式。
                    数据包具体怎么传数据,格式提前订好的。
            */
            
            
            String url="jdbc:mysql://127.0.0.1:3306/test";
            String user="root";
            String password="root";
            Connection conn=DriverManager.getConnection(url,user,password);
            System.out.println("数据库链接对象="+conn);
        }catch(SQLException e){
            e.printStackTrace();
        }
        
    }
}
复制代码

 P8  执行删除与更新

复制代码
/*
    JDBC完成delete update
*/

import java.sql.*;
public class JDBCTest02{
    public static void main(String[] args){
        Connection conn=null;
        Statement stmt=null;
        try{
            //1.注册驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //2.获取链接
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
            //3.获取操作数据库的操作对象
            stmt=conn.createStatement();
            
            //4.执行SQL语句
            //String sql="delete from dept where deptno='40'";
            //JDBC中的sql语句不需要提供分号结尾
            String sql="update dept set dname='销售部',loc='天津' where deptno=20";
            int count=stmt.executeUpdate(sql);
            System.out.println(count==1?"删除成功":"删除失败");
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            //6.释放资源
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            
            if(conn!=null){
                try{
                    conn.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}
复制代码

 P9  类加载的方式注册驱动

 

复制代码
/*
    注册驱动的另一种方式(这种方式常用)
*/

import java.sql.*;
public class JDBCTest03{
    public static void main(String[] args){
        try{
            //1.注册驱动
            //这是注册驱动的第一种写法:
            //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            
            //注册驱动的第二种方式:常用的
            //为什么这种方式常用,因为参数是一个字符串,字符串可以写到xxx.properties文件中
            //以下方法不需要接受返回值,因为我们只想用他的类加载动作。

            Class.forName("com.mysql.jdbc.Driver");
            
            //2.获取链接
            Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
            System.out.println(conn);
        }catch(SQLException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}
复制代码

  P10   从属性资源文件中读取连接数据库信息

jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=root
复制代码
/*
    JDBC完成delete update
*/

import java.sql.*;
import java.util.*;
public class JDBCTest04{
    public static void main(String[] args){
        ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
        System.out.println("bundle001");
        System.out.println(bundle);
        System.out.println("bundle002");
        String driver=bundle.getString("driver");
        System.out.println(driver);
        
        String url=bundle.getString("url");
        String user=bundle.getString("user");
        String password=bundle.getString("password");
        
        Connection conn=null;
        Statement stmt=null;
        try{
            //1.注册驱动
            Class.forName(driver);
            //2.获取链接
            conn=DriverManager.getConnection(url,user,password);
            //3.获取操作数据库的操作对象
            stmt=conn.createStatement();
            
            //4.执行SQL语句
            //String sql="delete from dept where deptno='40'";
            //JDBC中的sql语句不需要提供分号结尾
            String sql="update dept set dname='销售部',loc='天津' where deptno=20";
            int count=stmt.executeUpdate(sql);
            System.out.println(count==1?"修改成功":"修改失败");
        
        
        
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //6.释放资源
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            
            if(conn!=null){
                try{
                    conn.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}
复制代码

 

  P11   处理查询结果集

复制代码
/*
    处理查询结果集:[遍历结果集]
*/

import java.sql.*;


public class JDBCTest05{
    public static void main(String[] args){
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        try{
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
            //3.获取数据库操作对象
            stmt=conn.createStatement();
            //4.执行sql
            //String sql="select empno,ename,sal from emp";
            String sql="select empno as a,ename,sal from emp";
            rs=stmt.executeQuery(sql); //专门执行DQL语句:
            //5.处理查询结果集:
            /*boolean flag1=rs.next();
            System.out.println(flag1);
            if(flag1){
                //光标指向的行有数据:
                //取数据:
                //getString() 方法的特点是:不管数据库中的数据类型是什么,都以String的形式取出。
                String empno=rs.getString(1);
                String ename=rs.getString(2);
                String sal=rs.getString(3);
                System.out.println(empno+","+ename+","+sal);
            }
            
            
            flag1=rs.next();
            System.out.println(flag1);
            if(flag1){
                //以下程序的1 2 3 说的是第几列:
                String empno=rs.getString(1);
                String ename=rs.getString(2);
                String sal=rs.getString(3);
                System.out.println(empno+","+ename+","+sal);
            }*/
            while(rs.next()){
                /*String empno=rs.getString(1);
                String ename=rs.getString(2);
                String sal=rs.getString(3);
                System.out.println(empno+","+ename+","+sal);    
*/                
                /*String empno=rs.getString("a");
                String ename=rs.getString("ename");
                String sal=rs.getString("sal");
                System.out.println(empno+","+ename+","+sal);
*/    
                int empno=rs.getInt("a");
                String ename=rs.getString("ename");
                double sal=rs.getDouble("sal");
                System.out.println(empno+","+ename+","+(sal+200));
                
            }
            
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //6.释放资源:
            if(rs!=null){
                try{
                    rs.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            
            if(stmt!=null){
                try{
                    stmt.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try{
                    conn.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }            
        }
    }
}
复制代码

 

posted @   生如逆旅,一苇以航  阅读(57)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
历史上的今天:
2020-05-07 Android Studio 3.5 plugin中找不到Flutter插件
点击右上角即可分享
微信分享提示