JDBC快速入门-DriverManager、Statement、ResultSet、PreparedStatement类详解及实例

JDBC

Java Database Connectivity;
Java 语言操作数据库,本质是一套操作所有关系型数据库的规则,即接口;
JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供

快速入门

1、导入驱动jar 包
从官方下载mysql-connector-java-8.0.22文件夹,将其中的文件:mysql-connector-java-8.0.22.jar导入,方法是
在这里插入图片描述

2、注册驱动(告诉驱动该使用哪个驱动jar包,在mysql5版本后已经自动注册驱动,可以省略此步骤)
Class.forName(“com.mysql.jdbc.Driver”);
3、获取数据库的连接对象connection
4、定义sql
5、获取执行sql语句的对象statement
6、执行sql,接收返回结果
7、处理结果
8、释放资源

JDBC各个类详解

在这里插入图片描述

DriverManager:驱动管理对象

1、注册驱动(告诉程序该使用哪个驱动jar包)
2、获取数据库连接
static Connection getConnection​(String url)
尝试建立与给定数据库URL的连接。
static Connection getConnection​(String url, String user, String password)
尝试建立与给定数据库URL的连接。
static Connection getConnection​(String url, Properties info)
尝试建立与给定数据库URL的连接
参数:URL:指定连接的路径;不同的数据库有些差异;
mysql的语法是:
jdbc:mysql://ip地址(域名):端口号/数据库名称
如果连接的是本机,同时端口号是默认的3306,就可以省略“ip地址(域名):端口号”

Connection:数据库连接对象

1、功能:获取执行sql的对象
Statement createStatement​()
创建一个 Statement对象,用于将SQL语句发送到数据库。

PreparedStatement prepareStatement​(String sql)
创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
2、管理事务:
*开启事务:void setAutoCommit​(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。调用该方法参数为false,即开启事务;
*提交事务:void commit​()
使上次提交/回滚之后所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。
*回滚事务:void rollback​()
撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。

Statement:执行sql的对象

用于执行静态SQL语句并返回其生成的结果的对象。
1、执行sql
boolean execute​(String sql)
执行给定的SQL语句,这可能会返回多个结果。执行任意的sql
int executeUpdate​(String sql) 执行增、删、改
执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE声明,或者不返回任何内容,如SQL DDL语句的SQL语句。返回影响的行数
ResultSet executeQuery​(String sql) 执行查询语句
执行给定的SQL语句,返回一个 ResultSet对象。

附上代码实例:

public class JDBCDemo {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接对象
            conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
           //conn = JDBCUtils.getConnection("jdbc:mysql:///db3", "root", "root");
            //3.定义sql
            String sql  = "delete from account where id = 3";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql
            int count = stmt.executeUpdate(sql);
            //6.处理结果
            System.out.println(count);
            if(count > 0){
                System.out.println("删除成功!");
            }else{
                System.out.println("删除失败");
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源

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

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

ResultSet:结果集对象

封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
方法:1、boolean next()
1)游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
数据类型
2、getXxx()
1)通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是int,从 1 开始。返回不同的类型

释放资源按照资源打开的反向顺序,使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection

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:///db1", "root", "password");
            //3.定义sql
            String sql  = "select * from tab_category";
            //4.获取执行sql对象
            stmt = conn.createStatement();
            //5.执行sql

            rs = stmt.executeQuery(sql);
            //6.处理结果,用遍历的方法获取这个表的所有数据
          
            while(rs.next()){ // 让游标向下移动一行
                //获取数据
                int id = rs.getInt(1);
                String name = rs.getString("cname");
                boolean gender = rs.getBoolean("gender"); 
                Date birthday = rs.getDate("birthday");

                System.out.println(id + "---" + name + "---" + gender "---" + birthday  );
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //7.释放资源

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

}

PreparedStatement:执行带参数的预编译的SQL语句对象

SQL注入问题:我们让用户输入的密码和 SQL 语句进行字符串拼接。用户输入的内容作为了 SQL 语句语法的一部分,改变了 原有 SQL 真正的意义。要解决 SQL 注入就不能让用户输入的密码和我们的 SQL 语句进 行简单的字符串拼接。
PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。它是一个预编译的 SQL 语句。

  1. 因为有预先编译的功能,提高 SQL 的执行效率。
  2. 可以有效的防止 SQL 注入的问题,安全性更高。

猜你喜欢

转载自blog.csdn.net/weixin_52723971/article/details/112403790
今日推荐