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

 

posted @ 2018-08-19 22:17  Zero_Yi  阅读(238)  评论(0编辑  收藏  举报