`
soleegn
  • 浏览: 147348 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Annotation的幻想

阅读更多

前一段各位老大都在Bolg里谈了自己对Annotation的看法,有说好的,有说坏的,我看只要是有用的都是好的。

最近在做一个项目,由于数据模型是动态的,而且出于性能方面的考虑只能舍弃hibernate,从头来做,回归到Spring+DAO+JDBC时代,其实比单纯的DAO+JDBC已经进步了许多了,毕竟不用去考虑事务问题了,方便多了... ...

但是hibernate本身还是有很多东西可以借鉴的,比方说新加入的Annotation包,摄取了XML配置,比原先的使用方法又方便了许多了~于是借鉴一下~

看看原先的代码:

java 代码
  1. List listResult = super.getJdbcTemplate().queryForList(sql);   
  2. if (listResult.size() > 0) {   
  3.     for (Iterator it = listResult.iterator(); it.hasNext();) {   
  4.         Map map = (Map) it.next();   
  5.         SysUser user = new SysUser();   
  6.         user.setId(map.get("SYSUSERID") != null ? map.get("SYSUSERID").toString() : "");   
  7.         user.setName(map.get("SYSUSERNAME") != null ? map.get("SYSUSERNAME").toString() : "");   
  8.         user.setAlias(map.get("SYSUSERALIAS") != null ? map.get("SYSUSERALIAS").toString() : "");   
  9.         user.setPassword(map.get("SYSUSERPASSWORD") != null ? map.get("SYSUSERPASSWORD").toString() : "");   
  10.         user.setDesc(map.get("SYSUSERDESC") != null ? map.get("SYSUSERDESC").toString() : "");   
  11.         user.setPhone(map.get("PHONE") != null ? map.get("PHONE").toString() : "");   
  12.         user.setMobile(map.get("MOBILE") != null ? map.get("MOBILE").toString() : "");   
  13.         user.setMail(map.get("MAIL") != null ? map.get("MAIL").toString() : "");   
  14.         user.setReverse1(map.get("SYSUSERREVERSE1") != null ? map.get("SYSUSERREVERSE1").toString() : "");   
  15.         user.setReverse2(map.get("SYSUSERREVERSE2") != null ? map.get("SYSUSERREVERSE2").toString() : "");   
  16.         user.setHeadShipId(map.get("HEADSHIPID") != null ? map.get("HEADSHIPID").toString() : "");   
  17.         user.setOrganizationId(map.get("ORGANIZATIONID") != null ? map.get("ORGANIZATIONID").toString() : "");   
  18.         user.setPositionId(map.get("POSITIONID") != null ? map.get("POSITIONID").toString() : "");   
  19.         user.setTitleId(map.get("TITLEID") != null ? map.get("TITLEID").toString() : "");   
  20.         list.add(user);   
  21.     }   
  22. }  

看看这段代码,多可怜满屏幕充斥着set方法,写的人头昏眼花的,辛苦的体验。

那考虑一下hibernate的做法,在PO中直接加入Annotation,直接对属性标注,告诉它“你和表中的XXX字段关联,并且你还是一个主键(你不是主键,不要自作多情的去当ID)”,这样就可以简化许多了!

可以直接去掉

java 代码
  1. for (Iterator it = listResult.iterator(); it.hasNext();) {   
  2.                             Map map = (Map) it.next();   
  3.                             SysUser user = new SysUser();   
  4.                             user.setId(map.get("SYSUSERID") != null ? map.get("SYSUSERID").toString() : "");   
  5.                             user.setName(map.get("SYSUSERNAME") != null ? map.get("SYSUSERNAME").toString() : "");   
  6.                             user.setAlias(map.get("SYSUSERALIAS") != null ? map.get("SYSUSERALIAS").toString() : "");   
  7.                             user.setPassword(map.get("SYSUSERPASSWORD") != null ? map.get("SYSUSERPASSWORD").toString() : "");   
  8.                             user.setDesc(map.get("SYSUSERDESC") != null ? map.get("SYSUSERDESC").toString() : "");   
  9.                             user.setPhone(map.get("PHONE") != null ? map.get("PHONE").toString() : "");   
  10.                             user.setMobile(map.get("MOBILE") != null ? map.get("MOBILE").toString() : "");   
  11.                             user.setMail(map.get("MAIL") != null ? map.get("MAIL").toString() : "");   
  12.                             user.setReverse1(map.get("SYSUSERREVERSE1") != null ? map.get("SYSUSERREVERSE1").toString() : "");   
  13.                             user.setReverse2(map.get("SYSUSERREVERSE2") != null ? map.get("SYSUSERREVERSE2").toString() : "");   
  14.                             user.setHeadShipId(map.get("HEADSHIPID") != null ? map.get("HEADSHIPID").toString() : "");   
  15.                             user.setOrganizationId(map.get("ORGANIZATIONID") != null ? map.get("ORGANIZATIONID").toString() : "");   
  16.                             user.setPositionId(map.get("POSITIONID") != null ? map.get("POSITIONID").toString() : "");   
  17.                             user.setTitleId(map.get("TITLEID") != null ? map.get("TITLEID").toString() : "");   
  18.                             list.add(user);   
  19.                         }  

我们交给一个方法,让它自行去进行数据的取出和封装~多方便!

这样可以,那么我们同样可以告诉一个PO ”你和数据库中的XXX表相关联,自己去做基本的CRUD吧~“你放心,只要方法处理得当就就可以去掉现在DAO实现层中的所有的基本CRUD方法。

思想再继续延伸下去,如果我们再PO的属性中标记出其他的信息,比方说告诉他“你和表示层上的XXX控件相对应”,其实request无非也就是个Map而已,一样的,我们可以直接通过Annotation的解释方法,把页面上传入Action层的与PO有关的简单信息直接封装到PO中,而无需再用一堆的set来设置值。

我们再看看ROR的做法,一个命令,生成数据库中对应的操作方法,简单CRUD页面,其实我们也可以这样做,用Annotation我们可以告诉PO对数据库上与谁关联,告诉页面又与谁关联~一个基于JAVA的ROR框架又出现了~~

呵呵,小弟不才,也就是想像,这样做其实就扔掉了JAVA本身的分层明确的优点,各个部分都耦合的不能再耦合了~

分享到:
评论
4 楼 soleegn 2007-04-17  
了解你的意思,上面的一堆SET我已经用元数据封装到一个方法中全部处理了。
3 楼 抛出异常的爱 2007-04-17  
 map.get("MAIL") != null ? map.get("MAIL").toString() : ""; 

MS可以用BeanUtil作。。。
2 楼 soleegn 2007-04-17  
小弟不才,努力重构中... ...
1 楼 抛出异常的爱 2007-04-17  
你不能写个东西把代码重构一下么
味道太大了。。。

相关推荐

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    Annotation手册

    7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

    自定义的Annotation

    在iOS开发中,Annotation是苹果地图(MapKit)框架中的一个重要概念,用于在地图上添加可视化标记,以展示特定地理位置的信息。自定义的Annotation则允许开发者根据需求个性化地图上的标注,比如添加图片、自定义...

    Annotation技术

    【Annotation技术】是Java语言中的一个重要特性,引入于JDK5,主要目的是为程序元素(如包、类、方法、变量等)添加元数据,即附加信息,这些信息可以被编译器、IDE工具或者运行时系统使用。Annotation不会直接改变...

    annotation

    在IT行业中,注解(Annotation)是Java编程语言的一个重要特性,它允许程序员在代码中嵌入元数据,提供了一种安全的方法来修饰程序元素,如类、方法、变量等。注解不会直接影响代码的执行,但它们可以被编译器或运行...

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    Annotation详细介绍(大全)

    Annotation是Java语言中的一种元数据,它提供了在代码中附加信息的能力,这些信息可以在编译时或运行时被解析和使用。Annotation的本质是一种特殊类型的注解,它允许开发者向编译器、JVM或者工具提供关于代码的额外...

    用Annotation简化Java程序的开发(PDF)

    ### 用Annotation简化Java程序的开发 #### 一、引言 随着软件开发技术的不断发展,特别是Java语言的广泛应用,开发者面临着如何有效地管理和配置代码的问题。传统的做法是使用XML文件来配置程序的各种设置,但这种...

    hibernate 注解 annotation 教程

    hibernate 注解 annotation 教程

    javax.annotation.jar

    javax.annotation.jar

    Hibernate Annotation jar

    这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...

    Hibernate Annotation 中文文档

    **Hibernate Annotation 中文文档** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。随着技术的发展,Hibernate Annotation逐渐成为主流,因为它提供了更直观、更简洁的方式来...

    compass annotation关联关系

    在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的关系更加清晰,简化了搜索引擎的集成工作。 一、Compass Annotation 概述 Compass Annotation ...

Global site tag (gtag.js) - Google Analytics