tyboot 无sql编码简单功能演示
tyboot 无sql编码简单功能演示
tybootdemo源码
https://gitee.com/magintursh/tybootdemo
tyboot源码:
https://gitee.com/magintursh/tyboot
https://github.com/magintursh/tyboot
示例项目接口截图
以下为此次演示的接口功能,用以演示基于tyboot的简单编码
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来处理业务问题。单表操作方便缓存,方便后续数据库拆分等等好处。
- 简单修改Hibernate源码,增加使用原生SQL查询时动态addEntity和addScalar功能
- 简单演示字节和字符之间的编码转化
- linux共享内存简单介绍以及编码演示
- java基于spring boot简单实现filter功能
- Spring Boot博客开发日常记录-添加简单的评论功能
- springmvc+mybatis+sql server实现简单登录功能
- Java GUI 简单抽奖演示,可以自行修改功能,Timer类的使用
- Spring Boot 快速搭建及简单演示
- Springboot+mybatis实现web的简单增加,删除和查找功能
- MYSQL之UTF8sql文件导入GBK编码的数据库最简单办法
- springmvc+mybatis+sql server实现简单登录功能【转】
- 通过写sql来开发一个简单的功能
- 基于之前写的博客(SSM框架搭建以及简单增删改查以及分页功能的实现(前端bootstrap+css+jq))进一步的封装(改为SqlSessionTemplate方式实现)
- springboot 简单邮件发送功能
- iOS 简单的视频直播功能开发(实时视音频流录制编码+RTMP传输+实时拉流解码播放)
- 一个简单的演示SQL2005的查询通知的例子
- iOS 简单的视频直播功能开发(实时视音频流录制编码+RTMP传输+实时拉流解码播放)
- springboot+mybatis日志显示SQL的最简单方法
- springmvc+mybatis+sql server实现简单登录功能【转】
- T-sql之创建表以及其他简单功能