使用PreperedStatement预编译对象防止sql注入简单代码

来源:互联网 发布:程序员图片 编辑:程序博客网 时间:2024/06/05 09:22
package com.fwd.login;import java.sql.Connection;import java.sql.PreparedStatement;//注意导包是sql下的包import java.sql.ResultSet;import com.fwd.utils.MyJDBCUtils;public class Login {/** * @author fwd * 2016年12月21日23:09:02 * 使用预编译对象防止sql注入 * 1,什么是sql注入,当执行sql语句时,把拼接的参数加入到sql语句中去执行, * 而不是作为整个参数去执行, *  * (1)使用PreparedStatement预编译对象防止sql注入(2)创建PreparedStatement对象 prepareStatement(String sql) (3)PreparedStatement接口的父接口Statement(4)什么是预编译(5)步骤:第一步,加载驱动,创建数据库的连接第二步,编写sql第三步,需要对sql进行预编译第四步,向sql里面设置参数第五步,执行sql第六步,释放资源  * @throws Exception  */public static void main(String[] args) throws Exception {login("lucy","123");}//简单模拟登陆操作public static void login(String username , String password) throws Exception{Connection conn = null; PreparedStatement psmt = null;ResultSet rs = null;try {//1,使用工具类得到数据库的连接conn = MyJDBCUtils.getConnection();//编写sql//这种方把用户名和密码当做字符串拼接到sql语句中就会穿绳sql注入//当我们向username中传入//String sql = "select * from user where name = '"+username+"',password = '"+password+"';";String sql = "select * from user where name =? and password = ?";//问号相当于一个占位符//对sql进行预编译 预编译之后才设置参数,这样就能把整个参数放到sql语句中并且不被当做一个sql语句执行psmt = conn.prepareStatement(sql);//设置参数psmt.setString(1, username);psmt.setString(2, password);//执行sql ,返回一个结果集rs = psmt.executeQuery();if (rs.next()) {System.out.println("success");}else {System.out.println("fail");}} catch (Exception e) {e.printStackTrace();}finally{//使用工具类释放资源MyJDBCUtils.clearConn(conn, psmt, rs);}}}

JDBC连接的工具类,通过读取配置文件的方式注册数据库驱动连接数据库的方式

package com.fwd.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ResourceBundle;/** * JDBC连接工具类 * 2016年12月22日00:06:43 * @author fwd *  */public class MyJDBCUtils {public static String drivername;public static String username;public static String password;public static String url;// 在类加载的时候读取配置文件static {drivername = ResourceBundle.getBundle("db").getString("drivername");username = ResourceBundle.getBundle("db").getString("username");password = ResourceBundle.getBundle("db").getString("password");url = ResourceBundle.getBundle("db").getString("url");}/** * 获取数据库连接 * @return conn * @throws Exception */public static Connection getConnection() throws Exception{//用反射加载驱动Class.forName(drivername);//获取数据库的连接Connection conn = DriverManager.getConnection(url,username,password);return conn;}/** * 释放JDBC资源 * @param conn * @param stmt * @param rs */public static void clearConn(Connection conn,Statement stmt,ResultSet rs){if (conn!=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}conn = null;//快速释放资源 这是sun公司官网推荐的写法}if (stmt!=null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}stmt =null;}if (rs !=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}rs = null;}}}
配置文件的内容截图

mysql数据表


1 0