通用的DAO雏形

2024-01-13 13:32
文章标签 通用 雏形 dao

本文主要是介绍通用的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的工作。

这篇关于通用的DAO雏形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601629

相关文章

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

j2EE通用jar包的作用

原文:http://blog.sina.com.cn/s/blog_610901710101kx37.html IKIKAnalyzer3.2.8.jar // 分词器 ant-junit4.jar // ant junit antlr-2.7.6.jar // 没有此包,hibernate不会执行hql语句。并且会报NoClassDefFoundError: antlr

通用内存快照裁剪压缩库Tailor介绍及源码分析(一)

背景 我们知道内存快照是治理 OOM 问题及其他类型的内存问题的重要数据源,内存快照中保存了进程虚拟机的完整的堆内存数据,很多时候也是调查其他类型异常的重要参考。但是dump出来的堆转储文件.hprof往往很大,以 LargeHeap 应用为例,其 OOM 时的内存快照大小通常在512M左右,要有效的存储和获取都是一个问题。 线下拿到hprof文件相对容易,也可以预防OOM,但覆盖的场景十分有

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

数据结构(邓俊辉)学习笔记】排序 5——选取:通用算法

文章目录 1. 尝试2. quickSelect3.linearSelect:算法4. linearSelect:性能分析5. linearSelect:性能分析B6. linearSelect:性能分析C 1. 尝试 在讨论过众数以及特殊情况下中位数的计算方法以后,接下来针对一般性的选取问题,介绍优化的通用算法。 既然选取问题的查找目标就是在整个数据集中按大小次序秩为 k

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x&... 有时,有两个或多个类,其功能是相同的,仅仅是数

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我们在项目中如何灵活应用hibernate,也会给项目维护以及项目开发带来便利,下面我将展示我们项目中是如何来对hibernate进行应用和操作。 【目录】              -

设计之道:ORM、DAO、Service与三层架构的规范探索

引言: 实际开发中,遵守一定的开发规范,不仅可以提高开发效率,还可以提高项目的后续维护性以及项目的扩展性;了解一下本博客的项目设计规范,对项目开发很有意义 一、ORM思想 ORM(Object-Relational-Mapping)在对象模型和关系型模型之间做一个映射(转换)。 目的是为了解决面向对象编程语言的发展和关系型数据库的发展不匹配的问题 可以理解为: 将Java中的数据结

NXP,S32K1XX汽车通用微控制器开发笔记

文章目录 1. 概述2. 开发环境配置2.1 S32 Design Studio2.2 安装SDK2.3 新建demo工程2.4 字体配置2.5 按需求修改demo2.5.1 修改pin脚定义2.5.2 增加串口打印功能 2.6 编译代码2.7 debuger 配置 参考 1. 概述 S32K1系列32位微控制器(MCU)提供基于Arm® Cortex®-M的MCU,以及基