仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1628|回复: 20
打印 上一主题 下一主题

[学习教程] PHP教程之J2EE中几种面向对象的数据库映照会见策...

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。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();
============
总得来讲,利用反射机制可以极大得便利对数据的各类操作,使操作变得加倍通明,无需设置装备摆设文件


通过这段时间的学习实践,对软件开发有了更多新的认识,不在局限于之前的片面性。当然,现在所学到的东西其实并不多,离当一个真正的程序员,还有很大的差距。
柔情似水 该用户已被删除
沙发
发表于 2015-2-4 10:03:28 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-2-9 22:03:39 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
活着的死人 该用户已被删除
地板
发表于 2015-2-10 06:52:31 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
简单生活 该用户已被删除
5#
发表于 2015-2-28 23:54:22 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
飘飘悠悠 该用户已被删除
6#
发表于 2015-3-9 23:53:57 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
再见西城 该用户已被删除
7#
发表于 2015-3-13 07:09:42 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
海妖 该用户已被删除
8#
发表于 2015-3-20 16:25:33 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
分手快乐 该用户已被删除
9#
发表于 2015-3-22 19:16:06 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
谁可相欹 该用户已被删除
10#
发表于 2015-3-26 19:23:14 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
老尸 该用户已被删除
11#
发表于 2015-3-31 02:36:08 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
兰色精灵 该用户已被删除
12#
发表于 2015-4-1 20:10:07 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
山那边是海 该用户已被删除
13#
发表于 2015-4-6 20:27:01 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
莫相离 该用户已被删除
14#
发表于 2015-4-7 15:44:23 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
若天明 该用户已被删除
15#
发表于 2015-4-9 15:18:56 | 只看该作者
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
admin 该用户已被删除
16#
发表于 2015-4-11 07:08:49 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
冷月葬花魂 该用户已被删除
17#
发表于 2015-4-15 03:07:57 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
第二个灵魂 该用户已被删除
18#
发表于 2015-4-15 21:20:53 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
精灵巫婆 该用户已被删除
19#
发表于 2015-4-23 18:38:39 | 只看该作者
实践是检验自己会不会的真理。
只想知道 该用户已被删除
20#
发表于 2015-4-29 17:32:26 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表