# micro-mvc
**Repository Path**: tianyamomo/micro-mvc
## Basic Information
- **Project Name**: micro-mvc
- **Description**: 与springmvc和springcloud整合,使所有的controller、servicebean、dao和sql业务逻辑代码都支持热部署方便开发人员调式和生产部署。
- **Primary Language**: Groovy
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 8
- **Created**: 2021-04-20
- **Last Updated**: 2021-04-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
micro-mvc框架,可以与springmvc\springcloud\dubbo或其他基于spring的mvc框架整合,
使所有的controller、servicebean、dao和sql业务逻辑代码都支持热部署方便开发人员调式和生产部署。
**与springmvc整合过程**
**编写Controller接口**
整合后Springmvc的controller只编写接口,参数名称必须用RequestParam注解。
使用InjectGroovy注解在接口中声明对应的groovy实现名称。
其他与传统springmvc的controller无异。
```
package foo.web;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.nh.micro.service.InjectGroovy;
@Controller
@RequestMapping("test")
@InjectGroovy(name="TestController")
public interface TestController {
@RequestMapping("echo")
@ResponseBody
public Map echo(@RequestParam(value="str") String str,HttpServletRequest httpRequest);
}
```
**编写Controller层的实现groovy**
```
package groovy;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.service.InjectGroovy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroTMProxy;
import foo.service.TestService;
class TestController {
@Resource
public TestService testService;
public Map echo(String str,HttpServletRequest httpRequest) {
System.out.println("this is controller proxy");
testService.test("111");
Map retMap=new HashMap();
retMap.put("status", "0");
return retMap;
}
}
```
**配置controller层包扫描**
使用GroovyBeanScannerConfigurer对controller的接口进行扫描(与component-scan不冲突可以重复配置,component-scan不会扫描接口)
```
```
**Service层**
**编写ServiceBean接口**
并进行包扫描,使controller层能够是resource加载到ServiceBean代理对象。注意在接口中使用@InjectGroovy注解声明对应的实现业务逻辑的groovy文件名字
编写ServiceBean接口
```
package foo.service;
import com.nh.micro.service.InjectGroovy;
@InjectGroovy(name="TestService")
public interface TestService {
public void test(String id);
}
```
**Service层groovy实现**
```
package groovy.service;
import javax.annotation.Resource;
import foo.dao.TestDao;
import foo.dto.MicroTestDto;
import foo.repository.*;
import groovy.json.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.transaction.annotation.Transactional;
import com.nh.micro.dao.mapper.DefaultPageInfo;
import com.nh.micro.dao.mapper.InjectDao;
import com.nh.micro.rule.engine.core.plugin.MicroAop;
import com.nh.micro.rule.engine.core.plugin.MicroDefaultLogProxy;
import com.nh.micro.template.MicroDbProxy;
import com.nh.micro.template.MicroServiceTemplateSupport;
import com.nh.micro.template.MicroTMProxy;
class TestService {
@Resource
public TestDao testDao;
public void test(String id){
Map paramMap=new HashMap();
paramMap.put("id", id);
MicroTestDto microTestDto=testDao.queryInfoById(paramMap);
List list=testDao.getInfoListAllMapper(microTestDto, "");
DefaultPageInfo pageInfo=new DefaultPageInfo();
pageInfo.setPageNo(1);
List retList=testDao.queryInfosByPage(paramMap, pageInfo);
Long total=pageInfo.getTotal();
System.out.println("total="+total);
}
}
```
**Service层包扫描配置**
```
```
**Dao层**
使用micro-dao模块,需要编写dto类,dao接口和sql文件。通过扫描sql文件和dao接口,使service层能够使用Resource注解加载dao代理对象。
**编写dto对象类**
使用@MicroTableName映射数据中表名,使用@MicroMappingAnno映射表中列名。
```
package foo.dto;
import java.util.Date;
import com.nh.micro.orm.MicroMappingAnno;
import com.nh.micro.orm.MicroTableName;
@MicroTableName(name="micro_test")
public class MicroTestDto {
@MicroMappingAnno(name="id")
private String id;
@MicroMappingAnno(name="meta_key")
private String metaKey;
@MicroMappingAnno(name="meta_name")
private String metaName;
@MicroMappingAnno(name="meta_type")
private String metaType;
@MicroMappingAnno(name="create_time")
private Date createTime;
@MicroMappingAnno(name="meta_num")
private Integer metaNum;
public Integer getMetaNum() {
return metaNum;
}
public void setMetaNum(Integer metaNum) {
this.metaNum = metaNum;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMetaKey() {
return metaKey;
}
public void setMetaKey(String metaKey) {
this.metaKey = metaKey;
}
public String getMetaName() {
return metaName;
}
public void setMetaName(String metaName) {
this.metaName = metaName;
}
public String getMetaType() {
return metaType;
}
public void setMetaType(String metaType) {
this.metaType = metaType;
}
}
```
**编写Dao接口**
被扫描的dao接口需要使用@InjectDao注解
```
package foo.dao;
import java.util.List;
import java.util.Map;
import com.nh.micro.dao.mapper.ListInnerClass;
import com.nh.micro.dao.mapper.MicroCommonMapper;
import com.nh.micro.dao.mapper.MicroPageInfo;
import com.nh.micro.orm.MicroDbName;
import foo.dto.MicroTestDto;
@InjectDao
@MicroDbName
public interface TestDao extends MicroCommonMapper {
public int updateInfo(Map paramMap);
public int insertInfo(Map paramMap);
@ListInnerClass(name=MicroTestDto.class)
public List queryInfosByPage(Map paramMap,MicroPageInfo pageInfo);
public MicroTestDto queryInfoById(Map paramMap);
}
```
**Dao层包扫描配置**
```
```
**编写sql模板**
类似jsp的语法编写sql,支持#和$两种替换符。不必区分select还是update,统一用标签,id与dao接口方法名一致,sql文件名与dao接口名一致。
```
<%! %>
select * from micro_test where 1=1
<% if(paramArray[0].get("id")!=null){ %>
and id = #{paramArray[0].id}
<% } %>
<%! %>
<%! %>
select * from micro_test
<%! %>
<%! %>
insert into micro_test(id,meta_key) values(
?
<% repList.add(paramArray[0].get("id"));%>
,?
<% repList.add(paramArray[0].get("meta_key"));%>
)
<%! %>
<%! %>
update micro_test set
<% if(paramArray[0].get("meta_key")!=null){%>
,meta_key=#{paramArray[0].get("meta_key")}
<% } %>
<% if(paramArray[0].get("meta_name")!=null){%>
,meta_name=#{paramArray[0].get("meta_name")}
<% } %>
where id=#{paramArray[0].get("id")}
<%! %>
```
**Sql文件扫描配置**
```
```
**MicroDao说明**
同时支持mysql和oracle
MicroDao相对mybatis的优点:
1,sql脚本支持修改后热部署实时生效。
2,bean与数据库字段映射关系,通过注解设置到bean中,不必在sql脚本中体现。
3,sql脚本支持类似jsp的写法,且不必区分select、update使用不同标签,更加灵活。
4,不需要使用插件,内置支持物理分页。
5,不需要使用插件,内置支持针对bean的标准增删改查功能。
6,不需要使用插件,内置支持读写分离,分库分表。
7,针对mysql5.7支持动态字段。
支持mapper、template、非orm三种模式支撑业务系统
1,mapper指,通过扫描接口,运行时自动生成dao实例;
2,template指,通过继承template标准父类,生成dao子类;
3,非orm指,直接使用microDao实例,可以执行非orm更灵活的数据库操作。
**关于事务**
由于serviceBean接口对象通过包扫描发布为springbean,所以仍可以使用原有的spring事务机制。
```
```
**SpringCloud整合**
SpringCloud整合controller,service、dao层与springmvc整合均一致。
具体查看demo项目
Micro-springcloud-mvc