通用的DAO雏形

原创 2004年10月14日 09:25:00

原理:
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的工作。

完美的mybatis通用dao实现

场景:项目中用到mybatis(版本3.3.2)。对于单表操作,我们一开始是手写各个sql。但是这样接口非常不一致,而且有太多的小接口,不方便讲相似功能合并。而且由于实现不一致,不能只根据接口名判断具...
  • zhoujiaping123
  • zhoujiaping123
  • 2017年06月29日 13:39
  • 977

spring-data-jpa通用dao的扩展

虽然使用spring data jpa给开发带来了极大的简化,但对于追求更小更快的我们来说,要为每个实体都写一遍数据访问接口却仍显得过于繁琐。如果可以构建一个baseDao,里面配置好了基本的增删改查...
  • syf12354321
  • syf12354321
  • 2017年02月27日 17:48
  • 488

利用java的反射机制实现通用dao

java的反射机制前面已经讲过,这里不再赘述,这篇文章将会利用反射,来实现一个通用的dao层。 1 一般情况下的dao层我们先来看一下,通常,我们是如何写dao的。public class Perso...
  • qq_31655965
  • qq_31655965
  • 2016年08月15日 17:27
  • 1883

Hibernate通用Dao实现

Hibernate通用Dao实现@(Hibernate)[dao, hibernate, 反射]Hibernate通用Dao实现 BaseDao接口 BaseDao接口实现类 BaseDao接口pac...
  • q547550831
  • q547550831
  • 2016年12月02日 18:34
  • 3222

一种通用的DAO访问方法

在SpringMVC开发过程中各个层级需要编写大量重复代码,解决方法有三:其一、粘贴复制,似乎不少人这么干;其二,通过代码生成工具,设置变量替换大量文件;其三,构建通用方法实现代码复用。写者疲于复制,...
  • hanyueqi
  • hanyueqi
  • 2016年07月21日 17:16
  • 887

通用DAO之MyBatis封装,封装通用的增删改查(二)

曾经发过一篇文章,大概写的就是阿海多么多么厉害,见到某位同事在Hibernate的基础上封装了一下,就以一己之力开发什么什么框架,最后写了个超大的一坨的事。 那么,后续篇来了。阿海不是自负之人,当之...
  • guoshengkai373
  • guoshengkai373
  • 2016年05月20日 14:05
  • 31620

基于SSH编写通用的DAO、Service、Action实现

基于SSH编写通用的DAO、Service、Action
  • wu631464569
  • wu631464569
  • 2016年08月05日 17:42
  • 383

Spring-JDBC通用Dao

Spring-JDBC通用Dao(代码备份) jdbc是一种轻量级的xxx JdbcBaseDaoJdbcBaseDao接口,内容如下:package com.sun4j.core.jdbc.da...
  • rzg813
  • rzg813
  • 2016年05月09日 16:18
  • 1899

用JDBCTemplate实现的单表通用DAO,实现增删改查和统计

package com.nbport.xk.dao; import java.beans.PropertyDescriptor; import java.lang.reflect.Invocatio...
  • xiakan008
  • xiakan008
  • 2012年02月27日 14:44
  • 5514

JPA通用dao包设计

JPA通用dao包实现
  • u012722296
  • u012722296
  • 2017年11月30日 16:34
  • 57
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通用的DAO雏形
举报原因:
原因补充:

(最多只允许输入30个字)