JDBC中关于如何获得主键、处理二进制文件、使用元数据

来源:互联网 发布:户外爬山软件 编辑:程序博客网 时间:2024/06/03 23:07


如何获得主键: 在数据库中,当我们设计表时常常会将不含有实际意义的主键设置为自增长,我们往这个表中插入数据的时候,数据库会我们自动分配一个主键,当我们往这个表的子表中插入数据时,会用到原表的主键,而我们并不知道主键是多少,如当我们设计账户表时,会将账户表中的账户id设置为主键,并将它设置为自增长,当我们往账户表的从表用户表中插入数据时,就需要用到账户表中的账户id。下面我讲述的便是如何获得数据库自动生成的主键。

    conn=DriverManager.getConnection(url,"root","root");    //使用prepareStatement(sql,int)方法,将int的值设为RETURN_GENERATED_KEYS,表示返回新插入语句中自动增长的主键值    ps1=conn.prepareStatement("insert into account values(null,5000)", Statement.RETURN_GENERATED_KEYS);    ps1.execute();    //获得主键结果集    ResultSet rs=ps1.getGeneratedKeys();    rs.next();    System.out.println(rs.getInt(1));    ps2=conn.prepareStatement("insert into users values(null,?,?)");    ps2.setInt(1, rs.getInt(1));    ps2.setString(2, "hsy");    ps2.execute();
当我们创建PreparedStatement时,调用含有两个参数的preparedStatement(sql,int)方法,将int的值设为RETURN_GENERATED_KEYS,表示返回新插入语句中自动增长的主键值,再调用PreparedStatement.getGeneratedKeys()便能获得主键值的结果集。
处理二进制文件:存储二进制文件的步骤1、创建blob 2、向blob中写入数据 3、将blob写到数据库中。
   conn=DriverManager.getConnection(url,"root","root");   ps1=conn.prepareStatement("insert into bookinfo values(null,?,?,?)");   ps1.setString(1, "斗破苍穹");   ps1.setString(2, "青年文学出版社");   //创建blob   Blob pic=conn.createBlob();   //向blob中写入字节   OutputStream os=pic.setBinaryStream(1);   fis=new FileInputStream("D:/1.jpg");   byte[] b=new byte[fis.available()];   fis.read(b);   os.write(b);   //将blob写到数据库中   ps1.setBlob(3, pic);   ps1.execute();
Blob.setBinaryStream(pos)中的参数pos表示的是从这个流的哪个位置开始写,起始位置为1。当我们用Blob.setBinaryStream(pos)方法创建出一个输出流后,我们操作这个流,其实就是操作Blob。
读取二进制文件的步骤1、获得blob的字节流(Blob.pic.getBinaryStream()) 2、将Blob中的字节写到字节数组中 3、将字节数组中的数据写到文件中。
元数据的应用:元数据就是描述数据的数据。当我们在执行sql语句时,也许我们并不知道列的名称,列的数量,列的类型,我们便不能写出相应的sql语句,这时我们便需要用到元数据,如何获得一个sql中所涉及的元数据,我们需要用到ResultSetMetaData接口,这个接口是用来储存记录集的元数据,用ResultSet.getMetaData()来获得。
   conn=DriverManager.getConnection(url,"root","root");   ps1=conn.prepareStatement("select * from student");   ResultSet rs=ps1.executeQuery();   ResultSetMetaData rsmd=rs.getMetaData();   //得到列的数量   int count=rsmd.getColumnCount();   System.out.println(count);   //得到列的数据类型   for(int i=1;i<=count;i++){           System.out.println(rsmd.getColumnTypeName(i));   }   //得到列的名称   for(int i=1;i<=count;i++){   System.out.println(rsmd.getColumnLabel(i));   }
在获得列名时,可以使用ResultSetMetaData.getColumnType(column)和ResultSetMetaData.getColumnName(column)这两个方法,其区别就是前者是获得别名,后者是获得原始名,在实际应用中我们常使用前者,因为如果使用获得原始名的方法就是使得你sql语句中设置别名变得没有任何意义。

阅读全文
1 0
原创粉丝点击