zoukankan      html  css  js  c++  java
  • JDBC连接数据库

    JDBC连接数据库

    事前准备:导入mysql-connector

    菜单栏window选项 -> Properties -> 搜索:“java builder path” -> 顶部选择 libraries -> add jars -> 选择jar包路径

    注意:在web项目中,如需使用到该jar包,需将jar包放在webroot目录下,否则将出现ClassNotFound异常

    1、加载Mysql驱动

    Class.forname("com.mysql.jdbc.Driver") ;

    2、建立mysql连接

    // 连接地址
    String url = "jdbc:mysql://localhost:port/database";
    String dbUser = "user";
    String dbPwd = "pwd";
    //建立并获取连接
    Connection conn = DriverManager.getConnection(url, dbUser, dbPwd);

    3、获取执行sql的类(语柄)

    Statement stat = (Statement) conn.createStatement();

    4、执行查询,返回结果集

    // 执行查询,返回结果集
    String sql = "SELECT * FROM TABLE";
    ResultSet res = stat.executeQuery(sql);
    // 执行增、删、改,返回影响行数
    String sql2 = "INSERT / UPDATE / DELETE ...";
    stat.executeUpdate(sql);

    5、关闭连接

    if (res != null) {
        res.close();  
    }
    if (stat != null) {
        stat.close();
    }
    if (conn != null) {
        conn.close();  
    }

    三者必须按顺序关闭!!!否则将后面的关闭后,前面的元素由于无法被获取,所以将不能被关闭。

    6、sql注入及防范

    假如有这么一个登录系统,其登录界面将 userName 和 passWord 以字符串的形式传入loginCheckServlet,该Servlet获取userName和passWord后,将其通过字符串拼接查询语句,最后通过是否能查找到查询结果来判断是否登录成功:

    登录界面

    <form action="./loginCheck">
        <input tyep="text" name="userName" id="userName" required>
        <input tyep="password" name="passWord" id="passWord" required>
        <button type="submit">登录</button>
    </form>

    Servlet部分

    // 获取request数据
    String userName = req.getParameter("userName");
    String passWord = req.getParameter("passWord");
    // 拼接sql查询语句
    String sql = "SELECT 1 FROM USER WHERE NAME='" + userName + "' AND PWD='" + passWord + "' ";

    看似简单,完美地将用户名和密码拼接到了查询语句中,逻辑上毫无问题。

    但是,假如我们不走正常的套路,而是透过你的sql语句来输入用户名和密码:

    userName = xxx' OR 1=1 OR ';

    passWord = xxx;

    这样我们便拼接到了这么一条查询语句:SELECT 1 FROM USER WHERE NAME='xxx' OR 1=1 OR '' AND PWD='xxx';

    在这么一种情况下,用户名和密码的内容变得毫无意义,一切被中间的 OR 1 = 1 这一条语句完全破解,变成了一条百分之百可以查询到结果的语句。

    解决办法有很多,例如在输入框中各种正则匹配,各种去空格限制关键字,又或在Servlet中队获取的参数值进行过滤。

    在这里有另外一个针对sql语句拼接的解决方案:动态参数绑定PreparedStatement。

    PreparedStaement

    创建

    //写sql,将所有要传入的值用“?”代替
    String sql = "SELECT 1 FROM USER WHERE USERNAME=? AND PWD=?";
    //传入sql并创建PreparedStatement
    PreparedStatement stat = conn.prepareStatement(sql);

    动态绑定参数

    //参数装载
    stat.setString(userName);
    stat.setString(userPwd);

    执行sql

    // 查询
    stat.executeQuery();
    // 更新
    stat.executeUpdate();
  • 相关阅读:
    小程序全局生命周期( 仅供了解 )
    iview表格render小案例2
    iview中表格根据条件渲染
    如何实现页面同时在移动端和pc端的兼容问题
    小程序页面中的生命周期( 仅供了解 )
    弹性盒基本属性
    elementUI实现分页效果+模糊搜索效果
    事件流 ---- 事件冒泡与事件捕获
    React生命周期
    数据库索引数据结构btree,b-tree和b+tree树
  • 原文地址:https://www.cnblogs.com/JuanF/p/9502969.html
Copyright © 2011-2022 走看看