JDBC元数据,Blob用法总结

这篇博客总结了使用Java JDBC如何通过DatabaseMetaData类获取数据库元数据,包括表信息、列信息等,并介绍了ResultSetMetaData类的应用。同时,文章探讨了Blob对象在数据库中的操作,帮助读者理解JDBC在处理大型二进制数据时的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从上一篇博客中,我们知道,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();//关闭输入流
			}

当然,以上这些都是一些简单用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值