Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)

ssh注解完整实例源代码 ssh注解完整实例源代码 可直接运行 初级使用 立即下载
在前两章我为大家详细分析了JAR包的选择和必须的配置文件,那么这一章,我就对例子的层次结构进行说明,并实现除WEB层的功能代码。
    第三部分:建立框架代码

    工程结构

    
    大家可以看到,本例一共分为:dao、entity、service、web四层。另外在这些层次下,还以业务功能再进行分包,这样做是为了方便在以后的功能扩展中,能更好的管理和维护代码。如果将所有类都直接集中在这4个包下面,随着类的增加,会越来越难以维护,而且查找起来也很费劲。
    HibernateDao
    在本例中,我是通过继承Spring提供的HibernateDaoSupport来实现持久层的基类。同时引入泛型参数,封装了一些基本操作方法。

    
    这是HibernateDao的部分代码,引入的这个泛型参数,其实就是实体类(User、Role)。通过传递这个实体类,在构造方法中利用反射特性将它从JVM中取出来。
    
    这里的getClass()方法是获得继承HibernateDao的类(UserDao、RoleDao)
    getGenericSuperclass()方法就是通过这些继承了HibernateDao的类,来得到父类(父类就是HibernateDao)的泛型。注意这个方法的返回值为Type,这是一个类型接口。请参考API。
    因为在继承HibernateDao 的时候,会给它加一个泛型参数。比如,User、Role实体类。因此超类是参数化类型,所以返回的 Type 对象包含所使用的实际类型参数。这里返回的Type对象是ParameterizedType接口的实现类ParameterizedTypeImpl,所以要将返回类型转型为ParameterizedType。
    getActualTypeArguments()方法是ParameterizedType接口中的,它的作用就是获得实际类型参数 Type 对象的数组,因为我们这里只定义了一个泛型参数,数组里面也只有一个值,所以需要在数组下标处填0。然后最后一步转型千万别忘记了,因为这个方法返回的可是一个Type数组喔。
    如果对于这部分的说明还有点不理解的话,请到时候有了代码,设个断点跟踪一下,就会全部清楚了。关于java反射,它已经超出本文的范围。大象只对本例中用到的部分进行讲解。
    使用这种写法,是方便我们进行类型转换与类型检查。另外还可以简化某些方法的写法。比如:createCriteria(Criterion... criterions)这个方法。参数是Criterion类型的可变参数,它是用来设置查询条件。如果要进行对象化查询,那么最简单的写法就可以直接写成createCriteria()。另外还有重载的方法,可以根据传入class类型来创建自定义查询。
    dao
    持久层的Dao类是根据实体类定义,一般是一个实体类就会有一个对应的Dao类。当然这要跟业务需求来设计,不是绝对的。另外你也可以为了简便而去掉dao层,将持久化操作与业务逻辑全部写在service层。

    
    这些定义的方法是供service层调用,在业务层,将不会看到一行与持久层有关的代码,降低藕合性是这样做的目的。@Repository注解的作用就是标注这个UserDao是一个持久层组件。还记得前一章讲到的扫描器吗?component-scan 它就是用来将标有@Repository,@Service这样的注解类扫描到Spring的容器里,并且同时对标有@Autowired注解的Bean启用了自动注入功能。这就是Spring从2.5开始提供的新特性。我们使用注解的方法,就可以告别那繁琐的配置文件定义。
    entity
    关于实体的定义就是使用JPA注解,关于这部分,我以前写过一篇文章专门讲这个,如果有不清楚的朋友可以先参考一下。学习JPA——Hibernate Annotation使用实例
    本例中,我有两点要讲下。
    第一、管理主键的表generator_table去掉原来单独定义的那个ID主键,把g_key设为主键,整个表将只有两个字段,g_key和g_value。
    第二、在User实体中,我将角色ID(role_id)与角色实体(Role)做了一个多对一关联。这一点是原来文章中没有讲过的。

    
    请一定注意role_id是user表的字段。我在本例中设定的是一个角色可以对应多个人员,所以这个role_id存的就是role表id的值。fetch = FetchType.LAZY指定采用延迟检索,如果当你取得了User对象,但又不想取Role中的信息,这时,User对象中的role属性是代理状态。Role对象中的值都是空的。只有当你使用role.id或role.name进行取值的时候,hibernate才会去数据库中查找对应的记录,因此在一定程度上降低了资源消耗。不过这里有点要注意,采用延迟检索的时候,需要加上前一篇讲到的OpenSessionInViewFilter过滤器。否则会遇到session关闭的异常。
    service
    
    @Service表示这是业务层组件。在业务层需要对UserDao加上@Autowired注解,大象在这里将业务层的方法名与持久层的方法名定义为一样的,是我的一种习惯,大家可以按自己的想法来做。
    测试
    既然有了这么多代码,那就来测试一下吧,看看有没有问题。
    
    好吧,为了照顾那些坚定的JUnit拥护者,再写一个JUnit测试。本例使用junit-4.4.jar
    
    
    @BeforeClass注解的方法表示在类实例化之前,也就是在类的构造方法执行之前就会执行。而且使用这个注解的方法必须是static void
    @Test标明这是测试方法,方法名不用像以前那样必须按照规则进行命名,可以自由定义。
    上图显示大象使用JUnit方式测试也通过了(如果不会通过我写它干嘛?嘿嘿)。
    假如我将张三改成张四,再来看看测试结果。

    
    这个截图可以很明显的说明所有东西。
    这一篇是给大家讲怎么用代码来实现除web层之外的全注解步骤。当然,我主要是讲思路,其实思路比代码重要得多。这一个系列的最后,我会放上所有源码供大家下载。现在这样慢慢分析,是想给大家讲道理。我们应该努力提升自己的境界与层次,而不要只把眼光放在代码上面。下一章将会着重介绍web层,以及struts2的注解插件struts2-convention。那么,我们下次继续。
    本文为菠萝大象原创,如要转载请注明出处。
SSH注解小实例 一个基于SSH注解进行开发的小实例。非常适合初学者。~ 立即下载

相关推荐

SSH注解方式整合小例子

适合ssh初学者,分享促进进步

SSH框架学习总结

SSH框架学习总结 最终版权:JDram314 如转载请贴出出处! 本来对SSH框架的学习可以早在去年,但是一直在给老师弄他的科研部分,所以一直拖到最近才算是学完了。乘现在有空总结一下,方便以后复习。 一、Struts 在没有学习SSH框架前,我们一般采用Jsp+java bean+servlet开发,这里就是MVC架构。而Struts其实就是替代了Servlet,我们知道Serv...

云计算? 514

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解

SSH整合时实体类的属性生成get,set方法里的小坑

前两天整合SSH时做了个小项目employee.class: private String eId; private String name; private String sex; 我employee的编号一开始是如上eId命名的,额,是有点怪。后来通过编译器自动get,set方法,如下: public String geteId() { return eI...

yuechu4492的博客 1544

SSH全注解整合demo

整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),演示搭建项目架构原型。 项目架构原型:Struts2.3.16+Spring4.1.1+Hibernate4.3.6。 此外,还有:log4j、slf4j、ehcache等知识点。 参考文档:(感谢下边的两位原创作者,另外我在结合两个优点的基础之上,把所有的配置换成了注解的配置方案。) http://blog.csdn.net/songanling/article/details/22454973 http://1194867672-qq-com.iteye.com/blog/1522906

MacOS新手必看:HomeBrew安装避坑指南(含M1芯片适配方案)

本文为MacOS新手提供全面的HomeBrew安装指南,特别包含M1/M2芯片适配方案。从系统准备到核心安装流程,再到日常维护和高级配置,详细解析每个步骤的潜在问题及解决方案,帮助用户高效管理Mac软件。

weixin_28831399的博客 471

ssh中前后台的数据交互

一.首先说下前台传数据到后台的方式 1.模型驱动: 在Action里面实现模型驱动User类,再实现setter和getter方法,当提交表格或者在url里面传值(参数要和表格里面的属性名一样,比如在用ajax异步请求是url参数username和表格里面的属性名一样),然后action那边就可以通过user.username拿到,和下面的方法不一样。 2.属性驱动:...

jimmy学习开车的地方 6539

Fusion 360嵌入式外壳建模实战:从草图到可装配结构

参数化三维建模是现代电子结构设计的核心能力,其本质是通过几何约束与特征驱动实现设计意图的精确表达和快速迭代。Fusion 360作为集成CAD/CAM/CAE的云端平台,以时间轴驱动的参数化工作流、基于基准面的草图约束机制和面向制造的特征操作逻辑,显著提升了嵌入式硬件的结构验证效率。该技术价值在于支持工程师在无专业机械背景前提下,独立完成PCB适配、散热布局、接口开孔与装配干涉检查等关键任务,广泛应用于3D打印原型、CNC加工外壳及IoT终端结构开发。本文以ESP32冰箱监控终端为实例,详解从基准定义、草图

weixin_35671843的博客 589

hibernate(五) hibernate一对一关系映射详解

      序言         之前讲解了一对多(单向、双向)、多对多(双向),今天就讲解一下最后一个关系,一对一。 心情不错。状态也挺好的,赶紧写一篇博文造福一下大家把。                                                     --WH    一、一对一关系的概述       一对一关系看起来简单,其实也挺复杂的。其中关系就包含了四种,单向双向和...

weixin_33810006的博客 231

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 280

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(三)(转载大象)

在前两章我为大家详细分析了JAR包的选择和必须的配置文件,那么这一章,我就对例子的层次结构进行说明,并实现除WEB层的功能代码。    第三部分:建立框架代码    工程结构        大家可以看到,本例一共分为:dao、entity、service、web四层。另外在这些层次下,还以业务功能再进行分包,这样做是为了方便在以后的功能扩展中,能更好的管理和维护代码。如果将所有类都直接集中在这4个...

skyqqzhou的专栏 165

Solidworks二次开发(C# .NET API):从零构建装配体与虚拟零件

本文详细介绍了使用C#进行Solidworks二次开发,从零构建装配体与虚拟零件的完整流程。通过.NET API实现设计自动化,涵盖环境搭建、核心对象模型、虚拟零件创建与外部化保存等关键技术,帮助工程师将重复性建模工作程序化,大幅提升设计效率与标准化水平。

alice7model的博客 607
上一篇: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)
下一篇: Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(四)
dw_java08
博客等级 码龄15年 122粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值