以下文章来源于何先振,责编小何

当我们使用JDBC插入数据时,我们的Id如果是自增长的话,插入的时候数据库会自己生成一个主键。
如果我们需要在Java程序中用到这个主键,我们就需要获取数据库生成的主键。
要想在插入数据的时候返回主键,我们就需要在创建PreparedStatement对象的时候,传入一个标识。

这个标识是个1,表示在插入数据时, 会返回对应的主键。

传入标识之后,PreparedStatement对象执行完插入语句就会把主键带出来。
通过调用这个getGenerateKeys方法获取主键的结果集。

在插入成功的代码中,调用此方法获取主键值。

执行程序,成功获取了主键值。


这样就可以在某些业务场景下,需要使用前一张表插入数据的主键值,作为后一张表的依赖关系,就可以通过这种方式获取主键信息。
MySQL中,blob是一个二进制大型对象,是一个可以存储大量数据的容器。根据可以存的数据大小不同。
可分为:tinyblob、blob、mediumblob、longblob。

插入blob类型的数据必须使用PreparedStatement,因为blob类型的数据无法使用字符串拼接写成。
下面我们就来演示,在用户表中增加一个photo字段,代表用户头像。

我们往用户表插入数据时,就需要插入用户的头像。
首先我们准备一个用来做头像的图片,放到跟src平级的目录下,这样可以使用相对路径获取图片。

新增用户头像时,需要传入一个输入流。这个流中就是存放图片的二进制数据。输入流中指明了图片的相对路径。

执行程序,添加数据成功。

这时候我们就看到blob数据已经被添加进去了。

使用小海豚工具SQLyog还可以双击查看图片信息。

使用setObject也是可以的,传的时候传文件的输入流就行了。


修改blob类型的字段跟新增一样,在设置参数时传个文件的输入流就可以。
下面来演示查询时,如何接收blob类型的数据。
我们查询id为5的这条数据。

编写查询代码,获取blob字段时,会返回一个blob对象。

然后通过blob对象调用方法,得到一个输入流里面就保存了图片的二进制数据。

接下来就可以根据以前学习IO流(Java高级教程中的内容),创建一个输出流将图片数据输出到指定的路径下。

这里的输出流,指定的是相对路径,默认是src同级目录。运行程序,我们就可以看到src目录下生成的这个图片信息了。


注意:
有些老版本的MySQL数据库插入blob类型的数据时会报错:xxxx too large,这时需要在MySQL的安装目录下,找到my.ini文件加上如下的参数配置:
max_allowed_packet=16M。
同时需要重新启动mysql服务器。
处理Blob类型的数据是PreparedStatement接口的第二个好处。
这是因为它可以通过占位符?,把流信息传入到SQL中,而Statement设置参数只能拼串,是无法拼上Blob类型的流对象。
除了这个好处,PreparedStatement还可以高效地进行批量操作。那么如何进行批量操作,下讲我们开始进行学习。

扫码进微信答疑群





