• JDBC概述


    概述

    • JDBC是什么?
      Java DataBase Connectivity(Java语言连接数据库)
    • JDBC的本质是什么?
      1、JDBC是SUN公司制定的一套接口(interface)
      java.sql.*;(这个软件包下有很多接口)
      2、接口都有调用者和实现者。面向接口调用、面向接口写实现类。这都属于面向接口编程。

    数据库驱动

    1、不同的数据库管理系统有不同的数据库驱动(MySQL、Oracle、SqlServer...)。
    2、所有的数据库驱动都是以jar包的形式存在,jar包当中有很多class文件,这些class文件就是对JDBC接口的实现。
    3、驱动不是SUN公司提供的,是各大数据库厂家负责提供,下载驱动jar包需要去数据库宫网下载。

    JDBC编程六步

    • 概述
      第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
      第二步:获取连接(表示JVM进程和数据库进程之间的通道打开了,属于进程之间的通信,(重量级的)便用完之后一定要关闭。
      第三步:获取数据库操作对象(专门执行sql语句的对象)
      第四步:执行SQL语句(DQL、DML...)
      第五步:处理查询结果集。(只有当第四步执行的是select语句的时候,才有这一步)
      第六步:释放资源。(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。)
    • 关于六个步骤的一些方法
      1、static void registerDriver(Driver driver)(java.sql.Driver)
      注册与给定的驱动程序DriverManager 。
      2、static Connection getConnection(String url, String user, String password)(java.sql.DriverManager)
      尝试建立与给定数据库URL的连接。
    • 关于URL
      1、URL:统一资源定位符(网络中某个资源的绝对路径)
      https://www.baidu.com/这就是URL
      2、URL包括哪几部分?
      通信协议、IP、PORT、资源名
      3、例子:
      http://14.215.177.39/index.html
      http://:通信协议
      182.61.200.7:服务器IP地址
      80:服务器上软件的端口
      index.html:是服务器上某个资源名
      4、解释jdbc:mysql://localhost:3306/powernode
      jdbc:mysql://:协议
      127.0.0.1:IP地址
      3306:MySQL数据库端口号
      powernode:具体的数据库实例名。
      说明:localhost和127.0.0.1都是本机IP地址。
      3、Statement createStatement()(java.sql.Connection)
      创建一个Statement对象,用于将SQL语句发送到数据库。
      4、int executeUpdate(String sql)(java.sql.Statement)
      执行给定的SQL语句,这可能是 INSERT,UPDATE,或DELETE语句(DML语句),或者不返回任何内容。返回值是"影响数据库中的记录条数"。

    代码示例

    package JDBCTest;
    
    import java.sql.*;
    
    public class Test {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try{
                /*第一步:注册驱动*/
                Driver driver = new com.mysql.cj.jdbc.Driver();
                DriverManager.registerDriver(driver);
                /*第二步:获取连接*/
                String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
                String user = "root";
                String password = "数据库密码";
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接对象 = "+conn);
                /*第三步:获取数据库操作对象*/
                stmt = conn.createStatement();
                /*第四步:执行SQL语句*/
                //JDBC的SQL语句不需要写分号
                String sql = "insert into dept(deptno,dname,loc) values(50,'人事部', '成都')";
                int count = stmt.executeUpdate(sql);
                System.out.println(count==1 ? "保存成功" : "保存失败");
                /*第五步:处理查询结果集*/
    
            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                /*第六步:释放资源*/
                /*为了保证资源一定释放,
                在finally语句块中关闭资源
                并且要遵循从小到大依次关闭。*/
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    JDBC执行删除与更新

    JDBC执行删除

    在这里插入图片描述

    package JDBCTest;
    
    import java.sql.*;
    
    public class Test {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try{
                /*第一步:注册驱动*/
                Driver driver = new com.mysql.cj.jdbc.Driver();
                DriverManager.registerDriver(driver);
                /*第二步:获取连接*/
                String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
                String user = "root";
                String password = "密码";
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接对象 = "+conn);
                /*第三步:获取数据库操作对象*/
                stmt = conn.createStatement();
                /*第四步:执行SQL语句*/
                String sql = "delete from dept where deptno = 60";
                int count = stmt.executeUpdate(sql);
                System.out.println(count==1 ? "删除成功" : "删除失败");
                /*第五步:处理查询结果集*/
    
            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                /*第六步:释放资源*/
                /*为了保证资源一定释放,
                在finally语句块中关闭资源
                并且要遵循从小到大依次关闭。*/
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    JDBC执行更新

    在这里插入图片描述

    package JDBCTest;
    
    import java.sql.*;
    
    public class Test {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try{
                /*第一步:注册驱动*/
                Driver driver = new com.mysql.cj.jdbc.Driver();
                DriverManager.registerDriver(driver);
                /*第二步:获取连接*/
                String url= "jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC";
                String user = "root";
                String password = "密码";
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接对象 = "+conn);
                /*第三步:获取数据库操作对象*/
                stmt = conn.createStatement();
                /*第四步:执行SQL语句*/
                String sql = "update dept set dname = '项目部' where deptno = 50";
                int count = stmt.executeUpdate(sql);
                System.out.println(count==1 ? "更新成功" : "更新失败");
                /*第五步:处理查询结果集*/
    
            }catch (SQLException e){
                e.printStackTrace();
            }finally {
                /*第六步:释放资源*/
                /*为了保证资源一定释放,
                在finally语句块中关闭资源
                并且要遵循从小到大依次关闭。*/
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    注册驱动的另外一种方式(最常用)

    • 利用反射机制
      1、利用反射机制来加载Driver类,利用类中的静态代码块实现对驱动的注册。
      2、com.mysql.cj.jdbc包下的Driver方法中有这样一个静态代码块:
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
       }
    

    3、原来的注册驱动方法:

    DriverManager.registerDriver(
    new com.mysql.cj.jdbc.Driver());
    

    4、利用反射机制的方法:

    Class.forName("com.mysql.cj.jdbc.Driver");
    
    • 为什么这种方式常用?
      1、因为参数是一个字符串,字符串可以写到xxx.properties文件中。
      2、该方法不需要接收返回值,因为我们只想用它的类加载动作。

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

    1、properties文件:

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/powernode?serverTimezone=UTC
    user=root
    password=密码
    

    2、

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ResourceBundle;
    
    public class Demo {
        public static void main(String[] args) {
            /*使用资源绑定器绑定属性配置文件*/
            ResourceBundle bundle = ResourceBundle.getBundle("jdbc.info");
            String driver = bundle.getString("driver");
            String url = bundle.getString("url");
            String user = bundle.getString("user");
            String password = bundle.getString("password");
    
            Connection conn = null;
            Statement stmt = null;
            try{
                /*第一步:注册驱动*/
                Class.forName(driver);
                /*第二步:获取连接*/
                conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接对象 = "+conn);
                /*第三步:获取数据库操作对象*/
                stmt = conn.createStatement();
                /*第四步:执行SQL语句*/
                String sql = "insert into dept values(60,'人事部','广州')";
                int count = stmt.executeUpdate(sql);
                System.out.println(count==1 ? "添加成功" : "添加失败");
                /*第五步:处理查询结果集*/
    
            }catch (SQLException | ClassNotFoundException e){
                e.printStackTrace();
            }finally {
                /*第六步:释放资源*/
                /*为了保证资源一定释放,
                在finally语句块中关闭资源
                并且要遵循从小到大依次关闭。*/
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
    
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    处理查询结果集

    相关方法

    1、ResultSet executeQuery(String sql)
    执行给定的SQL语句,该语句返回单个ResultSet对象。其中SQL语句通常为静态SQL的SELECT语句。
    2、boolean next()
    将光标从当前位置向前移动一行。ResultSet光标最初位于第一行之前; 第一次调用方法next使第一行成为当前行; 第二个调用使第二行成为当前行,依此类推。
    3、
    a)int getInt(int columnIndex)/(String columnLabel)
    b)String getString(int columnIndex)/(String columnLabel)
    c)double getDouble(int columnIndex)/(String columnLabel)
    这个检索的当前行中指定列的值ResultSet对象分别为int、String、double的Java编程语言。

    代码示例

    配置文件不变

    package jdbc;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class Test {
        public static void main(String[] args) {
            /*使用资源绑定器绑定属性配置文件*/
            ResourceBundle bundle = ResourceBundle.getBundle("jdbc.info");
            String driver = bundle.getString("driver");
            String url = bundle.getString("url");
            String user = bundle.getString("user");
            String password = bundle.getString("password");
    
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            try{
                /*第一步:注册驱动*/
                Class.forName(driver);
                /*第二步:获取连接*/
                conn = DriverManager.getConnection(url, user, password);
                /*第三步:获取数据库操作对象*/
                stmt = conn.createStatement();
                /*第四步:执行SQL语句*/
                String sql = "select empno,ename,sal from emp";
                rs = stmt.executeQuery(sql);
                /*第五步:处理查询结果集*/
                while (rs.next()){
                    //JDBC所有的下标从1开始
                    int empno = rs.getInt(1);
                    /*也可以用(查询结果集的)列名称来获取*/
                    String ename = rs.getString("ename");
                    double sal = rs.getDouble(3);
                    System.out.println(empno+","+ename+","+sal);
                }
            }catch (SQLException | ClassNotFoundException e){
                e.printStackTrace();
            }finally {
                /*第六步:释放资源*/
                /*为了保证资源一定释放,
                在finally语句块中关闭资源
                并且要遵循从小到大依次关闭。*/
                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();
                    }
                }
    
            }
        }
    }
    

    在这里插入图片描述

  • 相关阅读:
    架构设计流程:评估和选择备选方案
    架构设计流程:设计备选方案
    架构设计三原则
    迭代器模式(电视机遥控器)
    外观模式
    5.组合模式
    完成动物识别,自行拍摄动物图片进行上传并查看结果
    4.桥接模式 (毛笔和颜色)
    企业沟通机制
    完成植物识别,自行拍摄植物图片进行上传并查看结果
  • 原文地址:https://www.cnblogs.com/yu011/p/13377725.html
Copyright © 2020-2023  润新知