项目导入部署成功后,来看一下项目结构
里面包含两个项目,gmms_system gmms_web
system里主要有dao,service,model和一些util
gmms_system
一:DAO层
以AreaDAO为例,里面非常简单,直接extendsBaseDAO传入javabean类即可。BaseDAO里面功能很多,基本能涵盖主要的db操作方法。所有大部分情况下直接继承这个基类就可以完成大部分功能。
同样,AreaDAOImpl继承BaseDAOImpl,也不需要做太多的操作。将来加新模块,也照抄即可,替换bean就行了。
二:Service层
和DAO层类似,接口和实现类都继承BaseService相关的,可以打开BaseService看一下,里面有几个方法,方法不多,比BaseDAO里面的众多方法少了许多。
主要就是几个常用的增删改查和分页,其中queryPageBean是分页,queryById是根据int型的id来查询对象,注意并没有by String的方法,意味着如果你的表id是String类型的话,你的自定义的service接口需要加上T queryById(String id); 这个query4AutoComplete是用于输入框点击后自动查询出下拉列表用的,将来界面上能看到。
service的实现类,如AreaServiceImpl继承BaseServiceImpl并实现AreaService接口,如果你的业务里有BaseService利满足不了的方法的话,就可以自己添加,譬如T queryById(String id); 实现接口后,里面的方法就根据自己的业务需要来做相应的实现即可。BaseServiceImpl里面保存的都是各个DAO,你添加了新功能后,需要把你的DAO添加到BaseServiceImpl里面,设置set get方法即可。
三:model层
这里面就是javabean的定义了,由于采用的是hibernate,所以每个bean对应一张表,并且需要写自己的hbm.xml映射
命名的话都是以Tb开头,都extends了Entity,目的是分页用的,都实现了EntitySerializable接口,里面有一个toAjaxObject的方法,目的是可能会用到的转json功能。
TbArea中,int型的都用了Integer来定义了,区别就是用int的话,即便不赋值,也会默认为0,Integer的话不赋值在数据库里就是null了。作者这么设计,那么就按照他的方法来吧。
有很多表可能需要保存一些信息如,createTime创建时间,updateTime更新时间,deleteFlag删除标志目的是不进行物理删除,这个就根据自己的需求来设计添加就行了。
toAjaxObject方法里,需要提的就是,基础属性他都是直接赋值了,如果里面有对象的,就取了对象的几个主要属性来赋值,免得把关联的类的全部值都取了,像如果关联的有User的话,User里的password明显是不想给其他类看到的,所有自己来取几个主要的值就行了。
作者的方法是对所有的基础类型的属性取值赋值,这种方法是相当麻烦的,尤其是属性众多的是时候,譬如TbUser类,手敲的话还是相当恐怖的。所以我采用了clone的方式,来完成基础属性的赋值。
public class TbUser extends Entity implements EntitySerializable<TbUser>, Cloneable实现一个Cloneable
public Object clone() throws CloneNotSupportedException { TbUser cloned = (TbUser) super.clone(); cloned.createTime = (Date) createTime.clone(); if (getCompany() != null) { TbCompany tmpCompany = new TbCompany(); tmpCompany.setCompanyId(getCompany().getCompanyId()); tmpCompany.setCompanyName(getCompany().getCompanyName()); cloned.setCompany(tmpCompany); } if (getDepartment() != null) { TbDepartment tmpDepartment = new TbDepartment(); tmpDepartment.setDepartmentId(getDepartment().getDepartmentId()); tmpDepartment.setDepartmentName(getDepartment().getDepartmentName()); cloned.setDepartment(tmpDepartment); } if (getMainRole() != null) { TbRole tmpRole = new TbRole(); tmpRole.setRoleId(getMainRole().getRoleId()); tmpRole.setRoleName(getMainRole().getRoleName()); cloned.setMainRole(tmpRole); } if (getOpUser() != null) { TbUser tmpUser = new TbUser(); tmpUser.setUserId(getOpUser().getUserId()); tmpUser.setLoginName(getOpUser().getLoginName()); tmpUser.setRealName(getOpUser().getRealName()); cloned.setOpUser(tmpUser); } return cloned; }
@Override public TbUser toAjaxObject() { try { return (TbUser) this.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } }这样就只需要对关联类做处理即可,基础属性就直接clone后就是了。关于clone相关的,可以看另外一篇文章 点击打开链接
另外作者提到过,在项目里禁止使用一对多,多对多关联,只能是多对一。所以看到的所有javabean里没有其他对象的List集合。目的是hibernate的一对多时的加载问题,查1时会把多全查出来,对性能有较大的影响。当然,这种可以通过一些配置来避免掉,如果某些业务迫切需要1对多的话,就要好好配置一下。
写好bean后,就配置hbm.xml了,这个比较简单,指定好表名,类名,列名就行了,如果有not null 的属性,或者不让重复的属性就单独配置一下not-null="true" unique="true",这些都是hibernate的基础知识。
gmms_web
一:action层
这个没太多好说的,基础BaseAction即可,根据业务需求来实现不同的方法,随便找个抄抄就行,在BaseAction里面,你需要加入你自己的service接口,在180行附近,把你新建的service加进来 设置get set,然后你就能在你的action里使用所有的service了。关于分页相关的,就直接抄别的类的方法就行,比较简单。
二:struts配置
新建个自己的struts.xml文件,指定好类,包名,namespace就可以了。里面的*_之类的是通配符,属于struts的基础知识,*是对应action类的方法名的。
建好后把xml文件添加到struts-jeasyframe里面就行了。
三:config配置
application-gmms-dao application-gmms-service里都是一些spring的映射配置,按照之前的配置一下就好了。
hibernate.cfg.xml里把你新建的表的hbm.xml也添加进来。然后就OK了,下次你运行项目,你新建的javabean和hbm.xml,就会根据你设置的规则,自动创建出来表了。原因嘛,就是jdbc.properties里配置的hibernate的策略是update。
里面有个小地方提一下,配置里面可以看到的有service和dao的注入映射,但是并没有action和service的注入,这是因为spring和action的自动注入,就不需要写action和service的注入了。spring注入action的service有两种方法,该项目是自动注入的,比手动注入的话少写一个配置文件。