大对象

存取大对象---LOB
    【分类】:
        1)Character LOB --> CLOB(Text有四个子类型)
        2)Binary    LOB --> BLOB(Blob有四个子类型)
    
    
    一】CLOB
    
        1.重点类库:
            1)PreaParedStatement类:    
                重点方法:
                    写:
                        void setCharacterStream(int parameterIndex, Reader reader) ;//将指定参数设置为给定 Reader 对象。
                      void setCharacterStream(int parameterIndex, Reader reader, int length); //将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度。
                      
                    读:
                      Reader getCharacterStream(int columnIndex);//以java.io.Reader 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
                         Reader getCharacterStream(String columnLabel);//以 java.io.Reader 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
             2)类加载器--ClassLoder类:
                      URL getResource(String name);//查找具有给定名称的资源。
             3)URL类:
                      String getPath();//获取此 URL 的路径部分。
        2.详细步骤
                注意:
                    1》在能完成业务的情况下,尽早关闭连接对象
                    2》关闭连接对象,只是不能够发送SQL语句到数据库方,并不意味不能读写。
                            
                1)写:
                        使用PreparedStatement的setCharacterStream方法+类加载器的getResource()方法+Url类的getPath()方法。
                code:

 

                private static void write() throws FileNotFoundException {

            

                    Connection conn = null;

                    PreparedStatement pstmt = null;

                    ResultSet rs = null;

                    String sql = "insert into test_clob(id,context) values(?,?)";

            

                    URL url = Demo1.class.getClassLoader().getResource(

                            "cn/itcast/web/jdbc/config/62.txt");

                    String path = url.getPath();

                    File file = new File(path);

                    System.out.println(file.toString());

                    Long length = file.length();

                    Reader reader = new FileReader(file);

            

                    conn = JdbcUtil.getMySQLConnection();

                    try {

                        pstmt = conn.prepareStatement(sql);

                        pstmt.setString(1, UUID.randomUUID().toString());

                        pstmt.setCharacterStream(2, reader, length);

            

                        int value = pstmt.executeUpdate();

                        if (value > 0) {

                            System.out.println("成功");

                        } else {

                            System.out.println("失败");

                        }

                    } catch (SQLException e) {

                        e.printStackTrace();

                    } finally {

                        if(null!=reader){

                            try {

                                reader.close();

                            } catch (IOException e) {

                                e.printStackTrace();

                            }

                        }

                        JdbcUtil.closeAll(rs, pstmt, conn);

                    }

            

                }

            }

 


            
            2)读:
                        使用ResultSet类的getCharacterStream方法
                code:

           public class Reader {

                        private static Connection conn;

                        private static ResultSet rs;

                        private static java.io.Reader reader;

                        private static java.io.Writer writer;

                        private static PreparedStatement stmt;

                    

                        public static void main(String[] args) {

                            conn = JDBCUtils.getConnection();

                            try {

                                stmt = conn.prepareStatement(SqlMapping.READ_DATA);

                                rs = stmt.executeQuery();

                                rs.next();

                                reader = rs.getCharacterStream("content");

                            } catch (SQLException e) {

                                e.printStackTrace();

                            } finally {

                                JDBCUtils.closeAll(rs, stmt, conn);//需要先关闭SQL的连接,而这并不影响流的连接

                            }

                    

                            try {

                                int len = 0;

                                writer = new FileWriter("d:/test.txt");

                                char[] cbuf = new char[1024];

                                while ((len = reader.read(cbuf)) > 0) {

                                    writer.write(cbuf, 0, len);

                                }

                            } catch (IOException e) {

                                e.printStackTrace();

                            } finally {

                                if (null != writer) {

                                    try {

                                        writer.close();

                                    } catch (IOException e) {

                                        e.printStackTrace();

                                    }

                                }

                    

                                if (null != reader) {

                                    try {

                                        reader.close();

                                    } catch (IOException e) {

                                        e.printStackTrace();

                                    }

                                }

                            }

                    

                        }

                    }

    

 

 


    二】CLOB
    
        1.重点类库:
            1)PreaParedStatement类:    
                重点方法:
                    写:
                        void setBinaryStream(int parameterIndex, InputStream is)  ;//将指定参数设置为给定 is 对象。
                      void setBinaryStream(int parameterIndex, InputStream is, int length); //将给定参数设置为给定 is 对象,该对象具有给定字节长度。
                      
                    读:
                      Reader getBinaryStream(int columnIndex);//以java.io.InputStream 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
                         Reader getBinaryStream(String columnLabel);//以 java.io.InputStream 对象的形式获取此 ResultSet 对象的当前行中指定列的值。
             2)类加载器--ClassLoder类:
                      URL getResource(String name);//查找具有给定名称的资源。
             3)URL类:
                      String getPath();//获取此 URL 的路径部分。
        2.详细步骤
                注意:
                    1》在能完成业务的情况下,尽早关闭连接对象
                    2》关闭连接对象,只是不能够发送SQL语句到数据库方,并不意味不能读写。
                            
                1)写:
                        使用PreparedStatement的setCharacterStream方法+类加载器的getResource()方法+Url类的getPath()方法。
                code:

         //将BLOB类型数据存入数据库

                    public class WriteBlob {

                        private static InputStream is;

                        private static Connection conn;

                        private static PreparedStatement stmt;

                        private static ResultSet rs;

                        private static URL fileUrl;

                    

                        public static void main(String[] args) {

                            conn = JDBCUtils.getConnection();

                            try {

                                fileUrl = WriteBlob.class.getClassLoader().getResource(

                                        "com/suse/source/d1.jpg");

                                File file = new File(fileUrl.getPath());

                                is = new FileInputStream(file);

                                stmt = conn.prepareStatement(SqlMapping.INSERT_PIC);

                                stmt.setBinaryStream(1, is, file.length());

                                int rows = stmt.executeUpdate();

                                if (0 == rows) {

                                    System.out.println("失败!");

                                } else {

                                    System.out.println("成功!");

                                }

                            } catch (SQLException e) {

                                e.printStackTrace();

                            } catch (FileNotFoundException e) {

                                e.printStackTrace();

                            }

                            

                            JDBCUtils.closeAll(rs, stmt, conn);

                        }

                    }

 

 



                
            
            2)读:
                        使用ResultSet类的getBinaryStream方法
                code:

         public class ReadBlob {

                    private static Connection conn;

                    private static ResultSet rs;

                    private static PreparedStatement stmt;

                    private static OutputStream os;

                    private static InputStream is;

                

                    public static void main(String[] args) {

                        conn = JDBCUtils.getConnection();

                        try {

                            stmt = conn.prepareStatement(SqlMapping.GET_PIC);

                            rs = stmt.executeQuery();

                            if (rs.next()) {

                                is = rs.getBinaryStream("content");

                            }

                        } catch (SQLException e) {

                            e.printStackTrace();

                        } finally {

                            JDBCUtils.closeAll(rs, stmt, conn);

                        }

                

                        try {

                            int len = 0;

                            byte[] buf = new byte[1024];

                            os = new FileOutputStream("D:/test.jpg");

                            while ((len = is.read(buf)) > 0) {

                                os.write(buf, 0, len);

                            }

                        } catch (IOException e) {

                            e.printStackTrace();

                        } finally {

                            if (null != is) {

                                try {

                                    is.close();

                                } catch (IOException e) {

                                    e.printStackTrace();

                                }

                            }

                            if (null != os) {

                                try {

                                    os.close();

                                } catch (IOException e) {

                                    e.printStackTrace();

                                }

                            }

                        }

                    }

                }

 

 



你可能感兴趣的:(对象)