日期:2013-05-27  浏览次数:20641 次

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

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});
          }
   &n