1、什么是sql注入。----->sql拼接安全问题。
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,对数据安全造成影响
而Statement存在sql注入的问题:因为他的sql字符串拼接。
2、预防方案。 ----->使用PrepareStatement来进行sql得预编译。
PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题
PreparedStatement主要有如下的三个优点:
a. 可以防止sql注入
b. 由于使用了预编译机制,执行的效率要高于Statement
案例代码如下:
package com.ykq.dao;
import com.ykq.entity.User;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
public Connection connection;
public PreparedStatement ps;
public ResultSet resultSet;
//查询所有
public List<User> findAll(){
List<User> list=new ArrayList<>();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
String sql = "select * from tb_user";
ps = connection.prepareStatement(sql);
resultSet = ps.executeQuery();
while (resultSet.next()) {
User user = new User();
//为java对象得属性赋值
user.setUid(resultSet.getInt("uid"));
user.setUname(resultSet.getString("uname"));
user.setPassword(resultSet.getString("password"));
user.setSex(resultSet.getString("sex"));
list.add(user);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//TODO 关闭资源
}
return list;
}
//根据id查询 1
public User findById(Integer id){
User user=null;//声明对象
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
String sql = "select * from tb_user where uid=?";
ps = connection.prepareStatement(sql);
ps.setObject(1, id);
resultSet = ps.executeQuery();
while (resultSet.next()) {
user = new User();
//为java对象得属性赋值
user.setUid(resultSet.getInt("uid"));
user.setUname(resultSet.getString("uname"));
user.setPassword(resultSet.getString("password"));
user.setSex(resultSet.getString("sex"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
// TODO 关闭资源
}
return user;
}
//删除 --- id删除
public int deleteById(int id){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
String sql = "delete from tb_user where uid=?";
ps = connection.prepareStatement(sql);
ps.setObject(1, id);
int i = ps.executeUpdate();
return i;
}catch (Exception e){
e.printStackTrace();
}finally {
// TODO 删除
}
return 0;
}
//修改
public int update(User user){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
String sql = "update tb_user set uname=?,sex=?,password=? where uid=?";
ps = connection.prepareStatement(sql);
ps.setObject(1, user.getUname());
ps.setObject(2, user.getSex());
ps.setObject(3, user.getPassword());
ps.setObject(4, user.getUid());
int i = ps.executeUpdate();
return i;
}catch (Exception e){
e.printStackTrace();
}finally {
// TODO 删除
}
return 0;
}
//增加
public int insert(User user){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?serverTimezone=Asia/Shanghai", "root", "root");
String sql = "insert into tb_user(uid,uname,password,sex) values(null,?,?,?)";
ps = connection.prepareStatement(sql);
ps.setObject(1, user.getUname());
ps.setObject(2, user.getPassword());
ps.setObject(3, user.getSex());
int i = ps.executeUpdate();
return i;
}catch (Exception e){
e.printStackTrace();
}finally {
// TODO 删除
}
return 0;
}
}