tyboot 無sql編碼簡單功能演示

tyboot 無sql編碼簡單功能演示

tybootdemo源碼java

https://gitee.com/magintursh/tybootdemomysql

tyboot源碼:git

https://gitee.com/magintursh/tybootgithub

https://github.com/magintursh/tybootredis

示例項目接口截圖

如下爲這次演示的接口功能,用以演示基於tyboot的簡單編碼sql

image

postman 接口文檔: https://documenter.getpostman.com/view/29857/SzmY8gBk?version=latest數據庫

無sql編碼體驗

主要是service層的簡單代碼演示,orm層的mapper只是個空接口,非必要是不須要定義方法的,因此說,幾乎全部時候的代碼都只須要寫service層的類就能夠了。json

示例項目中的service類沒有接口,只有個實現類,這個後續在進行討論。緩存

controllermybatis

@RestController
@TycloudResource(module = "demo", value = "demo")
@RequestMapping(value = "/v1/demo")
@Api(tags ="demo-示例")
public class TybootDemoResource {

    @Autowired
    private PublicUserInfoService publicUserInfoService;

    @TycloudOperation(ApiLevel = UserType.PUBLIC,needAuth = false)
    @ApiOperation(value = "建立數據")
    @RequestMapping(value = "", method = RequestMethod.POST)
    public ResponseModel<PublicUserInfoModel> createUser(@RequestBody PublicUserInfoModel model) throws Exception {
        if(ValidationUtil.isEmpty(model) || ValidationUtil.isEmpty(model.getMobile()))
            throw new BadRequest("數據校驗失敗.");
        RequestContext.setExeUserId("system");//未作用戶認證,拿不到當前用戶信息,手動填充。
        return ResponseHelper.buildResponse(publicUserInfoService.createUser(model));
    }

    @TycloudOperation(ApiLevel = UserType.PUBLIC,needAuth = false)
    @ApiOperation(value = "更新數據")
    @RequestMapping(value = "/{userId}", method = RequestMethod.PUT)
    public ResponseModel<PublicUserInfoModel> updateUser(@PathVariable("userId") String  userId,@RequestBody PublicUserInfoModel model) throws Exception {
        RequestContext.setExeUserId("system");//未作用戶認證,拿不到當前用戶信息,手動填充。
        model.setUserId(userId);
        return ResponseHelper.buildResponse(publicUserInfoService.updateUser(model));
    }

    @TycloudOperation(ApiLevel = UserType.PUBLIC,needAuth = false)
    @ApiOperation(value = "查詢單個數據對象")
    @RequestMapping(value = "/{userId}", method = RequestMethod.GET)
    public ResponseModel<PublicUserInfoModel> queryByUserId(@PathVariable("userId") String  userId) throws Exception {
        return ResponseHelper.buildResponse(publicUserInfoService.queryByUserId(userId));
    }

    @TycloudOperation(ApiLevel = UserType.PUBLIC,needAuth = false)
    @ApiOperation(value = "查詢數據列表")
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public ResponseModel<List<PublicUserInfoModel>> queryByAgencyCode(@RequestParam("agencyCode") String  agencyCode) throws Exception {
        return ResponseHelper.buildResponse(publicUserInfoService.queryByAgencyCode(agencyCode));
    }

    @TycloudOperation(ApiLevel = UserType.PUBLIC,needAuth = false)
    @ApiOperation(value = "分頁查詢數據列表")
    @RequestMapping(value = "/page", method = RequestMethod.GET)
    public ResponseModel<Page<PublicUserInfoModel>> queryUserPage(
            @RequestParam(value = "agencyCode",required = false) String  agencyCode,
            @RequestParam(value = "nickName",required = false) String  nickName,
            @RequestParam(value = "current") int current,
            @RequestParam(value = "size") int size) throws Exception {
        Page<PublicUserInfoModel> page = new Page(current,size);
        return ResponseHelper.buildResponse(publicUserInfoService.queryUserPage(page,agencyCode,nickName));
    }
}

方法 ResponseHelper.buildResponse() 會返回統一的數據格式 以下:

{
    "status": 200,  //狀態碼,同http返回碼
    "result": null,//結果對象
    "traceId": "1255684406704324610",//請求編號
    "devMessage": "SUCCESS",//錯誤信息,給開發人員看的,可能會有錯誤棧輸出到這裏
    "message": "", //給用戶提示用的信息,正常都爲空,不爲空的時候就是有錯誤信息
    "path": "/v1/demo"   //這次請求的 路徑
}

service

演示service中的編碼,簡單的無sql編碼體驗,BaseService 中已經封裝不少泛型方法,能夠選擇使用,

關於緩存:

建立數據 更新數據 查詢數據 都有帶緩存的方法能夠使用,完成緩存更新,保持緩存與mysql之間的同步。此處只作簡單數據緩存,複雜的業務功能相關緩存仍是手動處理比較合適。

關於mapper:

此處沒有引用mapper接口 ,也沒有定義xml,也沒有寫sql。只須要寫完以下方法,一個模塊的基礎功能便可完成。(其實代碼生成部分已經能夠生成以下方法).mapper只是個空的接口,非必要,是不用在其中定義方法。除非在複雜報表查詢 必須得寫sql的時候纔會考慮在其中定義方法。

@Service
public class PublicUserInfoService extends BaseService<PublicUserInfoModel, PublicUserInfo, PublicUserInfoMapper> {

    /**
     * 建立數據
     * 使用 BaseService 提供的方法 直接保存到關係數據庫   或者同時根據業務主鍵保存到redis
     */
    public PublicUserInfoModel createUser(PublicUserInfoModel model) throws Exception
    {
        //臨時使用的userId初始化
        String userId = Sequence.generatorSmsVerifyCode6();
        model.setUserId(userId);
        model.setCreateTime(new Date());
        model.setAgencyCode(CoreConstans.CODE_SUPER_ADMIN);
        //保存到數據庫,並按業務主鍵 userId  進行緩存,並刪除按agencyCode緩存的列表數據.,業務主鍵不填的話默認按物理主鍵緩存
        //return this.createWithCache(model,model.getUserId(),genCacheKeyForModelList(model.getAgencyCode()));

        // 直接保存到數據庫
        return createWithModel(model);
    }

    /**
     * 根據物理主鍵更新數據
     * 使用 BaseService 提供的方法 直接保存到關係數據庫   或者同時根據業務主鍵 更新對象到redis
     */
    public PublicUserInfoModel updateUser(PublicUserInfoModel model) throws Exception
    {
        //保存到數據庫,並按業務主鍵 userId  更新 緩存,並刪除按agencyCode緩存的列表數據.
        //this.updateWithCache(model,model.getUserId(),genCacheKeyForModelList(model.getAgencyCode()));

        //直接保存到數據庫
        return this.updateWithModel(model);
    }

    /**
     * 按條件 查詢單個對象
     * 方法參數名須要和 PublicUserInfoModel 中定義的屬性名保持一直,
     *  才能使用 queryModelByParamsWithCache 和 queryModelByParams 方法.
     *  而且 調用的方法傳參順序 要和 當前方法參數順序保持一致.
     */
    public PublicUserInfoModel queryByUserId(String userId) throws Exception
    {
        //查詢單個對象 並按參數緩存結果,下一次一樣參數就直接從緩存獲取.
        //this.queryModelByParamsWithCache(userId);

        return this.queryModelByParams(userId);
    }

    /**
     * 按條件查詢列表,按建立時間倒敘排列
       被調用方法的參數順序須要和當前方法保持i一直 
     */
    public List<PublicUserInfoModel> queryByAgencyCode(String agencyCode) throws Exception
    {
        //按參數 緩存查詢結果 下一次一樣參數 就直接讀取緩存
        //this.queryForListWithCache("CREATE_TIME",false,agencyCode);

        //查詢top列表
        //this.queryForTopList(10,"CREATE_TIME",false,agencyCode);

        return this.queryForList("CREATE_TIME",false,agencyCode);
    }

    /**
     * 按條件分頁查詢,  被調用方法的參數順序須要和當前方法保持i一直 
     */
    public Page<PublicUserInfoModel> queryUserPage(Page<PublicUserInfoModel> page,String agencyCode,@Condition(Operator.like) String nickName) throws Exception
    {
        return this.queryForPage(page,"CREATE_TIME",false,agencyCode,nickName);
    }

}

關於註解 @Condition

​ 用戶查詢參數的邏輯關係定義,默認是 and ,內部是使用 mybatisplus 條件進行判斷的。已經封裝的條件 請查看類 org.typroject.tyboot.core.rdbms.annotation.Operator 中的定義

如下是 vo po 和mapper的代碼

mapper :

public interface PublicUserInfoMapper extends BaseMapper<PublicUserInfo> {

}

model:

package org.typroject.tyboot.demo.face.model;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;

import java.util.Date;

@EqualsAndHashCode(callSuper = true)
@Data
public class PublicUserInfoModel extends BaseModel {

    private static final long serialVersionUID = 1L;

    private String userId;
    private String agencyCode;
    private String nickName;
    private String mobile;
    private String gender;
    private Date createTime;
    private Integer userAge;
    private String email;
}

entity:

package org.typroject.tyboot.demo.face.orm.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;

import java.util.Date;

@EqualsAndHashCode(callSuper = true)
@Data
@TableName("public_user_info")
public class PublicUserInfo extends BaseEntity {

    private static final long serialVersionUID = 1L;

    @TableField("USER_ID")
    private String userId;
    @TableField("AGENCY_CODE")
    private String agencyCode;
    @TableField("NICK_NAME")
    private String nickName;
    @TableField("MOBILE")
    private String mobile;
    @TableField("GENDER")
    private String gender;
    @TableField("CREATE_TIME")
    private Date createTime;
    @TableField("USER_AGE")
    private Integer userAge;
    @TableField("EMAIL")
    private String email;
}

無sql編碼也只是相對的。目前實現的是針對單表操做的處理。能用單表處理的業務就沒必要要使用太過於複雜的sql來處理業務問題。單表操做方便緩存,方便後續數據庫拆分等等好處。

相關文章
相關標籤/搜索