## tyboot 无sql编码简单功能演示

Wesley13
• 阅读 200

tyboot 无sql编码简单功能演示

tybootdemo源码

https://gitee.com/magintursh/tybootdemo

tyboot源码:

https://gitee.com/magintursh/tyboot

https://github.com/magintursh/tyboot

示例项目接口截图

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

## tyboot 无sql编码简单功能演示

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

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
小森森 小森森
4个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
4个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
Wesley13 Wesley13
1年前
030 SSM综合练习06
1.权限操作涉及的三张表(1)用户表信息描述users!(https://oscimg.oschina.net/oscnet/a4a2b1f943cbc2db1c8ddd613e7ed00a9ae.png)sql语句:CREATETABLEusers(idVARCHAR2(32)DEFAU
Stella981 Stella981
1年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
3A网络 3A网络
4个月前
开发一个不需要重写成 Hive QL 的大数据 SQL 引擎
开发一个不需要重写成HiveQL的大数据SQL引擎学习大数据技术的核心原理,掌握一些高效的思考和思维方式,构建自己的技术知识体系。明白了原理,有时甚至不需要学习,顺着原理就可以推导出各种实现细节。各种知识表象看杂乱无章,若只是学习
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
3A网络 3A网络
4个月前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t