PrepareedStatement 可以防止SQL注入

  1. package com.kuang.lesson03;
  2. import com.kuang.lesson02.utils.JdbcUtils;
  3. import java.util.Date;
  4. import java.sql.*;
  5. public class TestInsert {
  6. public static void main(String[] args) throws SQLException {
  7. Connection conn = null;
  8. PreparedStatement st =null;
  9. try {
  10. conn= JdbcUtils.getConnection();
  11. //区别
  12. //使用?占位符代替参数
  13. String sql="insert into users(id,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";
  14. st=conn.prepareStatement(sql);//预编译,先写sql,然后不执行
  15. st.setInt(1,4);//id
  16. st.setString(2,"qiangjiang");//name
  17. st.setString(3,"123123");
  18. st.setString(4,"2233445");
  19. //注意点: sql.Date 数据库 java.sql.Date()
  20. // util.Date Java new Date().getTime 获得时间戳
  21. st.setDate(5,new java.sql.Date(new Date().getTime()));
  22. //执行
  23. int i = st.executeUpdate();
  24. if(i>0){
  25. System.out.println("插入成功");
  26. }
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }finally {
  30. JdbcUtils.release(conn,st,null);
  31. }
  32. }
  33. }

其他的类似,只需要改sql语句和手动给参即可。
删除类似:
image.png
更新:
image.png
查询:

  1. package com.kuang.lesson03;
  2. import com.kuang.lesson02.utils.JdbcUtils;
  3. import javax.annotation.Resource;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. public class TestSelect {
  9. public static void main(String[] args) throws SQLException {
  10. Connection conn=null;
  11. PreparedStatement st=null;
  12. ResultSet rs=null;
  13. try {
  14. conn=JdbcUtils.getConnection();
  15. String sql="select * from users where id = ?";
  16. st=conn.prepareStatement(sql);
  17. st.setInt(1,1);
  18. rs=st.executeQuery();
  19. if(rs.next()){
  20. System.out.println(rs.getString("NAME"));
  21. }
  22. } catch (SQLException e) {
  23. e.printStackTrace();
  24. }finally {
  25. JdbcUtils.release(conn,st,rs);
  26. }
  27. }
  28. }

如何解决sql注入问题?

package com.kuang.lesson03;

import com.kuang.lesson02.utils.JdbcUtils;

import java.sql.*;

public class SqlInjection {
    public static void main(String[] args) {
//    login("zhansan","123456");
    login("''or '1=1","123456");
}
    public static void login(String username,String password){
        Connection conn=null;
        PreparedStatement st=null;
        ResultSet rs=null;

        try {
            conn= JdbcUtils.getConnection();


            //SELECT * FROM users WHERE `name` = 'zhansan' AND `password` = '123456';
            String sql="SELECT * FROM users WHERE `NAME` = ? and `PASSWORD`=?";
            st=conn.prepareStatement(sql);

            st.setString(1,username);
            st.setString(2,password);
            rs=st.executeQuery();
            while (rs.next()){
                System.out.println(rs.getString("NAME"));
                System.out.println(rs.getString("password"));
                System.out.println("=====================================");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                JdbcUtils.release(conn,st,rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

image.png
Preparedstatement 防止SQL注入的本质,把传递进来的参数当做字符
假设其中存在转义字符,比如说 ` 会被直按转义