您的位置:首页 > 数据库

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

2016-12-22 00:10 627 查看
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数据表

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: