zoukankan      html  css  js  c++  java
  • 详解JDBC对象

    1. DriverManager

      (1) 注册驱动

        Class.forName("com.mysql.cj.jdbc.Driver");

        

        真正注册驱动的是驱动包下 jdbc 文件夹中 Driver 类的 "DriverManager.registerDriver(Driver driver)"方法。

        告诉程序使用哪个数据库驱动 jar 包。

        注意:MySQL 5及以后的注册驱动的语句可以不用写的,因为驱动 jar 包的 META-INF -- services -- java.sql.Driver 文件中记录着加载驱动的位置和文件。如果没有手动注册,则会自动读取这个文件然后注册驱动。建议还是手动注册比较稳妥。

        

      (2) 获取数据库链接

        public static Connection getConnection(String url,String user,String password)

        尝试建立与给定数据库URL连接,不同的数据库有不同的URL语句。

        "jdbc:mysql://IP地址:端口/数据库"    // MySQL数据库URL
        "jdbc:oracle:thin:@//IP地址:端口/数据库"  // Oracle数据库URL
        "jdbc:sqlserver://IP地址:端口;DatabaseName=数据库" // SQL Server数据库URL

         如果MySQL使用本地数据库和默认端口,则可以使用简写 "jdbc:mysql:///数据库"。

     

    2. Connection

      (1) 获取执行sql的对象

        createStatement() 
        prepareStatement(String sql) 

      (2) 管理事务

        setAutoCommit(boolean autoCommit) // 设值为false开启事务
        commit() // 提交事务
        rollback() // 回滚事务

     

    3. Statement

      (1) int executeUpdate(String sql)

        执行DML语句增删改表和DDL语句操作数据库,返回影响行数,判断DML语句执行是否成功。

      (2) ResultSet executeQuery(String sql)

        执行DQL语句查询表中数据,返回查询结果集。

      (3) boolean execute(String sql)

        可以执行任意SQL语句,但不常用。

      注意:Statement对象因为安全性和效率问题,几乎很少用到,都由PreparedStatement替代。

     

    4. ResultSet

      这是结果集对象,封装了查询结果。要做的就是将结果集中的数据取出来。

      这里面有一个抽象的东西,叫游标。就像数组中的下标一样,游标从一开始指向的是结果集的列名一行,不指向任何一行数据。通过方法,可以移动游标,指向数据读取数据。

      (1) boolean next()

        这个方法可以使游标向下移动一行,返回一个布尔类型数据,告诉这行是否有数据,也就是是否移动到最后一行末尾(移动到表外面了)。如果移出去了,就返回false,如果没移出去就返回true。

      (2) get数据类型(参数)

        例如:int getInt(int columnIndex)     String getString(int columnIndex)

        注意:参数有两种:

        1) int:代表列的编号,从最左边的第一列开始为1。

          例如:getInt(1) 

        2) String:代表列的名称,这样更精确更直观一些,用的比较多。

          例如:getString("name")

      示例:

    import java.sql.*;
    
    public class JDBCSelect {
        public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/" +
                        "db?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false",
                        "root","saqwedcxz");
                String sql = "SELECT * FROM user";
                stmt = conn.createStatement();
                rs = stmt.executeQuery(sql);
                while(rs.next()) {
                    int id = rs.getInt(1);
                    String name = rs.getString("name");
                    int age = rs.getInt(3);
                    System.out.println(id + " - " + name + " - " + age);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } 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. PreparedStatement

      (1) 问题

        常规的传值登陆,通过简单的字符串拼接,就可能有一些SQL的关键字参与字符串的拼接,将SQL语句改变,就会导致非法访问,这又称为"SQL注入"漏洞。

        最经典的SQL注入字符串:a' or 'a' = 'a

      (2) 解决

        使用预编译SQL的 PreparedStatement 对象解决问题。

        预编译SQL的参数使用"?"作为占位符,之后为占位符赋值便可。虽然使用起来比较麻烦,但是安全性大大提升了。解决了SQL注入问题。

      (3) 使用

        1) 在定义SQL语句的时候,将参数用 "?" 代替。

          例如:"SELECT * FROM user WHERE id = ?";

        2) 获取执行SQL语句对象,需要使用 prepareStatement(String sql) 方法

          例如:conn.prepareStatement(sql);

        3) 给 "?" 赋值,使用 set数据类型(第几个占位符,值) 方法

          例如:pstmt.setInt(1,1);

        4) 执行SQL语句时,因为已经给 PreparedStatement 预编译,就无需再传SQL。

          例如:pstmt.executeQuery();

      (4) 注意

        在绝大多数时间都会使用PreparedStatement完成DML和DQL操作。一是可以防止SQL注入;二是执行的效率更高。

      示例

            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
                conn = JDBCUtils.getConnection();
                String sql = "SELECT * FROM user WHERE id = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1,1);
                rs = pstmt.executeQuery();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.close(rs, pstmt, conn);
            }
  • 相关阅读:
    支付宝17年新春红包技术体系剖析
    从“扫月亮”到“扫福字”,扒一扒背后的支付宝AR框架体系
    【合集】支付宝春节红包背后的那些事——集五福,咻红包
    蚂蚁移动开发平台 mPaaS 3.0 智能化 + 生态化
    小程序 Serverless: 解放生产力,驱动研发效能提升
    深度解析:mPaaS 3.0全新组件
    vue--学习一
    .Net Mvc PagedList
    Integrated Security=SSPI
    IIS web site windows验证
  • 原文地址:https://www.cnblogs.com/NyanKoSenSei/p/11524937.html
Copyright © 2011-2022 走看看