JDBC处理mysql大数据

Posted 何其有静

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC处理mysql大数据相关的知识,希望对你有一定的参考价值。

 

  大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像、声音、二进制文等。

  在实际开发中,有时是需要用程序把大文本或二进制数据直接保存到数据库中进行储存的。

  对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:
  TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
  TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

一.工具类

public class JdbcUtils {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static{
        try{
            url = "jdbc:mysql://localhost:3306/test";
            driver = "com.mysql.jdbc.Driver";
            username = "root";
            password = "root";
            //加载数据库驱动
            Class.forName(driver);

        }catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * @return Connection数据库连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, username,password);
    }

    /**
     * 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
     */
    public static void release(Connection conn,Statement st,ResultSet rs){
        if(rs!=null){
            try{
                //关闭存储查询结果的ResultSet对象
                rs.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if(st!=null){
            try{
                //关闭负责执行SQL命令的Statement对象
                st.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try{
                //关闭Connection数据库连接对象
                conn.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

二.使用jdbc处理MySQL的大文本

sql语句

CREATE TABLE `testclob` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `resume` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

在resource下建立一个data.txt

“百度知道”,是用户自己根据具有针对性地提出问题,通过积分奖励机制发动其他用户,来解决该问题的搜索模式。 同时,这些问题的答案又会进一步作为搜索结果,提供给其他有类似疑问的用户,达到分享知识的效果。
百度知道的最大特点,就在于和搜索引擎的完美结合,让用户所拥有的隐性知识转化成显性知识,用户既是百度知道内容的使用者,同时又是百度知道的创造者,在这里累积的知识数据可以反映到搜索结果中。通过用户和搜索引擎的相互作用,实现搜索引擎的社区化。
百度知道也可以看作是对搜索引擎功能的一种补充,让用户头脑中的隐性知识变成显性知识,通过对回答的沉淀和组织形成新的信息库,其中信息可被用户进一步检索和利用。这意味着,用户既是搜索引擎的使用者,同时也是创造者。百度知道可以说是对过分依靠技术的搜索引擎的一种人性化完善。

测试代码如下:

public class JdbcOperaClob {

    /**
     * @Method: add
     * @Description:向数据库中插入大文本数据
     * @Anthor:孤傲苍狼
     *
     */
    @Test
    public void add(){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Reader reader = null;
        try{
            conn = JdbcUtils.getConnection();
            String sql = "insert into testclob(resume) values(?)";
            st = conn.prepareStatement(sql);
           //相对路径,web容器加载class文件的时候,就是加载这个文件夹下的class文件.
            File file = new File("target/classes/data.txt");
            reader = new FileReader(file);
            st.setCharacterStream(1, reader,(int) file.length());
            int num = st.executeUpdate();
            if(num>0){
                System.out.println("插入成功!!");
            }
            //关闭流
            reader.close();
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
           // JdbcUtils.release(conn, st, rs);
        }
    }

    /**
     * @Method: read
     * @Description: 读取数据库中的大文本数据
     */
    @Test
    public void read(){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try{
            conn = JdbcUtils.getConnection();
            String sql = "select resume from testclob where id=3";
            st = conn.prepareStatement(sql);
            rs = st.executeQuery();

            String contentStr ="";
            String content = "";
            if(rs.next()){
                //使用resultSet.getString("字段名")获取大文本数据的内容
                content = rs.getString("resume");
                //使用resultSet.getCharacterStream("字段名")获取大文本数据的内容
                Reader reader = rs.getCharacterStream("resume");
                char buffer[] = new char[1024];
                int len = 0;
                FileWriter out = new FileWriter("D:\\\\1.txt");
                while((len=reader.read(buffer))>0){
                    contentStr += new String(buffer);
                    out.write(buffer, 0, len);
                }
                out.close();
                reader.close();
            }
            System.out.println(content);
            System.out.println("-----------------------------------------------");
            System.out.println(contentStr);
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }
}

三.使用jdbc处理MySQL的二进制数据

sql语句

CREATE TABLE `testblobim` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

在resource放一张照片:迪丽热巴.jpg

测试代码:

public class JdbcOperaBloblmgs {

    /**
     * @Description:向数据库中插入二进制数据
     */
    @Test
    public void add(){
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try{
            conn = JdbcUtils.getConnection();
            String sql = "insert into testblobim(image) values(?)";
            st = conn.prepareStatement(sql);
            //相对路径,class下的相对路径
            File file = new File("target/classes/迪丽热巴.jpg");
            FileInputStream fis = new FileInputStream(file);//生成的流
            st.setBinaryStream(1, fis,(int) file.length());
            int num = st.executeUpdate();
            if(num>0){
                System.out.println("插入成功!!");
            }
            fis.close();
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcUtils.release(conn, st, rs);
        }
    }

    /**
     * @Description: 读取数据库中的二进制数据
     */
    @Test
    public void read() {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "select image from testblobim where id=?";
            st = conn.prepareStatement(sql);
            st.setInt(1, 1);
            rs = st.executeQuery();
            if (rs.next()) {
                //InputStream in = rs.getBlob("image").getBinaryStream();//这种方法也可以
                InputStream in = rs.getBinaryStream("image");
                int len = 0;
                byte buffer[] = new byte[1024];

                FileOutputStream out = new FileOutputStream("D:\\\\1.jpg");
                while ((len = in.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                in.close();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.release(conn, st, rs);
        }
    }
}

 

以上是关于JDBC处理mysql大数据的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

如何快速将大数据传输到mysql(JDBC)?

JDBC--05--MySQL大数据量操作---常规查询游标查询流式查询,

12.JDBC

正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool