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