Java webJava

JDBC 向数据表中插入Blob类型数据

2019-12-15  本文已影响0人  一亩三分甜

向数据表customers中插入Blob类型的字段

public class BlobTest {
    //向数据表customers中插入Blob类型的字段
    @Test
    public void testInsert() throws Exception{
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1,"鄢栋云");
        ps.setObject(2,"cloud@163.com");
        ps.setObject(3,"1990-08-10");
        FileInputStream is = new FileInputStream(new File("1.png"));
        ps.setBlob(4,is);
        ps.execute();
        JDBCUtils.closeResource(conn,ps);
    }
}
Snip20191214_2.png

查询数据表customers中Blob类型的字段

//查询数据表customers中Blob类型的字段
    @Test
    public void testQuery() {
        Connection conn = null;
        PreparedStatement ps = null;
        InputStream is = null;
        FileOutputStream fos = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            String sql = "select id,name,email,birth,photo from customers where id = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,16);
            rs = ps.executeQuery();
            if (rs.next()){
                //方式一:
                //int id = rs.getInt(1);
                //String name = rs.getString(2);
                //String email = rs.getString(3);
                //Date birth = rs.getDate(4);
                //方式二:
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date birth = rs.getDate("birth");
                Customer cust = new Customer(id,name,email,birth);
                System.out.println(cust);

                //将Blob类型的字段下载下来,以文件的方式保存在本地
                Blob  photo = rs.getBlob("photo");
                is = photo.getBinaryStream();
                fos = new FileOutputStream("cloud.png");
                byte[] buffer = new byte[1024];
                int len;
                while ((len = is.read(buffer)) != -1){
                    fos.write(buffer,0,len);
                }

            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (is != null)
                    is.close();
            }catch (IOException e){
               e.printStackTrace();
            }
            try {
                if (fos != null)
                    fos.close();
            }catch (IOException e){
              e.printStackTrace();
            }
            JDBCUtils.closeResource(conn,ps,rs);
        }
    }
//输出
Customer{id=16, name='鄢栋云', email='cloud@163.com', birth=1990-08-10}
Snip20191214_4.png

向MySql数据库中插入1M以上的图片时,会报错。

    //向数据表customers中插入Blob类型1M以上的图片
    @Test
    public void testInsertUp1M() throws Exception{
        Connection conn = JDBCUtils.getConnection();
        String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1,"鄢义");
        ps.setObject(2,"yanyi@163.com");
        ps.setObject(3,"1990-08-10");
        FileInputStream is = new FileInputStream(new File("mountain.jpg"));
        ps.setBlob(4,is);
        ps.execute();
        JDBCUtils.closeResource(conn,ps);
    }
//报错
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4050729 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

此时需要在mysql的安装目录下,找my.ini文件加上如下的配置参数:"max_allowed_packet=16M"。同时注意:修改了my.ini文件之后,需要重新启动mysql服务。或通过命令行设置,命令行设置后需要关闭终端重新进入,重启mysql服务。

Snip20191215_17.png
查看目前配置
show VARIABLES like '%max_allowed_packet%';
修改配置
set global max_allowed_packet = 1024*1024*16;
Snip20191215_6.png
Snip20191215_9.png

重新运行程序,1M以上的图片插入到数据库中了。

Snip20191215_11.png
上一篇 下一篇

猜你喜欢

热点阅读