JDBC(6)mysql中的大數據處理

免費錄播jdbc視頻

最全JDBC 視頻 https://ke.qq.com/course/280836#tuin=5740604a

JDBC操作

驅動可以不註冊

這裏寫圖片描述

        * 可以省略 Class.forName(driver); (高版本)
        * 原因:mysql-connector-java-5.1.22-bin.jar/META-INF/services/java.sql.Driver 內容com.mysql.jdbc.Driver ,程序將自動加載(SPI機制)


        mysql-connector-java-5.1.5-bin.jar不行

大數據處理

    * PreparedStatement對象
        * sql注入:防止實際參數作爲sql語句的一部分。
        * 大數據處理
            * mysql大數據類型:
                * blob :Binary Large Object,二進制大對象。 mysql提供blob(64k),longblob(4G)
                    * java對象api : 
                        * psmt.setBinaryStream(parameterIndex, x) 二進制數據或者
                        * psmt.setBlob(parameterIndex, inputStream) blob對象
                * clob :Character Large Object字符大對象。mysql提供text(64k),longtext(4G)

大數據表準備

create table bigimg(
  id int primary key auto_increment,
  img blob
);


create table bigtext(
  id int primary key auto_increment,
  content longtext
);
@Test
    public void sendImg() {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            //1 準備sql語句
            String sql = "insert into bigimg(img) values(?)";

            //2準備預處理對象
            psmt = conn.prepareStatement(sql);

            // * 圖片的數據流
            FileInputStream is = new FileInputStream(new File("臺灣.jpg"));

            //3設置內容
            psmt.setBinaryStream(1, is);

            //4執行sql
            int r = psmt.executeUpdate(); //不需要sql語句

            System.out.println(r);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeResource(conn, psmt, rs);
        }
    }
    @Test
    public void getImg() {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            //1 準備sql
            String sql = "select img from bigimg where id = ?";

            //2預處理對象
            psmt = conn.prepareStatement(sql);

            //3設置參數
            psmt.setInt(1, 1);

            //4執行sql
            rs = psmt.executeQuery(); //不需要sql語句

            //5處理結果
            if (rs.next()) {
                System.out.println("下載中");
                //獲得流並保存
                InputStream is = rs.getBinaryStream("img");

                FileOutputStream out = new FileOutputStream(new File("bak.jpg"));
                byte[] buf = new byte[1024];
                int len = -1;
                while ((len = is.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }
                out.close();
                is.close();
            } else {
                System.out.println("沒有數據");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeResource(conn, psmt, rs);
        }
    }

@Test
    public void getText() {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            //1  -- 使用的字段的別名
            String sql = "select content c from bigtext where id = ?";

            //2
            psmt = conn.prepareStatement(sql);

            //3
            psmt.setInt(1, 2);

            //4執行
            rs = psmt.executeQuery();

            if (rs.next()) {
                System.out.println("下載中");
                Reader reader = rs.getCharacterStream("c"); //獲得內容時,必須使用別名

                Writer writer = new OutputStreamWriter(new FileOutputStream("d:/1.txt"), "UTF-8");
                char[] buf = new char[1024];
                int len = -1;
                while ((len = reader.read(buf)) != -1) {
                    writer.write(buf, 0, len);
                }

                writer.close();
                reader.close();

            } else {
                System.out.println("沒有");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeResource(conn, psmt, rs);
        }
    }

    @Test
    public void sendText() {

        //java.lang.OutOfMemoryError: Java heap space

        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            //1
            String sql = "insert into bigtext(content) values(?)";

            //2
            psmt = conn.prepareStatement(sql);

            // * 提供字符串流

            Reader reader = new InputStreamReader(new FileInputStream(new File("d:/鬥破蒼穹.txt")), "UTF-8");

            //3 參數
            psmt.setCharacterStream(1, reader);

            //4
            int r = psmt.executeUpdate();

            System.out.println(r);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeResource(conn, psmt, rs);
        }
    }

批處理

Statement對象
1. addBatch(String sql) 給批處理緩存中,添加sql語句
2. clearBatch() 清空緩存
3. executeBatch() 將緩存中的sql語句都執行

* PreparedStatement對象*
1. 獲得對象,提供sql
2. addBatch() ,將指定的參數添加到批處理緩存

sql腳本

create table batch(id int primary key , content varchar(30));
@Test
    public void statement(){ //語句執行
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            st = conn.createStatement();

            //批處理
            st.addBatch("create database day12_batch");
            st.addBatch("use day12_batch");
            st.addBatch("create table batch(id int primary key auto_increment , content varchar(30))");
            st.addBatch("insert into batch(content) values('jack')");
            st.addBatch("insert into batch(content) values('rose')");


            //執行
            int[] arr = st.executeBatch();
            System.out.println(Arrays.toString(arr));

        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            JdbcUtil.closeResource(conn, st, rs);
        }
    }

    @Test
    public void prepared(){ //預處理
        //String url = "jdbc:mysql:///day12_batch?useUnicode=true&characterEncoding=UTF-8";
        long start = System.currentTimeMillis();
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtil.getConnection();

            String sql = "insert into batch(content) values(?)";
            psmt = conn.prepareStatement(sql);

            //批處理--設置參數
            for(int i = 0 ; i< 100 ; i++){
                psmt.setString(1, i + "");
                // 添加到緩存
                psmt.addBatch(); //沒有sql語句
            }

            //執行
            int[] arr = psmt.executeBatch();
            System.out.println(Arrays.toString(arr));

        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            JdbcUtil.closeResource(conn, psmt, rs);
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

    }

時間處理

 Statement對象,字符串的形式處理或mysql提供時間函數now()
 PreparedStatement對象 ,getDate(java.sql.Date)  getTime(java.sql.Time) getTimeStamp(java.sql.TimeStamp)
                * new java.sql.Date(new java.util.Date().getTime())

sql語句


CREATE TABLE dt(

  d DATE,

  t TIME,

  ts TIMESTAMP

)

這裏寫圖片描述
這裏寫圖片描述

事務

create table account(
  id int primary key auto_increment,
  username varchar(50),
  money int
);

insert into account(username,money) values('jack',500);
insert into account(username,money) values('rose',500);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章