java JDBC

JDBC【Java DataBase Connectivity】java数据库连接接口;

  • 面向接口编程:

    1. 注册驱动
    2. 获取连接
    3. 定义sql语句;
    4. 获取执行sql对象;
    5. 执行sql
    6. 处理返回结果;
    7. 释放资源;
  • JDBC API【面向接口编程】:

    • DriverManager:

      • 注册驱动【registerDriver】;
      • 获取数据库连接【getConnection】;
        • 语法:jdbc:mysql://ip【本机:localhost,127.0.0.1】:端口/数据库?键值对
        • 获取返回对象Connection对象;
    • Connection

      • 获取执行SQL的对象Statement:
        • creatStatement():普通执行sql对象;
        • prepareStatemen():预编译sql的执行sql对象,防止sql注入;
        • prepareCall():执行存储过程的对象;
      • 管理事务;
        • setAutoCommit():开启事务;
        • commit():
        • rollback():
    • Statement

      • 执行SQL语句:
        • int executeUpdate(sql);
        • ResultSet executeQuery(slq);
    • ResultSet:

      • 执行查询语句的返回结果;
      • boolean next();
      • getXxx();
    • PrepareStatement

      • extends statement,为了预编译sql的执行sql对象,防止sql注入;

      • sql注入:通过操作输入修改事先定义好的SQL语句,以达到执行代码来对服务器进行攻击;

      • 如何防止:以前是字符串的拼接,现在在字符串拼接的基础上,在敏感字符上加斜杠转义字符,防止歧义

        -- and 关键词比 or先执行,false or true, 任然是true,所以会返回所有数据;
        SELECT * FROM t1 
        	WHERE ename = 'dfkvbk' AND pwd = '' OR '1' = '1';
        -- 核心是字符串的拼接,造成sql语句歧义;
        
      • 获取PrepareStatemen对象:

        String sql = "select * from t1 where username = ? and password = ?";
        //使用占位符?代替
        PrepareStatement ps = cnn.prepareStatemen(sql);
        ps.setXxx(参数1,参数2); // Xxx数据类型,参数1:序号从1开始,参数2:值;
        ps.exexutUpdate();
        ps.executeQuery(); // 不需要传递sql语句
        //开启预编译,加入到url中:
        useServerPrepStmts = true;
        
      • sql语句执行流程:

        • 检查语法 + 编译sql + 执行sql:前两者更耗时;
        • PreparedStatement对象在获取时就传入sql语句,传递给mysql,执行语法检查+编译sql,效率更高;
  • 数据库连接池:

    • 连接池就是一个容器,负责分配,管理数据库连接;

    • 标准接口:DataSource

      获取连接:getConnection();

    eg:Druid,

posted @ 2025-03-09 10:12  烟雨断桥  阅读(10)  评论(0)    收藏  举报