时间:2021-07-01 10:21:17 帮助过:2人阅读
public User findUserByUserNameAndPassword(String username, String password) {
try {
<span style="color:#ff0000;">String sql="select * from users where username='"+username+"'and password='"+password+"'"</span>;
con=JDBCUtils.getConnection();
sta =con.createStatement();
rs=sta.executeQuery(sql);
if(rs.next()){
User user=new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setNickname(rs.getString("nickname"));
user.setEmail(rs.getString("email"));
return user;
}else{
return null;
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException();
}finally{
JDBCUtils.closeResource(rs, sta, con);
}
}
PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题.
PrepareStatement案例:
package cn.itheima.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import cn.itheima.utils.JDBCUtils;
public class JDBCDemo5 {
public static void main(String[] args) {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
con=JDBCUtils.getConnection();
ps=con.prepareStatement("select * from user where name=? ");
ps.setString(1, "韩玮");
rs=ps.executeQuery();
//1.查询了数据形成一个表
//rs指向查询出的数据表的前一行
if(rs.next()){
String id = rs.getString("id");
String name=rs.getString("name");
String birthday=rs.getString("birthday");
System.out.println(id+":"+name+":"+birthday);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}finally{
JDBCUtils.closeResource(rs, ps, con);
}
}
}
语句中的参数部分全部使用?然后使用ps.setXXX方法来设置参数版权声明:本文为博主原创文章,未经博主允许不得转载。
黑马day10 预编译解决sql的注入攻击&PrepareStatement
标签: