JDBC基础


1、使用JDBC连接数据库的步骤

  1. 注册驱动
  2. 获取连接
  3. 获取传输器
  4. 执行sql,返回结果
  5. 数据处理
  6. 关闭连接

2、示例

1.1、使用Statement进行查询操作

public class JDBC_01 {
    public static void main(String[] args) {
        String jdbc = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
        String user = "root";
        String password = "00000000";
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            Connection conn = DriverManager.getConnection(url, user, password);
            //3、获取传输器
            Statement st = conn.createStatement();
            //4、执行sql(查询所有数据),返回结果
            ResultSet rs = st.executeQuery("select * from user");
            //5、数据处理
            while (rs.next()) {
                int id = rs.getInt("id");
                String number = rs.getString("number");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                int chi = rs.getInt("chi");
                int math = rs.getInt("math");
                int eng = rs.getInt("eng");
                System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
            }
            //6、关闭连接
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

1.2、使用Statement进行更新操作

public class JDBC_01 {
    public static void main(String[] args) {
        String jdbc = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
        String user = "root";
        String password = "00000000";
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            Connection conn = DriverManager.getConnection(url, user, password);
            //3、获取传输器
            Statement st = conn.createStatement();
            //4、执行sql,返回结果
            ResultSet rs = st.executeQuery("select * from user");
            //5、数据处理
            while (rs.next()) {
                int id = rs.getInt("id");
                String number = rs.getString("number");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                int chi = rs.getInt("chi");
                int math = rs.getInt("math");
                int eng = rs.getInt("eng");
                System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
            }
            //6、关闭连接
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

1.3、使用PreparedStatement进行查询操作

public class JDBC_03 {
    public static void main(String[] args) {
        String jdbc = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
        String user = "root";
        String password = "00000000";
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            Connection conn = DriverManager.getConnection(url, user, password);
            //3、获取传输器
            PreparedStatement ps = conn.prepareStatement("select * from user");
            //4、执行sql,返回结果
            ResultSet rs = ps.executeQuery();
            //5、数据处理
            while (rs.next()) {
                int id = rs.getInt("id");
                String number = rs.getString("number");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                int chi = rs.getInt("chi");
                int math = rs.getInt("math");
                int eng = rs.getInt("eng");
                System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng);
            }
            //6、关闭连接
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

1.4、使用PreparedStatement进行更新操作

public class JDBC_04 {
    public static void main(String[] args) {
        String jdbc = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
        String user = "root";
        String password = "00000000";
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            Connection conn = DriverManager.getConnection(url, user, password);
            //3、获取传输器
            PreparedStatement ps = conn.prepareStatement("insert into user values(?, ?, ?, ?, ?, ?, ?)");
            //4、执行sql,返回结果
            ps.setInt(1, 22);
            ps.setString(2, "220");
            ps.setString(3, "叶良辰");
            ps.setInt(4, 100);
            ps.setInt(5, 100);
            ps.setInt(6, 100);
            ps.setInt(7, 100);
            int i = ps.executeUpdate();
            //5、数据处理
            System.out.println(i);
            //6、关闭连接
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

3、步骤详解

3.1、加载驱动

3.1.1、Driver接口

  • java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口,这个接口是提 供给数据库厂商使用的,不同数据库厂商提供不同的实现
  • 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现

3.1.2、mysql的驱动

  • mysql8之前

    com.mysql.jdbc.Driver
    
  • mysql8之后

    com.mysql.cj.jdbc.Driver
    

3.1.3、加载与注册JDBC驱动

  • 调用Class类的静态方法forName()

    Class.forName(“com.mysql.cj.jdbc.Driver”);
    
  • 驱动程序管理器类的 registerDriver() 方法

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

3.2、建立连接

  • 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接

    DriverManager.getConnection(url, user, password);
    
  • getConnection() 方法需要三个参数url、user、password

  • user、password是当前连接的数据库管理程序的用户名和密码

  • JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的 驱动程序,从而建立到数据库的连接

  • JDBC URL的标准由三部分组成,各部分间用冒号分隔

    • jdbc:子协议:子名称

    • 协议:JDBC URL中的协议总是jdbc

    • 一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名

image

3.3、获取传输器

3.3.1、主要接口

  • Statement
  • PreparedStatement
  • CallableStatement

3.3.2、使用Statement

3.3.2.1、获取Statement

connection.createStatement();

3.3.2.1、使用Statement的弊端

sql注入攻击:

SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user=’a’ OR 1 = ‘ AND password =’ OR ‘1’ = ‘1’) ,从而利用系统的 SQL 引擎完成恶意行为的做法

因为Statement传输的sql语句是用+进行拼接处理的,所以有此漏洞

解决方法:

使用PreparedStatement,参数用?代替可以防止sql注入

3.3.3、使用PreparedStatement

3.3.3.1、获取PreparedStatement

connection.prepareStatement("//sql语句");

3.3.3.2、PreparedStatement的特点

  • PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

    语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行

  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

  • 防止SQL注入

3.4、释放资源

  • 释放ResultSet、Statement、Connection、PreparedStatement

  • 数据库连接(Connection)是非常稀有的资源,用完后必须马上释放, 如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放

  • 最晚获取的最先关闭

    关闭顺序:ResultSet——>Statement(PreparedStatement)——>Connection

3.5、ResultSet

ResultSet rs = preparedstatement.executeQuery();
 ResultSet rs = statement.executeQuery("//sql语句");
  • 只有返回结果的sql语句才会使用execute创建ResultSet对象

  • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现

  • ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行

  • 关于ResultSet

    • 代表结果集,封装了使用 JDBC 进行查询的结果
    • ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面
  • 可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于 Iterator 对象的 hasNext() 和 next() 方法的结合体

  • 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一 列的值

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270755.html

(0)
上一篇 2022年6月30日 00:37
下一篇 2022年6月30日 00:41

相关推荐

发表回复

登录后才能评论