# 快速入门
本文提供了最基本的hsweb使用方式,只要认真阅读本文,创建一个项目不成问题.
## 目录
1. [前言](#前言)
2. [创建项目](#创建项目)
3. [增删改查](#增删改查)
4. [更多教程](#更多教程)
## 前言
`hsweb`是基于`java8`,`spring-boot`,`mybatis`开发.所以在开始使用`hsweb`的前,你至少应该掌握以下技术:`java`,`maven`.
最好掌握以下技术:`spring-boot`,`mybatis`. 如果对以上技术一无所知,请先去各大搜索引擎学习之.
`hsweb`是一个模块化的项目,对各个功能进行了细分,这是为了更好的拓展性,但是在实际业务项目中,并不需要这样的细分,因此,强烈不建议自己直接将hsweb-framework clone下来在上面添加业务代码,正确的姿势是使用maven,根据自己的需求依赖hsweb的各个模块.
hsweb 目前未提供前端支持,仅有一个[demo](https://github.com/hs-web/hsweb3-demo)可供参考.
本入门教程以一个最传统的单模块项目为例子. IDE为:`Intellij IDEA`(需安装lombok插件)
## 创建项目
1. 新建maven项目:

编辑`pom.xml`,然后`reimport`.如果对maven不够熟悉,maven的设置请使用默认设置,不要在settings.xml里自己添加私服.
否则可能出现依赖无法下载的问题.
```xml
4.0.0
com.mycompany
myproject
1.0-SNAPSHOT
UTF-8
zh_CN
1.5.13.RELEASE
1.8
${java.version}
3.0.0
3.0.1
${project.artifactId}
src/main/resources
true
org.apache.maven.plugins
maven-compiler-plugin
3.1
${project.build.jdk}
${project.build.jdk}
${project.build.sourceEncoding}
org.springframework.boot
spring-boot-maven-plugin
${spring.boot.version}
com.mycompany.MyProjectApplication
ZIP
repackage
org.springframework.boot
spring-boot-starter-test
test
org.hswebframework.web
hsweb-tests
${hsweb.framework.version}
test
org.hswebframework.web
hsweb-concurrent-cache
${hsweb.framework.version}
org.hswebframework.web
hsweb-spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
org.codehaus.groovy
groovy-all
mysql
mysql-connector-java
5.1.40
com.alibaba
druid
ch.qos.logback
logback-classic
org.slf4j
slf4j-api
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
org.hswebframework.web
hsweb-framework
${hsweb.framework.version}
pom
import
com.alibaba
druid
1.0.26
org.hswebframework.web
hsweb-spring-boot-starter
${hsweb.framework.version}
hsweb-nexus
Nexus Release Repository
http://nexus.hsweb.me/content/groups/public/
true
always
aliyun-nexus
aliyun
http://maven.aliyun.com/nexus/content/groups/public/
aliyun-nexus
aliyun
http://maven.aliyun.com/nexus/content/groups/public/
```
2. 在`resources`中创建`application.yml`配置

```yaml
server:
port: 8080
spring:
aop:
auto: true
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name : com.mysql.jdbc.Driver
url : jdbc:mysql://localhost:3306/myproject?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
username : root
password : root
hsweb:
app:
name: my-project
version: 1.0.0
logging:
level:
org.hswebframework.web: DEBUG
org.hswebframework.web.cache: WARN
org.apache.ibatis: DEBUG
org.mybatis: DEBUG
```
3. 创建启动类

```java
package com.mycompany;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author zhouhao
* @since 1.0
*/
@SpringBootApplication
public class MyProjectApplication {
public static void main(String[] args) {
SpringApplication.run(MyProjectApplication.class,args);
}
}
```
4. 创建数据库
```sql
CREATE DATABASE IF NOT EXISTS myproject default charset utf8 COLLATE utf8_general_ci;
```
5. 执行`MyProjectApplication.main`启动应用

打开浏览器访问 http://localhost:8080. 提示`Whitelabel Error Page`则说明服务启动成功.
因为现在还没有任何功能,所有提示错误信息.
到此,项目建立完成,和普通的spring-boot项目没有区别.
## 增删改查
使用通用CURD,添加一个增删改查功能:
在`pom.xml`中引入模块:
```xml
org.hswebframework.web
hsweb-commons-dao-mybatis
${hsweb.framework.version}
org.hswebframework.web
hsweb-commons-service-simple
${hsweb.framework.version}
org.hswebframework.web
hsweb-commons-controller
${hsweb.framework.version}
```

1. 创建数据库表:
```sql
create table tb_test(
id varchar(32) primary key,
name varchar(32) not null,
status tinyint,
comment text
)
```
2. 创建实体类 `com.mycompany.entity.TestEntity`
实体类可通过继承:`org.hswebframework.web.commons.entity.SimpleGenericEntity<主键类型>`.来使用通用的crud功能.
```java
@Getter
@Setter
public class TestEntity extends SimpleGenericEntity {
private String name;
private Byte status;
private String comment;
}
```

3. 创建Dao
dao接口可通过继承:`org.hswebframework.web.dao.CrudDao<实体类,主键类型>`.来使用通用的crud功能.
创建Dao接口 `com.mycompany.dao.TestDao`
```java
public interface TestDao extends CrudDao {
}
```

创建myabtis mapper,在`resources`目录上创建:`com/mycompany/dao/mybatis/TestMapper.xml`,注意: 目录分割使用`/`而不是`.`
```xml
delete from tb_test where id =#{id}
```

在`application.yml`中添加配置:
```yaml
mybatis:
mapper-locations: classpath:com/mycompany/dao/mybatis/**/*.xml
```
在`MyProjectApplication`上添加注解:`@MapperScan(basePackages = "com.mycompany.dao", markerInterface = org.hswebframework.web.dao.Dao.class)`
4. 创建Service
service接口可通过继承:`org.hswebframework.web.service.CrudService<实体类,主键类型>`.来使用通用的crud功能.
创建接口类: `com.mycompany.service.TestService`
```java
public interface TestService extends CrudService {
}
```
实现类可通过继承: ` org.hswebframework.web.service.GenericEntityService<实体类,主键类型>`.来使用通用crud功能.
创建实现类 `com.mycompany.service.impl.TestServiceImpl`
```java
@Service
public class TestServiceImpl extends GenericEntityService
implements TestService {
@Autowired
private TestDao testDao;
@Override
protected IDGenerator getIDGenerator() {
return IDGenerator.MD5;
}
@Override
public TestDao getDao() {
return testDao;
}
}
```

5. 创建Controller
controller 可通过实现接口: `org.hswebframework.web.controller.SimpleGenericEntityController<实体类,主键类型,org.hswebframework.web.commons.entity.param.QueryParamEntity>`
创建controller类: `com.mycompany.controller.TestController`
```java
@RestController
@RequestMapping("/test")
public class TestController implements SimpleGenericEntityController {
@Autowired
TestService testService;
@Override
public CrudService getService() {
return testService;
}
}
```
6. 测试
方式一:编写单元测试
在src/test/groovy目录下创建`com.mycompany.TestApplication.java`和`com.mycompany.controller.TestControllerTest.groovy`
```java
@SpringBootApplication
@WebAppConfiguration
public class TestApplication {
}
```
```groovy
@WebAppConfiguration
@ContextConfiguration
@SpringBootTest(classes = [TestApplication.class], properties = ["classpath:application.yml"])
class TestControllerTest extends Specification {
@Autowired
private ConfigurableApplicationContext context;
@Shared
private MockMvc mockMvc;
void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
def "Test Create Data"() {
setup:
def testData = """
{"name":"测试数据","status":1,"comment":"说明"}
"""
and:
mockMvc.perform(
post("/test")
.contentType(MediaType.APPLICATION_JSON)
.content(testData)
).andExpect(status().is(201))
}
}
```
执行单元测试,通过则说明新增功能测试通过.
方式二: `postman` 或者idea的`Test Restful Web Servcice`,以Idea工具为例:
执行启动类:`com.mycompany.MyProjectApplication`启动服务,然后调用`/test`服务

一个最简单的通用crud例子完成了!!
## 获取例子的完整源代码
[myproject](https://github.com/hs-web/hsweb-examples/tree/master/myproject)
## 更多教程
[通用增删改查使用](USE-CRUD.md) ,[拓展系统自带功能的字段](CUSTOM-PROP.md) [权限控制](AUTZ.md) ,[业务功能](SYSTEM.md) , [实用工具包](UTILS.md)
[常见问题及解决方式](https://github.com/hs-web/hsweb-framework/issues/97)