什么是JDBC?这篇文章告诉你

        JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。 它是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够通过执行SQL语句来完成对数据库中数据的查询、更新和删除等操作。

        

        应用程序使用JDBC访问数据库的方式如下图所示:

        从上图可以看出,应用程序使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。由于不同数据库厂商提供的数据库驱动不同,因此,为了使应用程序与数据库真正建立连接,JDBC不仅需要提供访问数据库的API,还需要封装与各种数据库服务器通信的细节,不同厂商的数据库都有相应的实现。

        下面通过一张图来描述JDBC的具体实现细节,如下图:

从上图中可以看出,JDBC的实现包括三部分。

        (1)JDBC驱动管理器:负责注册特定的JDBC驱动器,主要通过java.sql.DriverManager类实现;

        (2)JDBC驱动器API:由Sun公司负责制定,其中最主要的接口是java.sql.Driver接口;

        (3)JDBC驱动器:它是一种数据库驱动,由数据库厂商创建,也称为JDBC驱动程序,负责与特定的数据库连接,以及处理通信细节。

        

JDBC编程步骤 

        各种不同厂商的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。

1、注册驱动

        在编写代码前,你需要安装MySQL第三方类库,mysql-connector-java-8.0.29-bin.jar包可以在网上下载,或者在MySQL的安装目录下找到。

    try {
        Driver driver = new com.mysql.cj.jdbc.Driver();
        DriverManager.registerDriver(driver);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }

        以下是com.mysql.cj.jdbc.Driver类的源代码

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

        加载驱动程序也可以通过Class.forName方法,该方法将这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。 

    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }

2、建立连接

    String url = "jdbc:mysql://localhost:3306/jdbc"; // 数据库URL
    String user = "root"; // 数据库用户名
    String password = "123456"; // 数据库密码
    Connection conn = null;
    try {
        conn= = DriverManager.getConnection(url, user, password);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }

3、获取数据库操作对象(预编译对象)

        获取数据库操作对象,实现数据库插入操作

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);

            stmt = conn.createStatement();
            String sql= "insert into user(id, name, gender, age) values(2, '张三', '男', 18)"; 
            
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

       获取数据库操作对象,实现数据库更新操作

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);

            stmt = conn.createStatement();
            String sql = "update user set name = '张三' where age = 20"; // 修改SQL语句
            
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

        获取数据库操作对象,并实现数据库删除操作

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);

            stmt = conn.createStatement();
            String sql = "delete from user where name = '张三'"; // 删除SQL语句
            
            stmt.executeUpdate(sql);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

        获取数据库预编译对象,实现数据库插入操作

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        PreparedStatement pre = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);
            String sql = "insert into user(id, name, gender, age) values (?, ?, ?, ?)";

            pre = conn.prepareStatement(sql);
            pre.setInt(1,1);
            pre.setString(2,"张三");
            pre.setString(3,"男");
            pre.setInt(4,18);

            pre.executeUpdate();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

4、处理查询结果集

        获取数据库操作对象,实现数据库查询操作,并打印结果集

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);

            stmt = conn.createStatement();
            String select = "select * from user where name = '张三'";
            rs = stmt.executeQuery(select);
            while (rs.next()) {
                System.out.println(rs.getString("id") + "," + rs.getString("name")
                + "," + rs.getString("gender") + "," + rs.getString("age"));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

        获取数据库预编译对象,实现数据库查询操作,并打印结果集

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc"; //定义数据库的
        String user = "root";
        String password = "123456";
        Connection conn = null;
        PreparedStatement pre = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);
            String sql = "select * from user where name = ?";

            pre = conn.prepareStatement(sql);
            pre.setString(1,"藏三");

            rs = pre.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("id") + "," + rs.getString("name")
                + "," + rs.getString("gender") + "," + rs.getString("age"));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

5、释放资源

    try {
        if (rs != null) {
            rs.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        if (statement != null) {
            statement.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    try {
        if (conn != null) {
            conn.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

        

Statement和PreparedStatement的异同及优缺点


相同点:两者都是用来执SQL语句的

不同点:PreparedStatement需要根据SQL语句来创建,它能够通过设置参数,指定相应的值,不是像Statement那样使用字符串拼接的方式。

PreparedStatement的优点

        1、其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。

        2、其具有预编译机制,性能比statement更快。

        3、其能够有效防止SQL注入攻击。

execute和executeUpdate的区别


相同点:二者都能够执行增加、删除、修改等操作。

不同点:1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句; 2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

        

关于JDBC基础介绍就到这里啦,欢迎大家在评论区讨论。

猜你喜欢

转载自blog.csdn.net/qq_43500084/article/details/127678124