前一段各位老大都在Bolg里谈了自己对Annotation的看法,有说好的,有说坏的,我看只要是有用的都是好的。
最近在做一个项目,由于数据模型是动态的,而且出于性能方面的考虑只能舍弃hibernate,从头来做,回归到Spring+DAO+JDBC时代,其实比单纯的DAO+JDBC已经进步了许多了,毕竟不用去考虑事务问题了,方便多了... ...
但是hibernate本身还是有很多东西可以借鉴的,比方说新加入的Annotation包,摄取了XML配置,比原先的使用方法又方便了许多了~于是借鉴一下~
看看原先的代码:
java 代码
- List listResult = super.getJdbcTemplate().queryForList(sql);
- if (listResult.size() > 0) {
- for (Iterator it = listResult.iterator(); it.hasNext();) {
- Map map = (Map) it.next();
- SysUser user = new SysUser();
- user.setId(map.get("SYSUSERID") != null ? map.get("SYSUSERID").toString() : "");
- user.setName(map.get("SYSUSERNAME") != null ? map.get("SYSUSERNAME").toString() : "");
- user.setAlias(map.get("SYSUSERALIAS") != null ? map.get("SYSUSERALIAS").toString() : "");
- user.setPassword(map.get("SYSUSERPASSWORD") != null ? map.get("SYSUSERPASSWORD").toString() : "");
- user.setDesc(map.get("SYSUSERDESC") != null ? map.get("SYSUSERDESC").toString() : "");
- user.setPhone(map.get("PHONE") != null ? map.get("PHONE").toString() : "");
- user.setMobile(map.get("MOBILE") != null ? map.get("MOBILE").toString() : "");
- user.setMail(map.get("MAIL") != null ? map.get("MAIL").toString() : "");
- user.setReverse1(map.get("SYSUSERREVERSE1") != null ? map.get("SYSUSERREVERSE1").toString() : "");
- user.setReverse2(map.get("SYSUSERREVERSE2") != null ? map.get("SYSUSERREVERSE2").toString() : "");
- user.setHeadShipId(map.get("HEADSHIPID") != null ? map.get("HEADSHIPID").toString() : "");
- user.setOrganizationId(map.get("ORGANIZATIONID") != null ? map.get("ORGANIZATIONID").toString() : "");
- user.setPositionId(map.get("POSITIONID") != null ? map.get("POSITIONID").toString() : "");
- user.setTitleId(map.get("TITLEID") != null ? map.get("TITLEID").toString() : "");
- list.add(user);
- }
- }
看看这段代码,多可怜满屏幕充斥着set方法,写的人头昏眼花的,辛苦的体验。
那考虑一下hibernate的做法,在PO中直接加入Annotation,直接对属性标注,告诉它“你和表中的XXX字段关联,并且你还是一个主键(你不是主键,不要自作多情的去当ID)”,这样就可以简化许多了!
可以直接去掉
java 代码
- for (Iterator it = listResult.iterator(); it.hasNext();) {
- Map map = (Map) it.next();
- SysUser user = new SysUser();
- user.setId(map.get("SYSUSERID") != null ? map.get("SYSUSERID").toString() : "");
- user.setName(map.get("SYSUSERNAME") != null ? map.get("SYSUSERNAME").toString() : "");
- user.setAlias(map.get("SYSUSERALIAS") != null ? map.get("SYSUSERALIAS").toString() : "");
- user.setPassword(map.get("SYSUSERPASSWORD") != null ? map.get("SYSUSERPASSWORD").toString() : "");
- user.setDesc(map.get("SYSUSERDESC") != null ? map.get("SYSUSERDESC").toString() : "");
- user.setPhone(map.get("PHONE") != null ? map.get("PHONE").toString() : "");
- user.setMobile(map.get("MOBILE") != null ? map.get("MOBILE").toString() : "");
- user.setMail(map.get("MAIL") != null ? map.get("MAIL").toString() : "");
- user.setReverse1(map.get("SYSUSERREVERSE1") != null ? map.get("SYSUSERREVERSE1").toString() : "");
- user.setReverse2(map.get("SYSUSERREVERSE2") != null ? map.get("SYSUSERREVERSE2").toString() : "");
- user.setHeadShipId(map.get("HEADSHIPID") != null ? map.get("HEADSHIPID").toString() : "");
- user.setOrganizationId(map.get("ORGANIZATIONID") != null ? map.get("ORGANIZATIONID").toString() : "");
- user.setPositionId(map.get("POSITIONID") != null ? map.get("POSITIONID").toString() : "");
- user.setTitleId(map.get("TITLEID") != null ? map.get("TITLEID").toString() : "");
- list.add(user);
- }
我们交给一个方法,让它自行去进行数据的取出和封装~多方便!
这样可以,那么我们同样可以告诉一个PO ”你和数据库中的XXX表相关联,自己去做基本的CRUD吧~“你放心,只要方法处理得当就就可以去掉现在DAO实现层中的所有的基本CRUD方法。
思想再继续延伸下去,如果我们再PO的属性中标记出其他的信息,比方说告诉他“你和表示层上的XXX控件相对应”,其实request无非也就是个Map而已,一样的,我们可以直接通过Annotation的解释方法,把页面上传入Action层的与PO有关的简单信息直接封装到PO中,而无需再用一堆的set来设置值。
我们再看看ROR的做法,一个命令,生成数据库中对应的操作方法,简单CRUD页面,其实我们也可以这样做,用Annotation我们可以告诉PO对数据库上与谁关联,告诉页面又与谁关联~一个基于JAVA的ROR框架又出现了~~
呵呵,小弟不才,也就是想像,这样做其实就扔掉了JAVA本身的分层明确的优点,各个部分都耦合的不能再耦合了~
分享到:
相关推荐
CVAT(Computer Vision Annotation Tool)是一个开放源代码的在线计算机视觉任务标注平台,它为研究人员、数据科学家和工程师提供了一种高效、灵活的方式来标注图像和视频数据。这个平台旨在简化和加速计算机视觉...
"FANTOM5-THESIS" 是一个与癌症研究相关的项目,它基于FANTOM5(Functional ANnotation Of The Mammalian Genome 5)样本库的更新数据。FANTOM5是一个大规模的转录组学研究项目,其目标是全面解析哺乳动物基因组的...
// Define TestBean using annotation GuardProp public class TestBean { private String name = " this is name " ; private int age = 20 ; @GuardProp ( mode = GuardProp . GuardMode . EXCLUDE ) private ...
8. **枚举与注解**:学习Java中的枚举类型以及注解(Annotation)的使用,注解在代码元数据中起到的作用。 9. **Java标准库**:使用Java的标准库,如IO、NIO、网络编程、日期时间API等。 10. **JVM原理**:初步...
3. **内联数组注释(Inline Array Annotation)**:在AngularJS中,内联数组注释是一种注入依赖的方式,常用于控制器、服务或其他依赖注入的构造函数中。例如,`$inject = ['$scope', 'myService'];`,这样可以避免...
此外,项目可能还利用了Java的注解(Annotation)来简化配置,例如`@WebServlet`和`@Path`等,以声明式的方式定义HTTP端点。 RESTful API是payment-server与客户端通信的关键。REST(Representational State ...
8. 注解(Annotation):注解是元数据的一种形式,可以用于编译时或运行时处理,例如用于配置框架(如Spring)或进行代码分析。 9. 设计模式:实践中可能会运用到各种设计模式,如单例模式、工厂模式、观察者模式等...
- **使用Kapt**:Kapt是Kotlin Annotation Processing Tool的缩写,用于处理注解。 - **使用Gradle**:Gradle是一种基于Groovy的构建工具,广泛应用于Kotlin项目。 - **使用Maven**:Maven是另一种流行的构建工具,...