美文网首页SpringBoot极简教程 · Spring Boot
tyboot 无sql编码简单功能演示

tyboot 无sql编码简单功能演示

作者: 子杨_msl | 来源:发表于2020-04-30 13:44 被阅读0次

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

    相关文章

      网友评论

        本文标题:tyboot 无sql编码简单功能演示

        本文链接:https://www.haomeiwen.com/subject/fbuzwhtx.html