Java基础(十四)-----JDBC(三)[JDBC高级]

可滚动的结果集和可更新的结果集

       使用ResultSet的next方法可以遍历整个结果集,JDBC也提供了对结果集的一些处理,如设置结果集可滚动和可更新。为了从查询中获得可滚动的结果集,必须使用以下方法获得不同的Statement对象

Statement stmt = conn.createStatement(type,concurrency);或者

PreparedStament stmt=conn.prepareStatement(commond,type,concurrency);

通过设置type和concurrency的值来设置结果集的可滚动性和可更新性。

可更新的结果集用来对结果集进行更新,并且将这种更新反馈到数据库中,使得数据持久化。

代码示例:

package com.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Test6 {

	/**
	 * 可滚动的结果集。ResultSet结果集默认是可滚动的。
	 */
	public static void main(String[] args) {
		try
		{
			test_1();
			
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
	}

	//结果集不可滚动,结果集不可以更新数据库
	public static void test_1() throws SQLException
	{
		Connection conn=getConnection();
		
		//创建语句,并且指明结果集的属性---
		Statement stmt=conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
		
		String sql="select * from Person";
		//获得结果集
		ResultSet rs=stmt.executeQuery(sql);
		
		System.out.println(rs.getRow());
		//如果游标位于确定的行上面,返回true,反之,返回false;
		if(rs.previous())
		{
			System.out.println(rs.getString(2));
			
		}else
		{
			
			//将游标指定在第二行
			rs.absolute(2);
			System.out.println(rs.getString(2));
			//返回该游标的位置
			System.out.println(rs.getRow());
			//如果游标位于最后,返回true,反之,返回false
			System.out.println(rs.isLast());
		}
		
	}
	
	public static Connection getConnection()
	{
		Connection conn=null;
			//1,注册驱动
		try
		{
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			//2,获得连接
			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Persons", "root", "root");
		
			
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
		return conn;
	}

}

实例二:

package com.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Test7 {

	/**
	 *可更新的结果集
	 */
	public static void main(String[] args) {
		try
		{
			test_2();
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
		

	}
	//利用可更新结果集更新数据库
	public static void test_1() throws SQLException
	{
		Connection conn=getConnection();
		Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
		String sql="select * from Person";
		ResultSet rs=stmt.executeQuery(sql);
		while(rs.next())
		{
			if(rs.getString(2).equals("Adams"))
			{
				rs.updateString(2, "Wang");
				System.out.println("success!");
				//当完成对结果集的修改以后,只是修改了结果集,如果想要把这结果集反映到数据库中,爱需要加上下列语句
				rs.updateRow();
			}
		}
	}
	//利用可更新的结果集插入一条记录
	public static void test_2() throws SQLException
	{
		Connection conn = getConnection();
		
		Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
		
		String sql ="select * from Person";
		
		ResultSet rs=stmt.executeQuery(sql);
		//将结果集游标移动到插入行
		rs.moveToInsertRow();
		//进行更新操作
		rs.updateInt(1, 3);
		rs.updateString(2, "LI");
		rs.updateString(3, "Si");
		rs.updateString(4, "Beijing Road");
		rs.updateString(5, "Shanghai");
		//必须进行下列语句,才可以将结果插入数据库
		rs.insertRow();
		//当执行完插入以后,还可以将游标返回到调到插入行之前的行
		rs.moveToCurrentRow();
		System.out.println("更新成功");
	}
	
	
	private static Connection getConnection()
	{
		Connection conn=null;
		try
		{
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Persons", "root", "root");
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
		
		return  conn;
	}

}


元数据

        元数据是区别于数据库中数据,用来对数据库和表的结构进行描述的数据。元数据包括三种:关于数据库的元数据,关于结果集的元数据,关于预备语句参数的元数据。示例代码:

package com.jdbc;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class Test8 {

	/**
	 * 元素据的获取。
	 * 元素据是区别于数据库中的数据
	 * 元素据包括:关于数据库的数据,关于结果集的数据,关于预备语句参数的元数据
	 */
	public static void main(String[] args) {
		
		try
		{
			test_3();
		}catch(SQLException e)
		{
			e.printStackTrace();
		}

	}
	
	
	

		//获取结果集的元数据
	private static void test_2() throws SQLException
	{
		Connection conn=getConnection();
		
		Statement stmt =conn.createStatement();
		
		String sql="select * from person";
		
		ResultSet rs=stmt.executeQuery(sql);
		
		ResultSetMetaData meta=rs.getMetaData();
		for(int i=1;i<=meta.getColumnCount();i++)
		{
			
			String label=meta.getColumnLabel(i);
			int size=meta.getColumnDisplaySize(i);
			System.out.println("列名:"+label+" 大小:"+size+"");
		}
		
	}

	//获取数据库的元数据
	public static void test_1() throws SQLException 
	{
		Connection conn=getConnection();
		DatabaseMetaData meta=conn.getMetaData();
		ResultSet rs=meta.getTables(null, null, null, new String[]{"TABLE"});
		
		while(rs.next())
		{
			System.out.println(rs.getString(3));
		}
		
	}
	
	public static Connection getConnection()
	{
		Connection conn=null;
		try
		
		{
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/Persons","root","root");
			
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
		
		return conn;
		
	}

}


事务

       可以将一组语句构成事务,当所有的语句执行成功以后,事务可以被提交。否则,如果某个语句发生错误,事务将回滚,以免污染数据。代码示例:

package com.jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.Properties;

import com.mysql.jdbc.Driver;

public class Test9 {

	/**
	 * JDBC事务处理
	 */
	public static void main(String[] args) throws SQLException,IOException{
		try
		{
			test_1();
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
	
	}
	
	public static void test_1()  throws SQLException
	{
		Connection conn=getConnection();
		//数据库默认是自动提交,使用事务之前,应该讲自定提交关闭
		conn.setAutoCommit(false);
		Statement stmt=conn.createStatement();
		//将第一条语句放入到事务中
		stmt.executeUpdate("insert into Person values(4,‘Zhao‘,‘DeipingRD‘,‘Shanghai‘)");
		//将第二条语句放入到事务中
		stmt.executeUpdate("insert into person values(3,‘Wang‘,‘SouthRD‘,‘London‘)");
		//提交数据
		conn.commit();
		
		
	}
	//利用配置文件进行数据库连接
	public static Connection getConnection() 
	{
		Connection conn=null;
		Properties pros =new Properties();
		try
		{
			FileInputStream in =new FileInputStream("database.properties");
			pros.load(in);
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			String url=pros.getProperty("url");
			String username=pros.getProperty("username");
			String password=pros.getProperty("password");
			in.close();
			conn=DriverManager.getConnection(url,username,password);
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	
		return conn;
	
	}
	
	

}

在事务中还可以设置保存点,用于在事务回滚中更好的回滚到某一点而不是回滚到事务的开头。

批量更新

       可以将一系列的更新语句放在一起批量操作从而提高性能能。注意:只能是更新语句,当遇到查询语句时,会报错。

代码示例:

package com.jdbc;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class Test10 {

	public static void main(String[] args) {
		
		try
		{
			test_1();
		}catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public static void test_1() throws SQLException
	
	{
		Test9 demo=new Test9();
		Connection conn=demo.getConnection();
		Statement stmt=conn.createStatement();
		//将所有的更新语句放入到stmt中
		stmt.addBatch("insert into person values(5,‘李刚‘,‘上海路‘,‘广州‘)");
		stmt.addBatch("insert into person values(6,‘王磊‘,‘武汉路‘,‘武汉‘)");
		//批量更新
		stmt.executeBatch();
	}

}



Java基础(十四)-----JDBC(三)[JDBC高级]

上一篇:[转载]MongoDB学习 (六):查询


下一篇:[转载]MongoDB开发学习(1)开天辟地,经典入门