如何获得主键: 在数据库中,当我们设计表时常常会将不含有实际意义的主键设置为自增长,我们往这个表中插入数据的时候,数据库会我们自动分配一个主键,当我们往这个表的子表中插入数据时,会用到原表的主键,而我们并不知道主键是多少,如当我们设计账户表时,会将账户表中的账户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语句中设置别名变得没有任何意义。