JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob

一、元数据

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 描述结果集的元数据
	 * 可以得到 结果集中有哪些列,列名(或别名)
	 * 结合反射可以写出通用的查询方法
	 */
	@Test
	public 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得到
	 */
	@Test
	public 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不会
	 */
	@Test
	public 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, "[email protected]");
			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拼写
	 */
	@Test
	public 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>
时间: 2024-10-03 22:38:07

JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob的相关文章

初学JDBC,获取插入记录的主键、执行批量操作

一.获取插入记录主键值 在创建语句的地方使用Statement.RETURN_GENERATED_KEYS标识一下,然后通过getGeneratedKeys方法获得 preparedStatement=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); preparedStatement.excuteUpdate(); resultSet=preparedStatement.getGeneratedKeys();//主键有可能有

MyBatis 插入时返回刚插入记录的主键值

MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java 1 package cn.com.zfc.model; 2 3 public class User { 4 5 private Integer id; 6 private String name; 7 private String password; 8 9 public Integer getId() { 10 retur

Mybaits插入记录返回主键值

某些情况进行insert时不知道主键值(主键为自增),例如系统新增用户时,有用户序号(主键 自增),用户名,密码.插入时只需插入用户名和密码,之后取得mysql自增的序号. 如下为mysql的usr表结构: 对应的实体类 Mapper parameterType:参数类型,此处为实体类的完整路径.(可省略,mybatis会自动识别参数类型). useGeneratedKeys:令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 M

MyBatis+MySQL 返回插入记录的主键ID

今天用到了多个表之间的关系,另一个表中的一个字段要以第一个表的主键作为外键. 下面说两种方法,MyBatis+MySQL 返回插入记录的主键ID: 第一种: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into us

IBatisNet:让insert操作返回新增记录的主键值

项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目目录结构: 项目中使用ibatis做数据访问层已经有好长时间了.开发小组成员反映ibatis的insert操作返回的结果是null,这一点很是不爽. 其实,大家都是希望能够把新增记录的主键值返回出来. 上上周,大家有反编译ibatis的包,查看其实现原理,后来,又尝试其他方法,都没能给实现这个功能.

JDBC学习笔记(6)——获取自动生成的主键值&amp;处理Blob&amp;数据库事务处理

获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: 1 /** 2 * 获取数据库自动生成的主键 3 */ 4 @Test 5 public void testGetKeyValues(){ 6 Connection connection=null; 7 PreparedStatement preparedStatement=null; 8 ResultSet rs=n

MyBatis返回插入记录的主键

如果想插入一条记录之后,立刻对其进行其他操作,这时候就需要获取记录的主键(通常是ID),MyBatis有以下方式处理. Dao层的接口定义如下: void importUser(@Param( "user" ) User user); 注意:这里不能因为要返回主键而定义接口的返回值类型为String或者int,会报错. xml配置文件: <insert id= "importUser" useGeneratedKeys = "true" k

mybatis insert语句 返回插入的记录的主键值

Map<String,Object> paymentMp = new HashMap<String,Object>();        paymentMp.put("amount", 12.0 );        paymentMp.put("pay", Attributes.Payment_Pay_No);        paymentMp.put("status", Attributes.Payment_Status_

Mybatis获取插入自增主键

只需在插入语句上配置: useGeneratedKeys="true" keyProperty ="id" <insert id="insertSelectiveMemberAcc" useGeneratedKeys="true" keyProperty="id" parameterType="com.member.domain.MemberAccInfo">     ins