深入浅出JDBC-操作时间与大对象(Clob/Blob)

Posted 码农皮邱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出JDBC-操作时间与大对象(Clob/Blob)相关的知识,希望对你有一定的参考价值。

一、时间(Date、Time、Timestamp)

  java.sql.Date/java.sql.Time/java.sql.Timestamp extends java.util.Date

public class TimeData {
    PreparedStatement pStatement=null;
    //操作日期类型的数据
    public void insertDate(Connection connection,long time){
        try {
            String sql="insert into user(regTime)values(?)";
            pStatement=connection.prepareStatement(sql);
            //插入的时间为当前日期
            pStatement.setDate(1,new Date(time));
            pStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }
    }

    //操作时间类型的数据
    public void insertTimestamp(Connection connection,long time){
        try {
            String sql="insert into user(loginTime)values(?)";
            pStatement=connection.prepareStatement(sql);
            java.sql.Timestamp timestamp=new java.sql.Timestamp(time);
            //插入的时间为当前时间
            pStatement.setTimestamp(1,timestamp);
            pStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }
    }

    /**
     *批量添加某一区间的数据
     * @param connection
     * @param first 注册时间
     * @param seconed  登录时间
     * @param rowNum 添加的记录的条数
     */
    public void insertBatch(Connection connection,long first,long seconed,int rowNum){
        try {
            String sql="insert into user(regTime,loginTime) values(?,?)";
            pStatement=connection.prepareStatement(sql);
            for(int i=0;i<rowNum;i++){
                long regTime=new Random().nextInt(100000000)+first;
                long loginTime=seconed-new Random().nextInt(10000000);
                pStatement.setDate(1,new java.sql.Date(regTime));
                pStatement.setTimestamp(2,new Timestamp(loginTime));
                pStatement.executeUpdate();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }
    }

    //插入指定时间的数据
    public long StringToDate(String dateString){
        try {
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            return sdf.parse(dateString).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    //查询日期、时间
    public void query(Connection connection){
        Statement statement=null;
        ResultSet rs=null;
        try {
            statement=connection.createStatement();
            String sql="select regTime,loginTime from user";
            statement.executeQuery(sql);
            rs=statement.executeQuery(sql);
            while(rs.next()){
                Date date=rs.getDate("regTime");
                Timestamp ts=rs.getTimestamp("loginTime");
                System.out.println(date+"-----"+ts);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

二、时间单元测试

public class TestTimeData {

    Connection connection=DBUtil.getInstance().getConnection();
    TimeData timeData=new TimeData();

    @Test
    public void insertDate(){
        timeData.insertDate(connection,System.currentTimeMillis());
    }

    @Test
    public void insertTimestamp(){
        timeData.insertTimestamp(connection,System.currentTimeMillis());
    }

    @Test
    public void insertAppointedDate(){
        //插入指定时间
        long t=timeData.StringToDate("2017-01-01 15:30:00");
        timeData.insertDate(connection,t);
    }

    @Test
    public void insertBatchDate(){
        //批量插入某一时间段时间
        long start=timeData.StringToDate("2016-01-01 12:50:20");
        long end=timeData.StringToDate("2017-12-30 02:00:00");
        timeData.insertBatch(connection,start,end,50);
    }

    @Test
    public void query(){
        timeData.query(connection);
    }
}

三、大数据对象(Clob、Blob)

public class BigData{
    PreparedStatement pStatement=null;
    /**
     * 插入海量文字通过读取本地文件
     * @param filePath 文件的物理路径
     * @param connection
     */
    public void insertClobByReadFile(Connection connection,String filePath )   {
        try {
            String sql="insert into user(resume)values(?)";
            pStatement=connection.prepareStatement(sql);
            pStatement.setClob(1,new FileReader(new File(filePath)));
            pStatement.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }
    }

    /**
     * 读取存储在数据库的海量文字文件
     */
    public void queryClob(Connection connection,int id) {
        ResultSet rs=null;
        try {
            String sql="select resume from user where id=?";
            pStatement=connection.prepareStatement(sql);
            pStatement.setInt(1,id);
             rs=pStatement.executeQuery();
            while (rs.next()){
                Clob clob=rs.getClob("resume");
                Reader r=clob.getCharacterStream();
                int temp=0;
                while((temp=r.read())!=-1){
                    System.out.print((char)temp);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(rs);
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }

    }

    /**
     * 存储图片文件
     * @param connection
     * @param imgPath 图片的物理路径
     */
    public void insertBlob(Connection connection,String imgPath) {
        try {
            pStatement=connection.prepareStatement("insert into user(headImg) values(?);");
            //获得图片的输入流
            pStatement.setBlob(1,new FileInputStream(new File(imgPath)));
            pStatement.execute();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(pStatement);
            DBUtil.getInstance().close(connection);
        }
    }

    /**
     *  获取图片文件,并且输入到本地:F:/hello.jpg。
     * @param connection
     * @param id
     */
    public void queryBlob(Connection connection,int id){
        ResultSet rs;
        try {
            String sql="select headImg from user where id=?";
            pStatement=connection.prepareStatement(sql);
            pStatement.setInt(1,id);
            rs=pStatement.executeQuery();
            while(rs.next()){
                //获得文件的blob对象
                Blob blob=rs.getBlob("headImg");
                //获取文件的输入流
                InputStream is=blob.getBinaryStream();
                //建立输出流用于输入图片查看结果
                OutputStream os=new FileOutputStream(new File("F:/hello.txt"));
                int temp=0;
                while((temp=is.read())!=-1){
                    os.write(temp);
                }
                os.flush();
                os.close();
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

大数据对象单元测试

public class TestBigData {
  //获取数据库连接
    Connection connection=DBUtil.getInstance().getConnection();
    BigData bigData=new BigData();
    @Test
    public void insertClob(){
        try {
            String filePath="F:/testclob.txt";
            bigData.insertClobByReadFile(connection,filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void queryClob(){
        try {
            bigData.queryClob(connection,1);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.getInstance().close(connection);
        }
    }

    @Test
    public void insertBlob(){
        String imgPath="F:/testclob.txt";
        bigData.insertBlob(connection,imgPath);
    }

    @Test
    public void queryBlob(){
        bigData.queryBlob(connection,15906);
    }
}  

以上是关于深入浅出JDBC-操作时间与大对象(Clob/Blob)的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Mybaits

JDBC深入理解Statement和PreparedStatement

终结篇:MyBatis原理深入解析

#yyds干货盘点# 深入浅出 Spring Boot - 数据访问之 MyBatis

logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解

javaWeb_JDBC_面向对象编程在JDBC中的使用