`
逆风的香1314
  • 浏览: 1431392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

J2EE中几种面向对象的数据库映射访问策略:

阅读更多

几种面向对象的数据库访问策略:

1 JDBC
是最原始的方法,写sql语句,维护性差


下面面向对象的方法:

例如update: 要先取出对象,更新对象,然后再保存

OrderInfo order = orderService.getOrder(orderId);
order.setStatus(new Integer(2));
orderService.updateOrder(order);

2 Hibernate

使用Hql

3 iBatis
将查询和更新放在maps文件中

  <dynamic-mapped-statement name="searchProductList" result-map="result">
    select productid, name, descn, category from product
    <dynamic prepend="where">
      <iterate property="keywordList" open="(" close=")" conjunction="OR">
        lower(name) like #keywordList[]# OR lower(category) like #keywordList[]# OR lower(descn) like #keywordList[]#
      </iterate>
    </dynamic>

4 EasyDBO:

有三种实现方法,我们只看其中采用annotation的
@Table(tableName="Customer")
public class Customer implements Serializable {
来确定表名

采用反射的方法,不需要配置文件:
 public List getRootCustomers() {  
  return this.dao.query(Customer.class,"(parent_id is null or parent_id='')");
 }

  List list=dao.query(CustomerPrice.class, "customer_id="+cu.getId()+" and product_id="+p.getId()+" order by vdate desc");

该方法已经和ADODB很像了,但和adodb不同的是,仍然没有实现完全自动的Plain SQL转换到PO.

5 PHP's ADODB的j2ee移植

以jdbc查询sql为基础,通过反射,范型等方法自动装载。
adodb的方法和上面的easydbo很像,不过在obj到sql的生成上更加成熟一些,驱动也更加多

对于查询

    /////////////////////////////////////////////////////////////////////////////
    //Function: 完成ResultSet对象向ArrayList对象为集合的对象的转化
    //Para:sql,指定的查询Sql
   //Para:className,Sql相对应得JavaBean/FormBean类的名字
   //Return:以类className为一条记录的结果集,完成ResultSet对象向ArrayList对象为集//合的className对象的转化
  //////////////////////////////////////////////////////////////////////////////
  public ArrayList Select(String sql,String className){
    ArrayList paraList=new ArrayList();
    try{
      if (conn == null){
        Connection();
      }
      PreparedStatement stmt = conn.prepareStatement(sql);
      ResultSet rs = stmt.executeQuery();
      String recordValue="";
      Object c1=null;
      paraList=new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData();
      int columnCount = rsmd.getColumnCount();
      while (rs.next()){
          c1=Class.forName(className).newInstance();
          for (int i=1; i<=columnCount; i++) {
            if(rs.getString(rsmd.getColumnName(i))!=null){
              recordValue=rs.getString(rsmd.getColumnName(i));
            }else{
              recordValue="";
            }
            Method m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),new Class[]{recordValue.getClass()});
            m.invoke (c1, new Object[]{recordValue});
          }
          paraList.add(c1);
      }
    }catch(SQLException ex){
     
    }catch(ClassNotFoundException e){
    }catch(NoSuchMethodException e) {
    }catch(InvocationTargetException e){
    }catch (IllegalAccessException e){
    }catch(InstantiationException e){
    } finaly{
        closeConnection();
    return paraList;
    }
      }


   //Function:取得用户列表
  //Para:
  //Return:返回用户列表
  /////////////////////////////////////////////////////////////////////////////
  public ArrayList getUsers(){
      ArrayList ret=null;
      DatabaseManage db=new DatabaseManage();
      String sql=" select usr_id,usr_name "
          +" from users " ;  //该方法的好处是SQL可以随便写,需要的字段也可以随便写,甚至免去了持久层的LazyLoad
      ret=db.Select(sql,"com.domain.User");
      return ret;
  }

对于单张表,用PO/Formbean来存放
如果有关联多张表,需要一个VO/Map来存放

对于保存和更新
    检查对象里面的每一个属性,如果不是null,就组成SQL语句,
    更新的时候,先查出这个对象,如果属性不是null,并且属性值变了,才将该属性组成SQL语句
   
这种方法和Hibernate/Ibatis相比可能牺牲一些性能,但是免去了大量的配置文件,如果对字段有特殊的要求,可以
通过annotation来定义。

Annotation可是个好东西,根据jdk手册:Annotations can be read from source files, class files, or reflectively at run time.
所以可以充分利用反射读取annotation来减少代码。
下面是一些例子
@com.acme.util.Name(first=Alfred, middle=E., last=Neuman)
@Table(tableName="Customer")
@ManyToOne(column = "parent_id", fieldType=java.util.HashSet.class,type = Customer.class,lazy=false)
读取的方法是在反射里面使用下面的方法
<T extends Annotation> T xxx = getAnnotation(Class<T> annotationClass) 

当然,实现必须声明annotationClass,下面是手册的一个简单例子
/**
 * Describes the Request-For-Enhancement(RFE) that led
 * to the presence of the annotated API element.
   定义一个标签记号
 */
public @interface RequestForEnhancement {
    int    id();
    String synopsis();
    String engineer() default "[unassigned]";
    String date();    default "[unimplemented]";
}

这个标签,和它的属性都在上面声明了,下面是某个函数中需要用到这个标签的示例
@RequestForEnhancement(
    id       = 2868724,
    synopsis = "Enable time-travel",
    engineer = "Mr. Peabody",
    date     = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }

因此我们如果想要调用这个标签
for (Method m : Class.forName('假设是travelThroughTime所在的类名').getMethods()) {
         if (m.isAnnotationPresent(RequestForEnhancement.class)) {
             RequestForEnhancement rfe = m.getAnnotation(RequestForEnhancement.class);
             下面就可以取得rfe的属性了
         }
      }

Commons Attributes也是一个替代jdk标准annotation的方案


PHP中的ADODB之所以强大,高效是在于PHP数组的强大和弱变量定义的方便。

当然这里的每一个对象就相当于对应数据库的一张表,这样也很好。
因为在业务相当复杂的时候,关联要尽量少用,把业务精心设计在数据库表上面而非java对象的集合的关联上。
在大型应用中,一般1:1的关联都多使用View来处理关联,1:n和n:n的关联,建议还是在DAO里面手动保存,装载和更新


===================
此外还有一些方法,可以方便我们快速的将RS变成可操作的对象,简单举几个例子如下

1 commons dbutils

Custom RowProcessor

java.lang.Object[] toArray(java.sql.ResultSet rs)
          Convert a ResultSet row into an Object[].
 java.lang.Object toBean(java.sql.ResultSet rs, java.lang.Class type)
          Convert a ResultSet row into a JavaBean.
 java.util.List toBeanList(java.sql.ResultSet rs, java.lang.Class type)
          Convert a ResultSet into a List of JavaBeans.
 java.util.Map toMap(java.sql.ResultSet rs)
          Convert a ResultSet row into a Map.


Custom BeanProcessor


 java.lang.Object toBean(java.sql.ResultSet rs, java.lang.Class type)
          Convert a ResultSet row into a JavaBean.
 java.util.List toBeanList(java.sql.ResultSet rs, java.lang.Class type)
          Convert a ResultSet into a List of JavaBeans.


2 commons beanutils
ResultSetDynaClass (Wraps ResultSet in DynaBeans)

  Connection conn = ...;
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery
    ("select account_id, name from customers");
  Iterator rows = (new ResultSetDynaClass(rs)).iterator();
  while (rows.hasNext()) {
    DynaBean row = (DynaBean) rows.next();
    System.out.println("Account number is " +
                       row.get("account_id") +
                       " and name is " + row.get("name"));
  }
  rs.close();
  stmt.close();

============

总得来说,使用反射机制可以极大得方便对数据的各种操作,使操作变得更加透明,无需配置文件 

分享到:
评论

相关推荐

    J2EE中几种面向对象的数据库映射访问策略:.rar

    在J2EE(Java 2 Platform, Enterprise Edition)开发中,面向对象的数据库映射(Object-Relational Mapping,ORM)是一种重要的技术,它允许程序员使用面向对象的模型来操作数据库,而无需直接编写SQL语句。...

    j2ee编程连接数据库的几种方法

    本文将详细介绍几种常见的J2EE应用中连接数据库的方法,按照复杂度从高到低进行排列。 1. JDBC(Java Database Connectivity) JDBC是Java语言与各种数据库交互的标准接口。通过JDBC,开发者可以编写SQL语句,执行...

    利用Hibernate框架简化Java数据库访问

    Hibernate是一种实现对象/关系映射的轻量级框架,它对JDBC进行了封装,允许开发者使用面向对象的方式进行数据库操作。相比于传统的JDBC访问方式,Hibernate有以下优势: - **提高开发效率**:通过自动处理对象和...

    j2ee英文面试

    首先,Hibernate是一个开放源代码的对象关系映射(ORM)框架,它让开发者使用面向对象的方式来操作数据库。Hibernate的优点主要包括: a) 对象关系映射:能够将对象模型映射到关系数据库模式。 b) 数据库无关性:...

    J2EE架构师手册:如何成为一位成功的J2EE架构

    4. **Java Persistence API (JPA)**:JPA是J2EE中用于对象关系映射的规范,它允许开发者用面向对象的方式来操作数据库,减少了数据库访问的复杂性。 5. **JavaServer Faces (JSF)**:JSF是一种用于构建用户界面的...

    J2EE 新闻发布系统

    Hibernate是一个流行的JPA实现,提供了一套强大的工具,允许开发者以面向对象的方式处理数据库操作,提高了开发效率。 6. **JMS(Java Message Service)**:在大型系统中,JMS用于实现异步通信,例如在新闻发布时...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员能够用面向对象的方式处理数据库操作,而无需深入了解SQL语法或数据库API。通过将Java...

    基于Hibernate和Struts的J2EE应用开发 PDF

    1. **数据模型与逻辑模型之间的矛盾**:当前大多数数据库都是关系型数据库,而Java语言本质上是一种面向对象的语言。当对象需要通过SQL和JDBC进行数据库操作时,这种面向对象与面向关系的差异会导致编程效率降低,...

    j2ee开发完整代码

    它可以分为三种类型:Session Beans(会话bean)处理客户端交互,Message Driven Beans(消息驱动bean)处理消息队列,和Entity Beans(实体bean)映射数据库对象。 4. **JMS**:JMS提供异步通信的能力,使得应用...

    J2EE实训作业

    它简化了数据库操作,使开发者能使用面向对象的方式处理数据。 7. **JAF(JavaBeans Activation Framework)**:JAF用于处理MIME类型的对象,是JavaMail和JMS的基础组件。 8. **JSP EL(Expression Language)和...

    精通J2EE网络编程

    9. **Struts与Hibernate**:这两个开源框架也是J2EE开发中的常用工具,Struts是MVC框架,而Hibernate是对象关系映射(ORM)工具,能够简化数据库操作。 10. **Eclipse插件**:Eclipse是一款强大的集成开发环境(IDE...

    J2EE历年考试题目

    1. **Java基础**: 作为J2EE的基础,Java语言的基本语法、面向对象编程概念、异常处理、集合框架、IO流、多线程等是考试的重点。考生需要掌握这些基础知识,并能灵活运用到实际编程中。 2. **Servlet与JSP**: ...

    j2ee的课程设计

    通过JPA的EntityManager和Query接口,我们可以以面向对象的方式与数据库交互,而无需编写SQL语句。 3. **EJB**: EJB是企业级Java组件,它提供了服务器端的业务逻辑处理能力。在本课程设计中,登录注册功能被封装...

    j2EE面试题分类集合

    - **类与对象**:面向对象编程的基础,包括类的定义、对象的创建、封装、继承和多态。 - **异常处理**:了解try-catch-finally语句块,异常类层次结构以及自定义异常。 - **集合框架**:List、Set、Map接口的实现...

    数据映射方案.pdf

    在开发的过程中,将面向对象的程序与关系型数据库建立关系,是一件很麻烦的事情,而数据映射方案的提出,使得这个繁琐的工作可以简单化的实现。本章将介绍 O/R 映射技术来解决这个数据映射的问题,同时介绍 O/R 映射...

    J2EE的帮助文档(中文版) API 大全

    它简化了Java对象与数据库表之间的映射,使得开发者可以使用面向对象的方式处理数据。 8. **JAF(JavaBeans Activation Framework)**:JAF允许应用程序识别和处理未知的数据格式,提供了一套标准的激活和数据处理...

    SSH技术字典,J2EE主流应用框架

    - 将Java对象映射到数据库表中的记录,以及将表中的记录映射到Java对象。 2. **会话管理**: - 通过Session接口提供了一种与数据库交互的方式,Session是线程不安全的。 3. **查询语言**: - 提供了HQL...

    一些J2ee的课件绝对好用

    10. **JPA(Java Persistence API)** 和 **Hibernate**:提供了对象关系映射(ORM)的功能,使得开发者可以使用面向对象的方式操作数据库。 这些组件共同构成了强大的J2EE生态系统,为开发复杂的企业级应用提供了...

    J2EE开发之常用开源项目小记

    - **Hibernate**:是一个流行的ORM(对象关系映射)框架,允许开发者以面向对象的方式操作数据库,避免了直接编写SQL语句的繁琐。Hibernate支持多种映射方式,如继承映射和父子表映射。`bba96`是对Hibernate的扩展...

Global site tag (gtag.js) - Google Analytics