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();
                }
            }

        }
    }
}

在这里插入图片描述

原文地址:https://www.cnblogs.com/yu011/p/13377725.html