元数据
定义:描述数据的含义的一些信息
Jdbc为我们提供了多种元数据
1:表示数据库连接的元数据
DatabaseMetaData dmd=(DatabaseMetaData) conn.getMetaData();
通过用对象 dmd 来调用方法来获取信息
例如
System.out.println(dmd.getDatabaseProductName());//获取当前数据库名称
System.out.println(dmd.getDatabaseProductVersion());//获取数据库的版本
执行结果如下
2:获得数据库的元数据
public static void printResult(String sql) throws SQLException {
Connection conn=Jdbcutil.getConnection();
try(Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql)) {
//获得结果集的列数
ResultSetMetaData rmd=rs.getMetaData();
int count =rmd.getColumnCount();
System.out.println(sql+"列数为"+count);
for(int i=1;i<=count;i++) {
System.out.println(rmd.getColumnLabel(i)+"\t");//获取列名
System.out.println(rmd.getColumnTypeName(i));//获取当前列的类型
}
}
}
Jdbc对大数据的处理
思路
1:使用Connection。reateBlob()创建一个blob对象;
2:获得这个blob对象的输出流:setBinaryStream(1);
3:向流中写入字节;
4:通过ps.setBlob()将二进制存在数据库中
public static void main(String[] args) throws Exception {
String sql="insert into emp values(?,?,?)";
try(Connection conn=Jdbcutil.getConnection();
PreparedStatement ps=conn.prepareStatement(sql)){
Blob blob =conn.createBlob();//创建一个blob类型
OutputStream os=blob.setBinaryStream(1);//获得blob的输出流
//向os中输出图片
FileInputStream fis=new FileInputStream("F:\\AboutMywork\\MyWorkspase\\yy.png");
byte[] bs=new byte[100];
int size=-1;
while((size=fis.read(bs))!=-1) {
os.write(bs,0,size);
}
fis.close();
os.close();
ps.setBlob(1,blob);
ps.setString(2, "李白");
ps.setInt(3, 1);
ps.execute();
System.out.println("存入成功");
}
}
}
}
}
}
大对象的读取
1:查出resultSet
2:获得这个blob对象的出入流:setBinaryStream(1);
3:向流中写入字节,写到blob硬盘上,getBinaryStream();
String sql="select * from emp where empno=?";
try(Connection conn=Jdbcutil.getConnection();
PreparedStatement ps=conn.prepareStatement(sql)){
ps.setInt(1, empno);
ResultSet rs=ps.executeQuery();
if(rs.next()) {
System.out.println(rs.getString(2));
String fileName ="d:/"+rs.getString(3);
Blob b=rs.getBlob(1);
//写到blob硬盘上
InputStream is=b.getBinaryStream();
FileOutputStream fos =new FileOutputStream(fileName);
byte[] bs=new byte[100];
int size=-1;
while((size=is.read(bs))!=-1) {
fos.write(bs, 0, size);
}
fos.close();
is.close();
运行结果
返回生成的主键
如何获得数据库生成的主键
1.通过一个重载的prepareStatement(sql,int),来设置是否返回有数据库生成的主键,然后在使用ps。getGenereatedKeys();
String sql1="insert into emp(ename) valuse(?)";
String sql2="insert into hp valuse(null,?,?)";
Connection conn=Jdbcutil.getConnection();
conn.setAutoCommit(false);
try(
PreparedStatement ps=conn.prepareStatement(sql1,Statement.RETURN_GENERATED_KEYS);
PreparedStatement ps2=conn.prepareStatement(sql2);){
//插入emp
ps.setString(1, name);
ps.execute();
ResultSet rs=ps.getGeneratedKeys();
rs.next();
int empno=rs.getInt(1);
System.out.println(empno);
for(String s:hobby) {
ps2.setString(1, s);
ps2.setInt(2,empno);
ps2.execute();
}
}
}