可滚动的结果集和可更新的结果集
使用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(); } }