# Corona ### IDEA 环境需求 由于项目依赖`org.projectlombok:lombok:1.18.2`,而`Lombok`在`1.18.4`版本做了[重设计](https://projectlombok.org/features/experimental/FieldNameConstants),不兼容之前版本,因此`IDEA`的`Lombok`插件必须是版本`lombok-plugin-0.23`,这里比较坑,如果升级到版本`1.18.4`以后,插件还是得升级,而且很多API都要改。 插件下载地址:[https://pan.caimi-inc.com/d/b038610394/](https://pan.caimi-inc.com/d/b038610394/) 下载对应版本插件,比如`IDEA 2018.2.x`下载`lombok-plugin-0.23-2018.2.zip`,卸载`IDEA`已安装`Lombok`插件,选择磁盘安装,如下图: ![安装Lombok插件](doc/images/install-lombok-plugin.png) ### 启动SpringBoot项目 建议先执行mvn编译命令,比如编译模块`CMS` ```bash mvn clean compile -am -pl cms -T 2C ``` ### Tigon #### Controller 如果加注了`@ResponseBody`或者`@RestController`,不做变动,依循`Spring MVC`方式`JSON`序列化返回数据,否则返回`Wacai`接口规范数据格式,如下例: #### @ResponseBody ```java @ResponseBody @RequestMapping("/resp-body") public String respBody() { return "Response Body"; } ``` 响应输出 ``` Response Body ``` #### Wacai JSON API ```java @RequestMapping("/resp-body") public String respBody() { return "Response Body"; } ``` 响应输出 ``` { "code": 0, "success": true, "data": "Response Body" } ``` 简单来说就是,不加`@ResponseBody`注解,默认会以`Wacai`API规范响应数据结果。 参见以下样例: I. ```java @RequestMapping("/count") public int count() { return 1024; } ``` 响应输出 ``` { "code": 0, "success": true, "data": 1024 } ``` II. ```java @RequestMapping("/user-info") public Map userInfo() { final Map user = new HashMap<>(4); user.put("name", "Uncle Donghuang"); user.put("gender", "MALE"); user.put("mobile", "17161787481"); user.put("active", true); return user; } ``` 响应输出 ``` { "code": 0, "success": true, "data": { "name": "Uncle Donghuang", "gender": "MALE", "mobile": "17161787481", "active": true, } } ``` III. ```java @RequestMapping("/error-caused") public Map errorCaused() { throw new RuntimeException("Oops, some error caused"); } ``` 响应输出 ``` { "code": 5000, "success": false, "message": "Oops, some error caused" } ``` #### MyBatis `MyBatis`做了启动期增强,实例`Mapper`继承了`BaseMapper`之后,会继承获得相关的增删改查等方法,如下例: ##### Model ```java import lombok.Getter; import lombok.Setter; import java.util.Date; import com.wacai.tigon.model.M0; import com.wacai.tigon.mybatis.Table; import com.wacai.tigon.mybatis.NotUpdate; import lombok.experimental.FieldNameConstants; @Getter @Setter @Table("yo_customer") @FieldNameConstants(prefix = "") public class Customer extends M0 { private String name; private String account; private String password; private String note; @NotUpdate protected Date createdTime; protected Date updatedTime; @NotUpdate protected String createdBy; protected String updatedBy; protected boolean active; } ``` ##### Mapper ```java import com.wacai.tigon.mybatis.BaseMapper; public interface CustomerMapper extends BaseMapper { } ``` ##### Mapper.xml ```xml ``` ##### Usage ```java @Autowired private CustomerMapper customerMapper; ``` I. 插入 ```java final Customer customer = new Customer(); customer.setName("Uncle Donghuang"); customer.setAccount("donghuang"); customer.setPassword("qR$#FzM!z9W*"); customer.setCreatedBy("SYS"); customer.setCreatedTime(new Date()); customer.setActive(true); customerMapper.insert(customer); ``` II. 查询 Find by ID ```java final Integer id = 1154; final Customer customer = customerMapper.find(id); ``` Find by `Search` ```java final Customer customer = customerMapper.find( new Search(Customer.ACCOUNT, "donghuang") .eq(Customer.ACTIVE, true)); ``` List by `Search` ```java final List customers = customerMapper.list( new Search(Customer.ACTIVE, true) .between(Customer.ID, 1, 1154) .asc(Customer.ACCOUNT) .limit(42)); ``` `Search` API - `and` And another `Search` - `asc` Order ASC - `between` Between two values - `contains` Value contains string - `desc` Order DSC - `endsWith` Value ends with string - `eq` Eqauls - `gt` Greater than - `gte` Eqauls or greater than - `in` In values - `isNull` Value is null - `like` Value like - `limit` Return rows limit - `lt` Less than - `lte` Eqauls or less than - `ne` Not equals - `notIn` Not in values - `notNull` Value is not null - `offset` Return rows offset - `or` Or another `Search` - `orderBy` Order by - `startsWith` Value starts with string III. 更新 Update model ```java Customer customer = customerMapper.find( new Search(Customer.ACCOUNT, "donghuang") .eq(Customer.ACTIVE, true)); customer.setPassword("g!5KpWdXEB!^"); customer.setUpdatedBy("SYS"); customer.setUpdatedTime(new Date()); customerMapper.update(customer); ``` Update with map ```java final Map update = new HashMap<>(4); update.put(Customer.PASSWORD, "g!5KpWdXEB!^"); update.put(Customer.UPDATED_BY, "SYS"); update.put(Customer.UPDATED_TIME, new Date()); customerMapper.update(update, 1154); // OR // customerMapper.update(update, new Search(Customer.ID, 1154)); ``` Set null ```java // Update note to null of customer 1154 customerMapper.setNull(Customer.NOTE, 1154); // Update note to null of customer 1154 customerMapper.setNull(Customer.NOTE, new Search(Customer.ID, 1154)); // Update note to null of all customerMapper.setNull(Customer.NOTE, new Search()); ``` IV. 删除 Delete by ID ```java customerMapper.delete(1154); ``` Delete by `Search` ```java customerMapper.delete(new Search(Customer.ID, 1154)); ```