13

tyboot 无sql编码简单功能演示-我的心情我的世界

 4 years ago
source link: https://blog.51cto.com/magintursh/2491946
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

tyboot 无sql编码简单功能演示

tybootdemo源码

https://gitee.com/magintursh/tybootdemo

tyboot源码:

https://gitee.com/magintursh/tyboot

https://github.com/magintursh/tyboot

示例项目接口截图

以下为此次演示的接口功能,用以演示基于tyboot的简单编码

image

postman 接口文档: https://documenter.getpostman.com/view/29857/SzmY8gBk?version=latest

无sql编码体验

主要是service层的简单代码演示,orm层的mapper只是个空接口,非必要是不需要定义方法的,所以说,几乎所有时候的代码都只需要写service层的类就可以了。

示例项目中的service类没有接口,只有个实现类,这个后续在进行讨论。

controller


@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来处理业务问题。单表操作方便缓存,方便后续数据库拆分等等好处。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK