使用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高级]
原文:http://blog.csdn.net/yuan514168845/article/details/18909887