PreparedStatement和Statement区别

PreparedStatement和Statement区别:

PreparedState:预编译对象,执行都是占位符号?,可以有效防止sql注入(不存在字符串拼接)
			  sql就执行静态的sql语句,可以发送不同的参数进行赋值,执行sql效率相对大于Statement
Statement:普通的执行对象,每次指定的都是静态的sql,存在硬编码(将sql语句写死了),而且存在字符串拼接。
	      可以造成sql注入,不安全
	      执行sql效率低,每次执行exectueUpdate()或者是execteQuery(String sql)都要发送sql。
代码演示(Statement):
package practice_02;
import JdbcUtils.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/**
 * @author Kuke
 * @date 2021/11/6 16:09
 * 使用Statement对象操作数据库,模拟用户登录操作
 * 键盘录入,录入的数据需要和查询到的用户名和密码进行对比,一致,提示"登录成功" ;
 * 弊端:Statement:1 执行静态sql语句,写死了---存在字符串拼接
 *                 2 select * from user where username = 'java' and passward = 'a'or'a'='a' ;
 *                 就会造成SQL注入,密码不匹配的情况下依然能登录成功。
 */
public class StatementTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in) ;
        System.out.println("请输入用户名:");
        String username = sc.nextLine() ;
        System.out.println("请输入密码;");
        String passward = sc.nextLine() ;
        Boolean flag = isLogin(username,passward) ;
        if (flag){
            System.out.println("登陆成功");
        }else{
            System.out.println("登陆失败,请重新输入。");
        }
    }
    private static Boolean isLogin(String username, String passward) {
        Connection cont = null ;
        Statement stmt = null ;
        ResultSet rs = null ;
        try {
            cont =JdbcUtils.getConnection() ;
            String sql = "select * from user where username='"+username+"'and passward='"+passward+"';";
            System.out.println(sql);
            stmt = cont.createStatement();
            rs = stmt.executeQuery(sql) ;
            return rs.next() ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false ;
    }
}
代码演示:利用preparedStatememt模拟登录
package practice_02;
import JdbcUtils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
 * @author Kuke
 * @date 2021/11/6 17:27
 */
//测试类
public class PreparedStatementTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in) ;
        System.out.println("请您输入用户名:");
        String username = sc.nextLine() ;
        System.out.println("请您输入密码:");
        String passward = sc.nextLine() ;
        Boolean flag = isLogin(username,passward) ;
        if (flag){
            System.out.println("登录成功!!");
        }else{
            System.out.println("登陆失败,请重新登录。");
        }
    }
    private static Boolean isLogin(String username, String passward) {
        Connection cont = null ;
        PreparedStatement stmt = null ;
        ResultSet rs = null ;
        try {
            cont = JdbcUtils.getConnection() ;//获取连接对象。
            String sql = "select * from user where username = ? and passward=?" ;
            stmt= cont.prepareStatement(sql) ;//预编译对象执行sql语句。
            stmt.setString(1,username);
            stmt.setString(2,passward);
            rs = stmt.executeQuery() ;
            return rs.next() ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false ;
    }
}
上一篇:Kafka集群生产环境架设笔记


下一篇:关于statement.excute()方法执行增删语句成功却返回false的问题