JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob
来源:互联网 发布:网络兼职广告语 编辑:程序博客网 时间:2024/05/20 13:11
一、元数据
DatabaseMetaData类
DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
ResultSetMetaData 类
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:
getColumnName(int column):获取指定列的名称
getColumnCount():返回当前 ResultSet 对象中的列数。
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
isNullable(int column):指示指定列中的值是否可以为 null。
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
<span style="font-size:18px;">public class testDatabaseMeteData {/** * ResultSetMetaData 描述结果集的元数据 * 可以得到 结果集中有哪些列,列名(或别名) * 结合反射可以写出通用的查询方法 */@Testpublic void testResultSetMetaData(){Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = JDBC_Tools.getConnection();String sql = "select * from students";ps = conn.prepareStatement(sql);rs = ps.executeQuery();ResultSetMetaData rsmd = rs.getMetaData();//得到列的个数int columnCount = rsmd.getColumnCount();System.out.println(columnCount);for(int i = 0;i<columnCount;i++){//得到列名String columnName = rsmd.getCatalogName(i + 1);//得到列的别名String columnLabel = rsmd.getColumnLabel(i + 1);System.out.println(columnLabel+":"+columnName);}} catch (Exception e) {e.printStackTrace();}finally{JDBC_Tools.relaseSource(rs,conn, ps);}}/** * DatabaseMrtaData 是描述数据库的元数据对象 * 可以由Connection得到 */@Testpublic void test() {Connection conn = null;DatabaseMetaData data = null;ResultSet rs = null;try {conn = JDBC_Tools.getConnection();data = conn.getMetaData();//获取数据库版本号int version = data.getDatabaseMajorVersion();System.out.println(version);//获取连接到数据库的用户名String user = data.getUserName();System.out.println(user);//获取 连接到的数据库中有哪些数据库rs = data.getCatalogs();while(rs.next()){System.out.println(rs.getString(1));}} catch (Exception e) {e.printStackTrace();}JDBC_Tools.relaseSource(conn, null);}}</span>
二、取得数据库自动生成的主键
<span style="font-size:18px;">/** * 获取MySQL数据库自动生成的主键 * Oracle不会 */@Testpublic void test() {Connection conn = null;PreparedStatement ps = null;try {conn = JDBC_Tools.getConnection();String sql = "insert into customer(name ,email , birth)"+ "values(?,?,?)";//使用重载的PreparedStatement(sql,flag)ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);ps.setString(1, "a");ps.setString(2, "abc@163.com");ps.setDate(3, new Date(new java.util.Date().getTime()));ps = conn.prepareStatement(sql);ps.executeUpdate();//通过PreparedStatement.getGeneratedKeys()获取了//包含新生成主键的ResultSet对象(只有一列GENERATED_KEYS,用于存放新生成的主键值)ResultSet rs = ps.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));}} catch (Exception e) {e.printStackTrace();}}</span>三、Oracle LOB
LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。
LOB 分为两种类型:内部LOB和外部LOB。
内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle支持三种类型的内部LOB:
BLOB(二进制数据)
CLOB(单字节字符数据)
NCLOB(多字节字符数据)。
CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频,文件等。
目前只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。
MySQL BLOB 类型介绍
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。
MySQL的四种BLOB类型(除了在存储的最大信息量上不同外,他们是等同的)
实际使用中根据需要存入的数据大小定义不同的BLOB类型。 需要注意的是:如果存储的文件过大,数据库的性能会下降。
步骤:
1、插入空blob insert into javatest(name,content) values(?,empty_blob());
2、获得blob的cursor select content from javatest where name= ? for update; 注意: 须加for update,锁定该行,直至该行被修改完毕,保证不产生并发冲突。
3、利用 io,和获取到的cursor往数据库写数据流
演示LOB的读写
<span style="font-size:18px;">/** * 插入blob类型的数据必须使用PreparedStatement,因为Blob类型的数据无法用String拼写 */@Testpublic void test() {Connection conn = null;PreparedStatement ps = null;try {/** * Blob 写操作 */conn = JDBC_Tools.getConnection();String sql = "insert into temp(img) values(?)";ps = conn.prepareStatement(sql);ps.setBlob(1, new FileInputStream("C://Users//Kevy//Desktop//1.png"));ps.executeUpdate();/** * 使用getBlob() 读取blob数据 * 调用Blob 的getBinaryStream() 方法得到输入流, 然后IO ResultSet rs = ps.executeQuery();if(rs.next()){Blob picture = rs.getBlob(1);InputStream in = picture.getBinaryStream();OutputStream out = new FileOutputStream("C://Users//Kevy//Desktop//11.png");byte[] buf = new byte[1024];int len = 0;while((len = in.read(buf))!=-1){out.write(buf, 0, len);}out.close();in.close();}*/} catch (Exception e) {e.printStackTrace();}}</span>
- JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob
- JDBC( 八) 获取插入记录的主键。
- 使用JDBC获取插入记录的自增主键值
- jdbc取得插入记录的主键值
- JDBC_获取插入记录的主键值
- mybatis如何获取oracle新插入数据记录的主键?
- mybatis如何获取oracle新插入数据记录的主键?
- 用jdbc向数据库插入数据后获取生成的主键值
- JDBC 插入带有主键序列的记录
- JDBC笔记-BLOB和获取主键
- JDBC_获取插入记录的主键值(基于MySQL数据库)
- JDBC插入Oracle数据库有主键的X表记录时,获取此记录的主键ID。
- mybatis获取插入记录的主键
- JDBC插入数据库获取主键
- JDBC插入数据库获取主键
- JDBC对数据进行插入,更新或者是删除之后得到修改或者插入的那条记录的主键值
- MySql的Blob插入(JDBC)
- JDBC元数据,Blob用法总结
- php输出格式化的那点事
- CSS 文字跳动
- python 学习笔记
- <script>标签的问题
- 【设计模式】Java设计模式第二课之单例模式
- JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob
- 在Android上怎样实现JAVA和JS交互呢
- 【AppCan年会纪实】妹子奖金海岛游、奖奖奖拿拿拿
- (原创)尽管少写那么多代码,但省下来的时间又在哪里呢
- jBPM工作流应用
- CocurrentHashMap和Hashtable的区别
- 记录一次给mysql加日期分区的经历
- 使用Apache HttpClient发送get、post请求
- 关于socket应该被翻译为多孔插座