26、jdbc操作数据库(3)

1、结果集的元数据操作

 ResultSetMetaData 是描述ResultSet的元数据对象,可以通过元数据对象获取结果集的列信息,使用方式如下:

public void query() {
	Connection connection = DBUtil.getConnection();
	String sql = "SELECT ID,UNAME u,PASSWORD FROM USER";
	PreparedStatement prepareStatement = null;
	ResultSet resultSet = null;
	try {
		prepareStatement = connection.prepareStatement(sql);
		//获取到结果集CallableStatement
		resultSet = prepareStatement.executeQuery();
		// 通过  结果集的getMetaData() 获取到元数据对象
		ResultSetMetaData metaData = resultSet.getMetaData();
		System.out.println("获取数据列数"+metaData.getColumnCount());
		System.out.println("第二列的字段名是:"+metaData.getColumnName(2));
		System.out.println("第二列的字段别名是:"+metaData.getColumnLabel(2));
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		DBUtil.close(resultSet, prepareStatement, connection);
	}
}

2、使用jdbc进行批量处理

当一次处理多条记录时,可使用jdbc进行批量操作,其基本思路是现将要执行的sql进行积攒,然后一次性发送到数据库进行执行,示例代码如下:

//获取连接
Connection connection = DBUtil.getConnection();
String sql = "INSERT INTO USER (uname , password) VALUES (? , ?)";
PreparedStatement prepareStatement = null;
try {
	//这里一定要注意,mysql是自动提交事务的,所以这里一定要先关闭自动提交
	connection.setAutoCommit(false);
	//通过数据库连接获取数据库操作对象
	prepareStatement = connection.prepareStatement(sql);
	// 组装sql、积攒sql
	for (int i = 0; i < 10000; i++) {
		prepareStatement.setObject(1, "zhangsan"+i);
		prepareStatement.setObject(2, i);
		prepareStatement.addBatch();
	}
	//一次性发送到数据库执行
	prepareStatement.executeBatch();
	//手动提交事务
	connection.commit();
} catch (SQLException e) {
	e.printStackTrace();
} finally {
	//关闭资源
	DBUtil.close(null, prepareStatement, connection);
}

3、使用jdbc调用存储过程、函数

当调用存储过程或者函数时,需要使用到 CallableStatement 类,使用的代码实例如下:

//存储过程
CREATE  PROCEDURE add(IN a INT , OUT b INT )
BEGIN
	SET b = a * 10;
END

//jdbc调用存储过程 add()

//获取连接
Connection connection = DBUtil.getConnection();
//写sql,使用       {CALL 存储过程|函数}  方式调用
String sql = "{CALL getUser(?,?)}";
//获取 CallableStatement 对象
CallableStatement callableStatement = null;
try {
	callableStatement = connection.prepareCall(sql);
	//设置传入的参数
	callableStatement.setInt(1, 256);
	//执行存储过程
	callableStatement.execute();
	//因为第二个参数是OUT类型,所以这里可以获取到
	int result = callableStatement.getInt(2);
	System.out.println(result);
} catch (SQLException e) {
	e.printStackTrace();
} finally {
	DBUtil.close(null, callableStatement, connection);
}

4、使用jdbc处理事务

使用jdbc操作事务时,首先要关闭mysql的自动提交,最后手动提交,实例代码如下:

//获取连接
Connection connection = DBUtil.getConnection();
String sql = "UPDATE USER SET UNAME = ? WHERE ID = 1";
String sql2 = "UPDATE USER SET UNAME = ? WHERE ID = 2";
try {
	//关闭自动提交,开启事务
	connection.setAutoCommit(false);
	PreparedStatement statement1 = connection.prepareStatement(sql);
	statement1.setString(1, "czp");
	statement1.execute();
	int a=10 / 0;//这里出现错误,则回滚
	PreparedStatement statement2 = connection.prepareStatement(sql2);
	statement2.setString(1, "java");
	statement2.execute();
	//主动提交事务
	connection.commit();
} catch (SQLException e) {
	//出现错误时,回滚
	try {
		connection.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
	e.printStackTrace();
} finally {
	DBUtil.close(null, null, connection);
}