# 使用通用CRUD 创建 dao,service,controller... ## 模块结构 hsweb 按照功能分模块, 再将controller,service,dao分为子模块.例如: 模块名称为 hsweb-system-menu 创建maven项目模块以及子模块如下: * hsweb-system-menu - hsweb-system-menu-controller - hsweb-system-menu-dao - hsweb-system-menu-dao-api - hsweb-system-menu-dao-mybatis - hsweb-system-menu-entity - hsweb-system-menu-service - hsweb-system-menu-service-api - hsweb-system-menu-service-simple - hsweb-system-menu-service-cloud - hsweb-system-menu-starter [使用idea创建时的常见问题](https://github.com/hs-web/hsweb-framework/issues/31) ## Entity 模块:hsweb-system-menu-entity hsweb中的entity都为接口并提供了一个默认实现,例如 `MenuEntity`=>`SimpleMenuEntity`.但是并不强制使用此方式创建entity 约定: 1. entity应该实现`Entity`接口 2. 有主键的entity应该实现`GenericEntity`接口 3. entity应该使用`EntityFactory`创建而不是new 4. 树形结构的entity,可以实现`TreeSortSupportEntity` 注: `PK`=主键 创建一个entity. 1. 引入maven依赖 ```xml org.hswebframework.web hsweb-commons-entity ${hsweb.version} ``` 2. 新建接口类: ```java package org.hswebframework.web.entity.menu; import org.hswebframework.web.commons.entity.GenericEntity; import org.hswebframework.web.commons.entity.RecordCreationEntity; public interface MenuEntity extends GenericEntity { String getName(); void setName(String remark); String getUrl(); void setUrl(String url); } ``` 3. 新建默认实现类 ```java package org.hswebframework.web.entity.menu; import org.hswebframework.web.commons.entity.GenericEntity; import org.hswebframework.web.commons.entity.RecordCreationEntity; public class SimpleMenuEntity implements MenuEntity { private String name; private String url; public String getName(){ return this.name; } public void setName(String name){ this.name=name; } public String getUrl(){ return this.url; } public void setUrl(String url){ this.url=url; } } ``` 注意: 默认实现类一般和接口在同一个包中,并且名称为Simple开头+接口名称. 因为默认的`EntityFactory`按照此约定来创建未指定特殊实现接口实现的实例.详见 [MapperEntityFactory](hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/factory/MapperEntityFactory.java) ## DAO 模块:hsweb-system-menu-dao hsweb 目前提供了mybatis的通用dao实现,支持动态条件. 常用dao接口: 1. [InsertDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/InsertDao.java) : 支持insert 2. [DeleteDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/DeleteDao.java) : 支持根据主键删除 3. [DeleteByEntityDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/dynamic/DeleteByEntityDao.java) : 支持根据实体删除(动态条件) 4. [QueryByEntityDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/dynamic/QueryByEntityDao.java) : 支持根据实体查询(动态条件) 5. [UpdateByEntityDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/dynamic/UpdateByEntityDao.java) : 支持根据实体更新(动态条件) 6. [CrudDao](hsweb-commons-dao/hsweb-commons-dao-api/src/main/java/org/hswebframework/web/dao/CrudDao.java) : 集上述dao于一体 一般增删改查功能继承 `CrudDao`即可. 1. 新建Dao接口 进入模块: hsweb-system-menu-dao-api 引入依赖 ```xml org.hswebframework.web hsweb-commons-dao-api ${hsweb.version} ``` 创建接口: ```java package org.hswebframework.web.dao.menu; import org.hswebframework.web.dao.CrudDao; import org.hswebframework.web.entity.menu.MenuEntity; public interface MenuDao extends CrudDao { } ``` 1. mybatis实现. 进入模块: hsweb-system-menu-dao-mybatis引入依赖 ```xml org.hswebframework.web hsweb-commons-dao-mybatis ${hsweb.version} ``` hsweb依然使用xml的方式实现dao,xml建议放到resources目录下如: 'resources/org/hswebframework/web/dao/mybatis/mappers/menu' ```xml delete from s_menu where u_id =#{id} ``` 注意: 目前动态条件参数仅支持: `QueryParamEntity`,`UpdateParamEntity`,`DeleteParamEntity` ## Service 模块: hsweb-system-menu-service 通用service 提供dsl方式的删改查 TODO