从上一篇博客中,我们知道,Java通过JDBC获得连接后,得到一个Connection对象.咱们可以从这个对象中获得有关数据库管理系统的各种信息,包括数据库中各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个事先并不了解的数据库。
获得上面各个信息都是通过DatabaseMetaData类的对象上实现的,而DatabaseMetaData对象是在connection上获取的。
DatabaseMetaData类
•DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
–getURL():返回一个String类对象,代表数据库的URL。
–getUserName():返回连接当前数据库管理系统的用户名。
–isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
–getDatabaseProductName():返回数据库的产品名称。
–getDatabaseProductVersion():返回数据库的版本号。
–getDriverName():返回驱动驱动程序的名称。
–getDriverVersion():返回驱动程序的版本号。
–getCatalogs(): 返回一个ResultSet结果集,包含mysql里面有哪些数据库。
DatabaseMetaData data=connection.getMetaData();
//可以得到数据库本身的一些基本信息
int version = data.getDatabaseMajorVersion();
System.out.println(version);
String name= data.getDriverName();
System.out.println(name);
//得到Mysql中有哪些数据库,rs中只包含一列,所以用getString(1)方法获得第一列的字符串
rs= data.getCatalogs();
while(rs.next()){
System.out.println(rs.getString(1));
}
ResultSetMetaData类:
咋一看这个和ResultSet是不是很像?因为它就是从ResultSet中获得的,可得到结果集中的一些参数。
–getColumnName(int column):获取指定列的名称
–getColumnCount():返回当前ResultSet 对象中的列数。
–getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
–getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
–isNullable(int column):指示指定列中的值是否可以为 null。
– isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
ResultSetMetaData rsmd =resultSet.getMetaData();
//得到列的个数
int columnCount =rsmd.getColumnCount();
System.out.println(columnCount);
for(int i=0;i<columnCount;i++){
//得到列名
String columnName= rsmd.getColumnName(i+1);
//得到列的别名
String columnLabel =rsmd.getColumnLabel(i+1);
System.out.println(columnName+"&&&&"+columnLabel);
}
得到插入语句执行之后的主键:
1.使用重载的preparedStatement(sql,flag)来生成preparedStatement对象
2.通过调用preparedStatement的 getGeneratedKeys()方法获取结果集ResultSet。
connection=JDBCTools.getConnection();
String sql="insert into customer (name,email,birth) values(?,?,?); ";
//preparedStatement=connection.prepareStatement(sql);
//使用重载的prepareStatement(sql,flag)来生成PrepareStatement对象
preparedStatement=connection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "daming");
preparedStatement.setString(2, "1233@qq.com");
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
preparedStatement.executeUpdate();
//通过getGeneratedKeys()方法 得到的是执行该语句后得到的新生成的主键值
//返回一个结果集
//在resultSet中只有一列
ResultSet rs= preparedStatement.getGeneratedKeys();
if(rs.next()){
System.out.println(rs.getObject(1));
}
//得到该结果集对应的元数据对象,用于得到结果集中的列数
ResultSetMetaData rsmd = rs.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++){
System.out.println(rsmd.getColumnName(i+1));
//输出只有一列,即主键值。
}
BLOB:
LoB ,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。
•LOB 分为两种类型:内部LOB和外部LOB。
–内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:
•BLOB(二进制数据)
•CLOB(单字节字符数据)
•NCLOB(多字节字符数据)。
–CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等。
•MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
•MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
•实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果存储的文件过大,数据库的性能会下降。
步骤:需要注意的是:如果存储的文件过大,数据库的性能会下降。
前面的步骤与用preparedStatement对象执行插入语句一致。在插入BLOB对应的列的值时,调用setBlob()方法,传入一个列数和一个输入流。然后再执行executeUpdate()语句.
代码:
connection=JDBCTools.getConnection();
String sql="insert into customer (name,email,birth,picture)" +
" values(?,?,?,?); ";
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, "daming22");
preparedStatement.setString(2, "1233@qq.com");
preparedStatement.setDate(3, new Date(new java.util.Date()
.getTime()));
InputStream inputStream =new FileInputStream("zys.jpg");
//传入一个输入流
preparedStatement.setBlob(4, inputStream);
preparedStatement.executeUpdate();
相对应的,在读取blob的时候,也需要一个输出流:
调用resultSet的getBlob()方法得到一个blob对象。调用blob的getBinaryStream方法得到输入流,然后再使用IO操作即可。
connection =JDBCTools.getConnection();
String sql ="select id,name,email,birth,picture from customer where id =43";
preparedStatement =connection.prepareStatement(sql);
//得到结果集
resultSet =preparedStatement.executeQuery();
if(resultSet.next()){
int id= resultSet.getInt(1);
String name =resultSet.getString(2);
String email = resultSet.getString(3);
Blob b= resultSet.getBlob(5);
System.out.println(b);
System.out.println(id+","+name+","+email);
InputStream in =b.getBinaryStream();//输入流
OutputStream ous =new FileOutputStream("flower.jpg");
byte [] buffer =new byte[1024];
int len=0;
while((len=in.read(buffer))!= -1){
ous.write(buffer, 0, len);
}
ous.close();//关闭输出流
in.close();//关闭输入流
}
当然,以上这些都是一些简单用法。