Jdbc数据库连接(2)

昨天有事耽搁啦jdbc写了一部分,今天继续更新。

6 时间类型

1 Java中的时间类型

java.sql包下给出三个与数据库相关的日期时间类型,分别是:

lDate:表示日期,只有年月日,没有时分秒。会丢失时间;

lTime:表示时间,有年月日时分秒;java中没有日期,在数据库中有日期和时间

lTimestamp:表示时间戳,有年月日时分秒,以及毫秒。

这三个类都是java.util.Date的子类。

java.util.Date -- 年月日时分秒

java.util.Calendar -- Date getTime()

java中查数据建议用Timestamp来接收查询

2 时间类型相互转换

把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用,不需要转换。

java.sql.Date date = …

java.util.Date d = date;

java.sql.Time time = …

java.util.Date d = time;

java.sql.Timestamp timestamp = …

java.util.Date d = timestamp;

当需要把java.util.Date转换成数据库的三种时间类型时,这就不能直接赋值了,这需要使用数据库三种时间类型的构造器。java.sql包下的DateTimeTimeStamp三个类的构造器都需要一个long类型的参数,表示毫秒值。创建这三个类型的对象,只需要有毫秒值即可。我们知道java.util.DategetTime()方法可以获取毫秒值,那么这个转换也就不是什么问题了。

java.utl.Date d = new java.util.Date();

java.sql.Date date = new java.sql.Date(d.getTime());//会丢失时分秒

Time time = new Time(d.getTime());

Timestamp timestamp = new Timestamp(d.getTime());

代码

 

 

我们来创建一个dt表:

 

CREATE TABLE dt(
  d DATE,
  t TIME,
  ts TIMESTAMP
)

 

下面是向dt表中插入数据的代码:

 

    @Test
    public void fun1() throws SQLException {
        Connection con = JdbcUtils.getConnection();
        String sql = "insert into dt value(?,?,?)";
        PreparedStatement pstmt = con.prepareStatement(sql);
        
        java.util.Date d = new java.util.Date();
        pstmt.setDate(1, new java.sql.Date(d.getTime()));
        pstmt.setTime(2, new Time(d.getTime()));
        pstmt.setTimestamp(3, new Timestamp(d.getTime()));
        pstmt.executeUpdate();
    }

 

下面是从dt表中查询数据的代码:

 

@Test
    public void fun2() throws SQLException {
        Connection con = JdbcUtils.getConnection();
        String sql = "select * from dt";
        PreparedStatement pstmt = con.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        
        rs.next();
        java.util.Date d1 = rs.getDate(1);
        java.util.Date d2 = rs.getTime(2);
        java.util.Date d3 = rs.getTimestamp(3);
        
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
    }
View Code

 

7 大数据

 

1 什么是大数据

所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:

 

类型

长度

tinyblob

28--1B256B

blob

216-1B64K

mediumblob

224-1B16M

longblob

232-1B4G

tinyclob

28--1B256B

clob

216-1B64K

mediumclob

224-1B16M

longclob

232-1B4G

 

 

 

 

 

 

mysql中没有提供tinyclobclobmediumcloblongclob四种类型,而是使用如下四种类型来处理文本大数据:

 

类型

长度

tinytext

28--1B256B

text

216-1B64K

mediumtext

224-1B16M

longtext

232-1B4G

首先我们需要创建一张表,表中要有一个mediumblob16M)类型的字段

 

CREATE TABLE tab_bin(
    id     INT     PRIMARY KEY AUTO_INCREMENT,
    filename    VARCHAR(100),
    data     MEDIUMBLOB
);
View Code

 

向数据库插入二进制数据需要使用PreparedStatement为原setBinaryStream(int, InputSteam)方法来完成。

 

    con = JdbcUtils.getConnection();
            String sql = "insert into tab_bin(filename,data) values(?, ?)";
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, "a.jpg");
            InputStream in = new FileInputStream("f:\\a.jpg");
            pstmt.setBinaryStream(2, in);
            pstmt.executeUpdate();

读取二进制数据,需要在查询后使用ResultSet类的getBinaryStream()方法来获取输入流对象。也就是说,PreparedStatementsetXXX(),那么ResultSet就有getXXX()

 

    con = JdbcUtils.getConnection();
            String sql = "select filename,data from tab_bin where id=?";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, 1);
            rs = pstmt.executeQuery();
            rs.next();
            
            String filename = rs.getString("filename");
            OutputStream out = new FileOutputStream("F:\\" + filename);
            
            InputStream in = rs.getBinaryStream("data");
            IOUtils.copy(in, out);
            out.close();
View Code

 

还有一种方法,就是把要存储的数据包装成Blob类型,然后调用PreparedStatementsetBlob()方法来设置数据

 

        con = JdbcUtils.getConnection();
        String sql = "insert into tab_bin(filename,data) values(?, ?)";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, "a.jpg");
        File file = new File("f:\\a.jpg");
        byte[] datas = FileUtils.getBytes(file);//获取文件中的数据
        Blob blob = new SerialBlob(datas);//创建Blob对象
        pstmt.setBlob(2, blob);//设置Blob类型的参数
        pstmt.executeUpdate();
        con = JdbcUtils.getConnection();
        String sql = "select filename,data from tab_bin where id=?";
        pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, 1);
        rs = pstmt.executeQuery();
        rs.next();
        
        String filename = rs.getString("filename");
        File file = new File("F:\\" + filename) ;
        Blob blob = rs.getBlob("data");
        byte[] datas = blob.getBytes(0, (int)file.length());
        FileUtils.writeByteArrayToFile(file, datas);
View Code

 

8 批处理

 PreparedStatement批处理

批处理就是一批一批的处理,而不是一个一个的处理!

当你有10SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理,即一次向服务器发送多条SQL语句,然后由服务器一次性处理。

PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。

 

    con = JdbcUtils.getConnection();
            String sql = "insert into stu values(?,?,?,?)";
            pstmt = con.prepareStatement(sql);
            for(int i = 0; i < 10; i++) {
                pstmt.setString(1, "S_10" + i);
                pstmt.setString(2, "stu" + i);
                pstmt.setInt(3, 20 + i);
                pstmt.setString(4, i % 2 == 0 ? "male" : "female");
                pstmt.addBatch();
            }
            pstmt.executeBatch();
View Code

 

jdbc的基础部分已经讲完啦,下面的jdbc的高级部分啦!

 

 

 

 

 

posted @ 2018-08-01 10:22  橱窗上的卡布奇诺  阅读(106)  评论(0编辑  收藏  举报