在学习过程中,对于对mysql中元数据以及对大数据的处理的理解。
有理解错误的地方请批评改正。
元数据
用来描述数据特性的一组数据
包括要描述数据的属性等各种性质。
通过元数据来获得数据库中表数据的属性。
表示数据库连接的元数据;
DatabaseMetaData dmd=conn.getMetaData();
表示结果集的元数据;
ResultSetMetaData rmd=result.getMetaData();
为我们提供的方法有:
getCatalogName(int column) 获取指定列的表目录名称。
getColumnCount():获得结果集的列数;
getColumnLabel():获得列名
getColumnType():获得列的数据类型;
具体方法查询JavaAPI
[官网下载api教程](https://jingyan.baidu.com/article/c1465413a847bf0bfcfc4cd6.html)
代码如下:
```
public static void main(String[] args) {
try {
print("select * from book");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String sql="select b.* ,bs.count from book b left join bookstore bs on b.bookid=bs.bookid";
try {
print(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 该方法通过调用元数据的几种方法来获取表数据的各种属性
* @param sql
* @throws SQLException
*/
public static void print(String sql) throws SQLException {
Connection conn=JdbcUtil.getConnection();
try(Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql)){
ResultSetMetaData rmd=rs.getMetaData();
//获取mysql的信息
try {
DatabaseMetaData dad=conn.getMetaData();
System.out.println(dad.getDatabaseProductVersion());
System.out.println(dad.getDatabaseProductName());
System.out.println(dad.getDriverName());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取表的列数
int count =rmd.getColumnCount();
System.out.println(count);
//获取表的列名
for(int i=1;i<=count;i++) {
System.out.print(rmd.getColumnLabel(i)+"\t");
}
System.out.println();
//获取表的列的数据类型
for(int i=1;i<=count;i++) {
System.out.print(rmd.getColumnTypeName(i)+"\t");
}
System.out.println();
//获取表的数据
while(rs.next()){
for(int i=1;i<=count;i++) {
System.out.print(rs.getString(i)+"\t");
}
System.out.println();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
JDBC对大数据的处理
jdbc对大数据的处理;
实现步骤
1、使用Connection.createBlob()创建一个blob对象;
2、获得这个blob 对象的输出流;setBinaryStream(1);
3、向流中写入字节;
4、通过ps.setBlob()将二进制存在数据库中;
代码如下:
/**
* 从数据库中读取大数据
* @param empno
* @throws SQLException
* @throws IOException
*/
public static void read(int empno) throws SQLException, IOException {
String sql="select * from emp where empno=?";
//创建与数据库的连接
try(Connection conn=JdbcUtil.getConnection();
PreparedStatement ps=conn.prepareStatement(sql)
){
ps.setInt(1, empno);
//创建blob类型
Blob blob=conn.createBlob();
ResultSet rs=ps.executeQuery();
if(rs.next()) {
blob=rs.getBlob(4);
String filename="d:/"+rs.getString(3);
//获得blob的输入流;
InputStream is=blob.getBinaryStream();
FileOutputStream fos=new FileOutputStream(filename);
byte[] b=new byte[100];
int size=-1;
while((size=is.read(b))!=-1) {
fos.write(b, 0, size);
}
is.close();
fos.close();
}else {
System.out.println("没有此人");
}
}
}
/**
* 向数据库中写入大数据
* @param dir
* @throws SQLException
* @throws IOException
*/
public static void write(String dir) throws SQLException, IOException {
String sql="insert into emp values(null,?,?,?)";
try(Connection conn =JdbcUtil.getConnection();
PreparedStatement ps=conn.prepareStatement(sql) ){
Blob blob=conn.createBlob();
OutputStream os=blob.setBinaryStream(1);
FileInputStream fis=new FileInputStream(dir);
byte[] b=new byte[100];
int size=-1;
while((size=fis.read(b))!=-1) {
os.write(b);
}
fis.close();
os.close();
ps.setString(1, "图片");
ps.setString(2,"鸣人");
ps.setBlob(3, blob);
ps.execute();
System.out.println("图片已入库");
}
}
通过对大数据的处理,我觉得大数据就是将大数据转化为字节流,在对字节流进行处理。由之前所学过的知识对大数据进行存入取出,甚至修改等操作。
如何获得数据库生成的主键
通过一个重载的prepareStatement(sql,int);来设置是否返回由数据库生成的主键 ;然后再使用ps.getGenereatedKeys()来获得包含主键的结果集;
PreparedStatement ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
ps.execute();
//获得生成的主键;
ResultSet keys=ps.getGeneratedKeys();
keys.next();
System.out.println("生成的主键是:"+keys.getInt(1));
通过获取主键