,因为我们做的是无人机应用方向的,即使试用也会产生费用,因为我们很多功能一旦用了就会消耗我们大量的资源,所以为了防止客户在试用时恶意传播账号,我们必须要记录用户的登录ip以及归属地,一旦遇到恶意传播的,...*/ @TableId(type = IdType.AUTO) private Integer id; /** * 登陆人姓名 */ @TableField...("name") private String name; /** * 登录ip */ @TableField("ip") private String...ip; /** * ip归属地信息 */ @TableField("ip_attribution") private String ipAttribution...; /** * 创建时间 */ @TableField("create_time") private LocalDateTime createTime; }
--EndFragment-->以及归属地,一旦遇到恶意传播的,轻则通知,重则警告,甚至不予试用,终止合作。 本文我将从我们的系统中划分出来一个简单的小功能:登录日志。 让我们直接开始!...*/ @TableId(type = IdType.AUTO) private Integer id; /** * 登陆人姓名 */ @TableField...("name") private String name; /** * 登录ip */ @TableField("ip") private String...ip; /** * ip归属地信息 */ @TableField("ip_attribution") private String ipAttribution...; /** * 创建时间 */ @TableField("create_time") private LocalDateTime createTime; }
的value属性 2.2 @TableId的type属性 3、@TableField 4、@TableLogic ---- 1、@TableName 在使用MyBatis-Plus实现基本的CRUD时,...在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t_或tbl_ 此时,可以使用MyBatis-Plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过...2.1 @TableId的value属性 现在有一种情况,若实体类中主键对应的属性为id,而表中表示主键的字段为uid,此时若只在属性id上添加注解 @TableId,则抛出异常Unknown column...2.2 @TableId的type属性 type属性用来定义主键策略 常用的主键策略: 值 描述 IdType.ASSIGN_ID(默认) 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关...此时需要在实体类属性上使用@TableField("username")设置属性所对应的字段名 4、@TableLogic 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
现有市面上加解密、脱敏组件开源项目众多,比较出名的有Mybatis-plus提供的Mybatis-mate组件,但很可惜代码是闭源、收费的,且根据实际使用不能够很好的支持嵌套脱敏,多种类型脱敏,动态SQL...此外,加解密和脱敏组件互相分离,虽然开源的组件众多,但几乎都是重复工作,仍然有很多待解决的问题需要完善,没有完整形成一个企业级数据安全解决方案。...TableField(typeHandler = EncryptTypeHandler.class) private String idCard; @TableField(typeHandler...,比如被打上注解的实体在序列化后字段均会被脱敏,再如对于该实体本来想打印明文的日志信息,但打印的却只能是脱敏的,这对于现有的系统在接入后需要进一步进行代码走查,规避风险 采用自定义序列化器的Utils,...,实体字段已变为加密字段 可拓展式加密算法、加解密类型处理器、脱敏类型处理器,脱敏切面可开关、切点可配置 可自定义脱敏标识 # 组件原理 具体原理解析可见Rpamis-security-原理解析 (opens
都已有所成 SpringBoot日志收集-Aop方式-存进数据库 一、前言 1)概述: 2)介绍: 3)使用场景: 二、前期准备 2.1、数据库 2.2、导入依赖 2.3、yml配置文件 2.3、配置自定义...(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value:...0 # 逻辑未删除值(默认为 0) 2.3、配置自定义log注解类 如果需要收集多种日志的话,可以做扩展,增加注解也可,用编码也可,当然如果项目多的话,那么必然是要抽取出来才是最合适的。...(经验不足、如有不妥,请及时提出,蟹蟹各位大佬) /** * 配置自定义log注解类 * @author crush */ @Target(ElementType.METHOD) //注解放置的目标位置...(fill = FieldFill.INSERT) private LocalDateTime createTime; /*** 修改时间*/ @TableField(fill
Model逻辑删除 数据库对应实体类,继承Model类可以实现AR模式的sql语句操作,但这里需要注意的是,对逻辑删除,官方说明需要实现如下重写方法才能生效,也就是使用实例化对象.deleteById(...,但是插入或更新数据库是不存在的;这里你需要做的是在要进行插入或修改的字段上面加上注解@TableField(fill = FieldFill.INSERT),这里FieldFill有四种选择,如下,它默认是不做处理的...级联操作 对自定义语句条件用wrapper包装,实现多表联合查询也可以用链式的条件查询 例子基本都在下面了 //可直接在这里定义方法列表,默认只有在类上加注解才会支持方法 @QuerySupport("...查询去字段技巧 之前说过一个,通过加transient,利用jackson或fastjson,在返回前端的时候对它做处理去掉对应的字段,但同时我们又遇到个问题,比如del_flag,该字段往往前端不需要...,在总结此篇的时候也让我对此前的博客有些技术上的修正,比如MetaObjectHandler的使用,并不是只能把值放返回对象,它是可以直接插入数据库的 mybatis-plus的总结工作到现在结束了,知识点应该已经概括了官方文档的所有
因此这些字段属于公共字段,而且很多表中都有这些字段,我们想要对这些字段进行统一处理 我们可以使用Mybatis Plus提供的公共字段自动填充功能 2、代码实现 1、在实体类的属性上接入@TableField...注解,指定自动填充的策略 @TableField(fill = FieldFill.INSERT) // 插入时填充 private LocalDateTime createTime; @TableField...servletResponse, FilterChain filterChain) throws IOException, ServletException { ... // 4、判断登陆状态,如果已登录...().getAttribute("employee"); BaseContext.setCurrentId(empId); log.info("用户已登录...super.removeById(id); } 4、创建业务异常CustomException 目录:common package cn.mu00.reggie.common; /** * 自定义业务异常
update_time") private Date updateTime; @ApiModelProperty(value = "逻辑删除(1:已删除,0:未删除)") @TableLogic...= "名称") @TableField("name") private String name; @ApiModelProperty(value = "值") @TableField...但element的table组件给我们封装好了一些东西,我们只需要在这里根据上级id查询子数据列表即可。...getChildrens这个方法,在每一层调用后端接口将子节点数据查询出来,并加入树形结构的表格数据中。...,只有去点击父节点的时候,子节点的数据才会被加载,避免因数据量太大导致系统卡顿。
错误截图: 引言 在使用 MyBatis-Plus 和 PostgreSQL 数据库时,有时候会遇到 org.postgresql.util.PSQLException 异常,错误信息为 “conversion...这个异常通常是由于数据库字段类型与实体类属性类型不匹配引起的。本文将介绍如何通过在实体类中添加 @TableField 注解并指定参数来解决这个问题。...使用类型转换器: 如果你需要保持Java实体类中的id字段为OffsetDateTime类型,你可以考虑使用Spring的类型转换器(TypeConverter)或自定义的属性编辑器(PropertyEditor...方向二: 解决这个异常的方法是通过在实体类中添加 @TableField 注解,并使用 jdbcType 参数来显式指定数据库字段的数据类型。...为了解决这个问题,我们可以在实体类中使用 @TableField 注解,并通过 jdbcType 参数明确指定数据库字段的数据类型。本文提供的解决方案可以帮助您顺利解决这个异常,让您的项目顺利运行。
= "光宇编号", example = "TM1234"); 2.3 jackson中的注解 2.3.1 @JsonFormat @JsonFormat :它是一个时间格式化注解,比如我们存储在mysql...TableField @TableField : 解决实体类中属性名和表中的字段名不一致(非驼峰),还有对象中的某个属性不在表中进行忽略。...; // 解决字段名不一致,此时不满足MyBatis配置的驼峰和_对应 // 其实这个有个小技巧,就是你可以自定义一个属性名,然后通过@TableField指定它对应数据库表中的某个字段的值...,那么此时这个自定义的属性就存在了数据表中某个字段的值,然后可以传递给前端进行响应操作。...@TableField(exist = false)//指明该属性在数据库表的字段中不存在 private String address; } @TableField完成字段自动填充的操作 实现方式
SpringBoot 针对 jackson 是自动化配置的,如果需要修改,也可以自定义配置。...fail_on_unknown_properties: false parser: #允许出现特殊字符和转义符 allow_unquoted_control_chars...objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES...后台编写的接口向前端返回数据时,如果返回的是某个数据库对应的实体类,有可能出现日期类型数据不是 yyyy-MM-dd HH:mm:ss 格式。...使用方式:加在实体类属上添加该注解 ** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_date
瑞吉外卖Day3 创造实属不易,代码笔记全是个人学习的理解,希望大家点赞关注支持一下 公共字段填充 一、问题分析 二、实现步骤 1、在实体类的属性上加入@TableField注解,指定自动填充的策略...可以使用ThreadLocal来解决此问题,它是JDK中提供的一个类。 二、什么是ThreadLocal? ThreadLocal并不是一个Thread,而是Thread的局部变量。...的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。...方法中 //4、判断登录状态,如果已登录,则直接放行 if(request.getSession().getAttribute("employee") !...= null){ log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
项目中的工具类是借助LocalThread的当前线程储存功能来设置工具类,我们只需要定义LocalThread并给出其方法的新方法定义即可 我们给出项目中的实例展示: package com.qiuluo.reggie.common...LocalDateTime.now()); metaObject.setValue("updateUser",BaseContext.getCurrentId()); } } 实现类型转换 我们在项目遇到的一个简单的小问题...: 我们的empId设计为Long型,其中数据库为19位,但网页的JS为16位,这就会导致empId传递时会出现损失 我们通过采用消息转换器来实现传送类型发生改变: 使网页的Long型传递过来时变为String...,通常用于业务层的功能实现无法实现时抛出异常给用户查看 设置自定义异常主要分为两步: 设置自定义异常类 package com.qiuluo.reggie.common; /** * 自定义业务异常类...,但前置的mysql主从复制相对比较繁琐 主从复制 我们先来介绍主从复制的具体流程: 主库从库设置固定ID,并且给主库设置日志打开 # 进入配置文件 vim /etc/my.cnf # 主库设置 [mysqld
*/ @TableLogic//逻辑删除标识 @TableField(select = false)//查询的时候不显示 private Integer deleted...,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。...type-aliases-super-type: java.lang.Object #MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML...中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。...(select = false)//查询的时候不显示 */ /**同执行上面select可以看到 自定义的语句不可以排除被删除的也可以查询出来*/ /** * select
实现步骤: 在实体类的属性上加入@TableField注解,指定自动填充的策略 @Data public class Employee implements Serializable { private...在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口 /** * @author frx * @version 1.0 * @date 2022/5/7 19:59 * 自定义元数据对象处理器...可以使用ThreadLocal来解决此问题,它是JDK中提供的一个类。...public interface CategoryService extends IService { public void remove(Long id); } 创建自定义异常类...CustomException("当前分类下关联了套餐,不能删除"); } //正常删除分类 super.removeById(id); } } 配置全局处理自定义异常
额,说了这么多,在真正使用SpringBoot+K8S这一套技术栈的时候,也会遇到一些问题,比如我不需要使用SpringCloud时,调用其他服务时,我使用的是原生的OpenFegin,在使用OpenFegin...调用其他服务的时候,就遇到了一个大坑。...OpenFeign客户端的工厂类,这个类也比较简单,本质上就是以一个HashMap来缓存所有的FeginClient,这个的FeginClient本质上就是我们自定义的Fegin接口,缓存中的Key为请求连接的基础...URL,缓存的Value就是我们定义的FeginClient接口。...feginClientCache.put(baseUrl, feginClient); } } } return (T)feginClientCache.get(baseUrl); } } 接下来,我们就定义一个
功能完善 在上面我们已经完成基本的公共字段的设置,但是我们会注意到我们无法设置相关人的信息 因为我们在之前的服务层中采用Request来获得当前Session下的保存的员工id,但目前我们无法获得Request...Dish-Setmeal的服务层 接下来我们来介绍代码的正式实现: 首先去数据库业务层接口定义我们需要实现的方法接口: package com.qiuluo.reggie.service; import...工具类的使用 在公共字段自动填充的部分,我们为了使用ThreadLocal从而创建了相对的工具类 我们的工具类就是为了便捷操作而使用的,我们为了使用相关的参数但同时多次不用创建实体而直接使用工具类 例如我们的...; } public static Long getCurrentId(){ return threadLocal.get(); } } 异常处理 我们平时遇到的异常都是产生错误由系统抛出的异常...只有真实的项目中我们才会需要创建自己定义的异常,难点在于异常的创建格式以及将异常加入异常处理器中 首先我们需要创建自定义异常: package com.qiuluo.reggie.common; /
而且本来还打算将本文名称改成SpringBoot参数校验各种失效情景及解决, 但思考后发现失效的问题较多, 无法一一列举....然后在controller层通过@Validated(value = InsertDO.class) 来定义当前属于哪种操作并和请求实体中定义的范围进行比对. 属于对应范围后才会进行参数校验....具体请求方式的校验步骤请见下面的介绍: 普通实体 分组 请求实体 groups 可以定义校验生效的范围, 表示在操作下用于参数校验的注解才会生效....controller方法中请求实体前使用未分组的注解, 但请求实体具体属性上注解使用分组属性时, 则参数校验不生效 因此建议使用同一个请求实体时不要同时出现这两种方式, 否则可能会出现滥用导致的注解失效的问题...因此想要实现此效果需要自己自定义注解 (后续有时间的话会出专门的文章给出具体实现步骤) //@Valid和@Validated不会同时生效 @PostMapping("/saveGroup")
-------- .globalConfig(builder -> { builder.fileOverride() // 覆盖已生成文件...输出自定义文件时所用到的包名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml,...Velocity引擎模板 .execute(); } } 基础类 最简单的基础类,当然也可以不使用自己的基础类,直接使用MybatisPlus默认的基础类,...只需要把配置父类的代码删掉就可以。...但是我建议是使用自己的基础类,这样可以扩展。
,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t或tbl 此时,可以使用MyBatis-Plus提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName...@TableId中的value值在实体类中的字段和表结构的字段一致的情况下我们不用添加,但如果不一致,@TableId中的value我们需要设置表结构中的主键字段。...@TableId中还有一个比较重要的属性是Type。Type是用来定义主键的生成策略的。以下是官网截图这个可以在@TableId中配置,也可以在配置文件中统一配置全局的生成策略。...@TableField @TableField注解的作用是当实体类中的属性和表结构中的字段名称不一致的情况下来设置对应关系的,当然,在MyBatis-Plus中针对实体中是userName而表结构中是...@TableField("name") // 表结构中的name属性和name属性对应 private String name; private Integer age; private
领取专属 10元无门槛券
手把手带您无忧上云