Statement
statement对象用于执行静态SQL语句并返回其生成的结果的对象,在连接建立后,需要对数据库进行访问,执行 命名或是SQL 语句, 可以通过
- Statement[存在SQL注入问题]
- PreparedStatement[预处理]
- CallableStatement[存储过程]
statement对象执行SQL语句,存在SQL注入的风险。
那么什么是SQL注入呢?
SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库的一种行为。
比如我们在用户名出输入 1' or'
用户密码出输入or '1'= '1
那么数据库系统在识别我们的内容是显示是如下情况
判断条件是 “1 = 1 ?” 显然这个恒成立,那么不论我们怎么输入,都能进入访问数据库,从而对数据库进行恶意操作或执行恶意命令,这就是SQL注入了。
(Statement的注入)
因此我们知道,直接用statement进行访问数据库操作有风险,存在SQL注入,因此我们java现在使用的是---预处理PreparedStatement
- PreparedStatement执行的 SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXXX()方法来设置这些参数。setXXX()方法有两个参数,第一个是要设置的SQL 语句中的参数的索引(从1 开始)
- 调用executeQuery(), 返回ResultSet对象
- 调用executeUpdate():执行更新,包括增,删,修改
预处理的好处有哪些呢?
- 首先我们不在使用 + 拼接sql语句,减少语法错误
- 有效的解决了sql注入问题
- 大大减少了编译次数,效率较高。