zoukankan      html  css  js  c++  java
  • 大对象数据LOB的应用 (day10)

    "我打开一本书,一个灵魂就苏醒"


     

    运行环境

         jdk1.8.0_131

      IntelliJ IDEA 2018.3 x64

    mysql版本

      MySQL Server 5.5

      

    用到的jar包

      mysql-connector-java-5.1.48.jar

    一、LOB数据类型概述:

      

      由于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数据。用户可以用LOB数据类型来存储大型的无结构数据,特别是文本、图形、视频和音频等多媒体数据,系统还提供了随机访问这些LOB类型数据的有效办法。

     

    二、LOB数据类型可以分为以下几种:

    1. BLOB:二进制LOB类型,用户存放无结构的二进制数据,最大4GB。

    2. CLOB:字符LOB类型,用于存放字符数据,最大可以存储4GB。

    3. NLOB:字符LOB类型,和CLOB相同,支持国家字符集。

    4. BFILE:二进制文件类型,与数据库外的操作系统文件相关联,该文件存储二进制大对象。

     

     

    三、使用LOB类型数据的限制:

    • 系统不支持分布式LOB,用户不能在SELECT子句或WHERE子句中使用远程LOB定位器,也不能在DBMS_LOB包的子程序中使用远程定位器,也不能引用包含LOB属性的远程表中的对象。

    • LOB列不能用于聚集表。

    • LOB列不能出现在查询语句的GROUP BY、ORDER BY 、DISTINCT(去重复)之后,也不允许出现在分组函数和连接函数中。

    • LOB类型不能出现在数组的定义中。

    • LOB类型不能够出现在建有分区索引的表中。

    • NCLOB类型不能作为对象类型的属性,当可以作为对象类型的方法的参数类型。

    四、下面我们将介绍MySQL数据库对LOB类型数据的存取(读写)操作:

      数据库代码示例:

     1 CREATE DATABASE lob;
     2 
     3 USE lob;
     4 
     5 CREATE TABLE TEXTBLOB(
     6     CID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
     7     CNAME VARCHAR(40),
     8     NOTES LONGBLOB
     9 )
    10 
    11 
    12 SELECT * FROM TEXTBLOB

      工具类代码示例:

     1 package com.chenmengfan.demo1;
     2 
     3 import java.sql.*;
     4 
     5 //连接数据库
     6 public class MySQLJDBCUtil {
     7     //准备三个参数
     8     public static final String DRIVER = "com.mysql.jdbc.Driver";
     9     public static final String URL = "jdbc:mysql://127.0.0.1:3306/lob";
    10     public static final String USER = "root";
    11     public static final String PASSWORD = "123";
    12 
    13     //获取连接
    14     public static Connection getConnection(){
    15         Connection connection = null;
    16         try {
    17             Class.forName(DRIVER);
    18             connection = DriverManager.getConnection(URL, USER, PASSWORD);
    19         } catch (SQLException e) {
    20             e.printStackTrace();
    21         } catch (ClassNotFoundException e) {
    22             e.printStackTrace();
    23         }
    24         return connection;
    25     }
    26 
    27     //关闭连接
    28     public static void close(Connection conn, PreparedStatement ps, ResultSet rs){
    29         try {
    30             if(rs!=null)
    31                 rs.close();
    32             if(ps!=null)
    33                 ps.close();
    34             if(conn!=null)
    35                 conn.close();
    36         } catch (SQLException e) {
    37             e.printStackTrace();
    38         }
    39     }
    40 }

      代码示例:

     1 package com.chenmengfan.demo1;
     2 
     3 import org.junit.Test;
     4 
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileNotFoundException;
     8 import java.io.InputStream;
     9 import java.sql.Connection;
    10 import java.sql.PreparedStatement;
    11 import java.sql.SQLException;
    12 
    13 public class TestTEXTCLOB {
    14     @Test
    15     public void test(){
    16         Connection connection = MySQLJDBCUtil.getConnection();
    17         String sql = "INSERT INTO TEXTCLOB(CID,CNAME,NOTES) VALUES(?,?,?)";
    18         PreparedStatement preparedStatement = null;
    19         try {
    20             preparedStatement = connection.prepareStatement(sql);
    21             preparedStatement.setObject(1,1);
    22             preparedStatement.setObject(2,"notes.txt");
    23             File file = new File("D:\InCommonUse\Guigu_altogether\Guigu\S3\code\day18_code\notes.txt");
    24             InputStream inputStream = new FileInputStream(file);
    25             preparedStatement.setAsciiStream(3,inputStream);
    26             int update = preparedStatement.executeUpdate();
    27             if(update>0){
    28                 System.out.println("数据添加成功");
    29             }else{
    30                 System.out.println("数据添加失败");
    31             }
    32         } catch (SQLException e) {
    33             e.printStackTrace();
    34         } catch (FileNotFoundException e) {
    35             e.printStackTrace();
    36         }finally {
    37             MySQLJDBCUtil.close(connection,preparedStatement,null);
    38         }
    39     }
    40 }

    上面的示例中,我们需要将文本文件以文件流的方式写入MySQL数据库指定的字段时,需要使用PreparedStatement对象调用其setAsciiStream()为存储文本文件加载数据。

    五、总结

      注意事项:

      1. 一定要记得导入jar包,否则会出现 java.lang.ClassNotFoundException  异常。
      2. 一定要用 trycatch 包住异常。

    六、END

    为了不错过每天的见面,请记得点击一下【关注】啊~

        

    作者javagril,00后女生,一个IT界冉冉升起的新星,想带你遨游缤纷多彩的编程世界。

  • 相关阅读:
    3D流水线
    log4cplus 配置文件的编写
    linux下的log4cplus的安装和使用
    日志信息的编写与调用
    转C++内存池实现
    转:自定义内存池的使用
    在linux查看内存的大小
    转:C++内存池
    数组指针 和指针数组的区别
    new的三种形态
  • 原文地址:https://www.cnblogs.com/cmf12/p/13616177.html
Copyright © 2011-2022 走看看