预编译能防止SQL注入是因为在运行程序第一次操作数据库之前,SQL语句已经被数据库分析、编译和优化,而且对应的执行计划也会将sql缓存下来,并允许数据库以参数化的形式进行查询,当运行时会动态地把参数传给PreprareStatement,即使参数里有敏感字符,如:“or '1=1'”,也会被数据库作为一个参数或者一个字段的属性值来处理,而不是作为一个SQL指令来运行。