1、PreparedStatement概述
可以通过调用Connection对象的preparedStatement(Stringsql)方法获取PreparedStatement对象
PreparedStatement接口是Statement的子接口,它表示一条预编译过的SQL语句
PreparedStatement对象所代表的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的setXxx()方法来设置这些参数.setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值
ResultSetexecuteQuery()执行查询,并返回该查询生成的ResultSet对象。
intexecuteUpdate():执行更新,包括增、删、该。
2、Statement的不足
(1)SQL拼接
(2)SQL注入
SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,从而利用系统的SQL引擎完成恶意行为的做法。对于Java而言,要防范SQL注入,只要用PreparedStatement取代Statement就可以了。
(3)处理Blob类型的数据
BLOB(binarylargeobject),二进制大对象,BLOB常常是数据库中用来存储二进制文件的字段类型。
插入BLOB类型的数据必须使用PreparedStatement,因为BLOB类型的数据无法使用字符串拼接写的。
MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
如果还是报错:xxxtoolarge,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数:
max_allowed_packet=16M注意:修改了my.ini文件,一定要重新启动服务
实际使用中根据需要存入的数据大小定义不同的BLOB类型。需要注意的是:如果存储的文件过大,数据库的性能会下降。
CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(20)COLLATEutf8_unicode_ciDEFAULTNULL,`head_picture`mediumblob,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci;
package