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



如何获得主键: 在数据库中,当我们设计表时常常会将不含有实际意义的主键设置为自增长,我们往这个表中插入数据的时候,数据库会我们自动分配一个主键,当我们往这个表的子表中插入数据时,会用到原表的主键,而我们并不知道主键是多少,如当我们设计账户表时,会将账户表中的账户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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值