使用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数据表
相关文章推荐
- 数据库时间(datetime类型)的存储和读取
- mysql批量更新多个字段不同值
- 基于mongodb的地理检索实现
- SQL Server 获得唯一编号的方法
- mysql 5.7 修改初始密码
- 关系型数据库的几种设计范式(1NF 2NF 3NF BCNF 4NF 5NF)
- memcache cache session
- sql中substr与substring函数用法
- Oracle数据库的备份与恢复
- oracle --用户篇
- MySQL AHI 实现解析
- SQL执行计划与语句调优
- go database/sql sql-driver/mysql 操作
- 客户端用PLSQL远程连接数据库
- Spring data redis pubsub 简单接入
- 数据库中使用order by 和limit查询变慢解决办法
- windows mysql 5.7 免安装配置
- redis
- PouchDB:一个开源的 JS 数据库
- mysql 学习总结3,表的设计