通用的DAO雏形

原理:
ResultSet可以看做是JDBC与数据库交互之后的,包含数据库表结构(ResultSetMetaData)的一个数据结构,有了这个结构之后,就可以获知其数据类型,字段名称等等。
利用JDBC中ResultSet接口提供的两个方法updateRow(), insertRow()来实现对数据的更新及插入。
在Update时,先执行一个空操作select * from test where 1<>1,这样结果虽然没有返回数据,但是却取到了数据库表的结构。然后再根据一些客户端返回参数的名称与值用updateXXX()就可以更新了。
在Delphi中的ClientDataSet时可以使用类似的技巧。(感谢我的同事王志峰对我Delphi的启蒙)
下面是一个简单的例子,包括了如何用这种方法来插入数据,并提供了三种方式的性能对比。
/*
 * Created on 2004-10-13
 */

/**
 * @author liuwei
 */

import java.sql.*;

public class TestResultSet {
 /**
  *更新操作
  *
  * @param s
  * @throws SQLException
  */
 public static void updateRow(Statement s) throws SQLException {
  ResultSet rs = s.executeQuery("Select * from test");
  rs.next();
  rs.updateString(1, "222");
  rs.updateString(2, "LiuWei");
  rs.updateObject(3, new Integer(3));
  rs.updateRow();
 }

 /**
  * 插入操作
  *
  * @param s
  * @throws SQLException
  */
 public static void insertRow(Statement s) throws SQLException {
  //读取空的结果集,从中取得表的结构
  ResultSet rs = s.executeQuery("Select * from test where 1<>1");
  for (int i = 0; i < 1000; i++) {
   rs.moveToInsertRow();
   rs.updateObject(1, new String("333"));
   rs.updateObject(2, new String("Leo"));
   rs.updateObject(3, new Integer(3));
   
   rs.insertRow();
  }
 }

 public static void main(String[] args) {
  Connection con = null;
  try {
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
   con = DriverManager
     .getConnection(
       "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pubs",
       "sa", "");
  //直接调用execute的操作
   long begin = System.currentTimeMillis();
   Statement s = con.createStatement();
   for (int i = 0; i < 1000; i++)
    s.execute("insert into test values('333','Leo', 3)");
   long end = System.currentTimeMillis();
   System.out.println(begin - end);
   s.execute("delete from test");

   //用ResultSet进行操作的性能测试
   Statement ss = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
     ResultSet.CONCUR_UPDATABLE);
   begin = System.currentTimeMillis();
   insertRow(ss);
   end = System.currentTimeMillis();
   System.out.println(begin - end);
   s.execute("delete from test");
  //用批处理的性能
   String sql = "insert into test values('333','Leo', 3)";
   begin = System.currentTimeMillis();
   Statement s3 = con.createStatement();
   for (int i = 0; i < 1000; i++)
    s3.addBatch(sql);
   s3.executeBatch();
   end = System.currentTimeMillis();
   System.out.println(begin - end);
   s.execute("delete from test");

   /*
    * while (rs.next()){ System.out.println(rs.getString(2)); }
    */
   con.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}
从结果中可以看出,这种方式的性能在不考虑读取表结构的操作时,还可接受(与直接insert性能查不多),但这种方式免去了用大量代码去拼Sql的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值