排除非表字段的3种方式

常见编程场景:
实体类中某个变量不对应数据库的表中的任何字段,用于暂时保存临时数据或者通过某种方式计算或组装的数据。

文章目录

  • 一、举个栗子:
    • 1.1 在User实体类中,添加remark属性
    • 1.2 执行插入操作:
    • 1.3 异常信息:
    • 1.4 问题定位
    • 1.5 解决方案
  • 二、针对以上场景,MP提供了三种解决方案
    • 2.1 第一种解决方案:
      • 2.1.1 在remark属性上添加transient 关键字
      • 2.1.2 再次执行插入成功:
      • 2.1.3 控制台输出
    • 2.2 第二种解决方案:
      • 2.2.1 在remark属性上添加static 关键字
      • 2.2.2 再次执行插入成功:
      • 2.2.3 控制台输出
    • 2.3 第三种解决方案(建议使用):
      • 2.3.1 在remark属性上添加@TableField注解
      • 2.3.2 在此执行插入成功:
      • 2.3.3 控制台输出

一、举个栗子:

1.1 在User实体类中,添加remark属性

//备注 保存用于程序调用或者组装的数据,在数据库中没有对应的字段
@Data
@TableName("mp_user")
public class User {//主键@TableIdprivate Long userId;//姓名@TableField("name")private String roleName;//年龄private Integer age;//邮箱private String email;//创建时间private LocalDateTime createTime;//备注 保存用于程序调用或者组装的数据,在数据库中没有对应的字段private String remark;
}

1.2 执行插入操作:

 /*** 测试与数据库无对应字段*/@Testpublic void insertNoCorField() {User user = new User();user.setRoleName("gblfy");user.setAge(26);user.setCreateTime(LocalDateTime.now());user.setRemark("数据库中无对应字段");int rows = userMapper.insert(user);System.out.println("影响数据库的条数:" + rows);}

1.3 异常信息:

org.springframework.jdbc.BadSqlGrammarException:
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column 'remark' in 'field list'
### The error may exist in com/gblfy/mp/mybatisplus/samplesquickstart/mapper/UserMapper.java (best guess)
### The error may involve com.gblfy.mp.mybatisplus.samplesquickstart.mapper.UserMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO mp_user  ( user_id, name, age,  create_time, remark )  VALUES  ( ?, ?, ?,  ?, ? )
### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'remark' in 'field list'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'remark' in 'field list'

1.4 问题定位

数据库中无remark字段列,插入数据库时,字段数量对应不上,导致抛出异常

1.5 解决方案

二、针对以上场景,MP提供了三种解决方案

2.1 第一种解决方案:

2.1.1 在remark属性上添加transient 关键字

  • 表明不参与序列化过程
/*第一种情况*/
private transient String remark;

2.1.2 再次执行插入成功:

  /*** 第一种解决方案:* * 添加transient关键字,不参与序列化过程* * 测试与数据库无对应字段*/@Testpublic void insertNoCorField() {User user = new User();user.setRoleName("gblfy");user.setAge(26);user.setCreateTime(LocalDateTime.now());user.setRemark("数据库中无对应字段");int rows = userMapper.insert(user);System.out.println("影响数据库的条数:" + rows);}

2.1.3 控制台输出

上面加上transient 关键字,不参与序列化过程,但是,我需要参与序列化怎么办呢?

2.2 第二种解决方案:

2.2.1 在remark属性上添加static 关键字

  • 表明时静态的,需要手动添加set和get方法,lombok不会生成
    /*第二种情况*///备注 保存用于程序调用或者组装的数据,在数据库中没有对应的字段private static String remark;public static String getRemark() {return remark;}public static void setRemark(String remark) {User.remark = remark;}

2.2.2 再次执行插入成功:

/*** 第二种解决方案:** 1.添加static关键字* 2.表明remark属性是静态的* 3.可以用类名直接调用** 测试与数据库无对应字段*/@Testpublic void insertNoCorField2() {User user = new User();user.setRoleName("gblfy");user.setAge(26);user.setCreateTime(LocalDateTime.now());//用类名直接调用setRemark方法User.setRemark("数据库中无对应字段");int rows = userMapper.insert(user);System.out.println("影响数据库的条数:" + rows);}

2.2.3 控制台输出

第二种 remark这个属性想每个对象对应一个,应该如何处理?

2.3 第三种解决方案(建议使用):

1.添加@TableField(exist = false)注解,并将exist设置为false,默认为true 数据库有此字段
2.表明remark属性在数据库是不存在的

2.3.1 在remark属性上添加@TableField注解

    /*第三种情况*/@TableField(exist = false)private String remark;

2.3.2 在此执行插入成功:

/*** 第三种解决方案:** 1.添加@TableField(exist = false)注解,并将exist设置为false,默认为true 数据库有此字段* 2.表明remark属性在数据库是不存在的** 测试与数据库无对应字段*/@Testpublic void insertNoCorField3() {User user = new User();user.setRoleName("gblfy");user.setAge(26);user.setCreateTime(LocalDateTime.now());//用类名直接调用setRemark方法user.setRemark("第三种情况_数据库中无对应字段");int rows = userMapper.insert(user);System.out.println("影响数据库的条数:" + rows);}

2.3.3 控制台输出

想学习更多微服务、分布式、中间件、数据库、项目快速构建等系列技术
请访问http://gblfy.com
让我们一起进步!!!

MyBatis-Plus_入门试炼03相关推荐

  1. 第七篇:Spring Boot整合Thymeleaf_入门试炼03

    基本语法实战案例01 在ThymeleafController中添加此方法 @RequestMapping("/show5")public String showInfo5(Mod ...

  2. 第十篇:Spring Boot整合mybatis+Mysql 入门试炼02

    前言: 1.(SprigBoot整合SpringMVC+Mybatis) 2.以thymeleaf作为视图层技术整合 3.springboot版本2.0.5.RELEASE 创建项目 1.添加依赖及启 ...

  3. Guns 查询列表_入门试炼03

    一.插入数据进行测试: INSERT INTO `guns`.`sys_house` (`id`, `house_user`, `house_address`, `house_date`, `hous ...

  4. Centos7 Docker容器操作_入门试炼03

    文章目录 一.容器常用命令 二.查看容器 2.1. 查看正在运行容器 2.2. 查看所有的容器(启动过的历史容器) 2.3. 查看最后一次运行的容器 2.4. 查看停止的容器 三.容器创建和运行 3. ...

  5. Jenkins_安装基础软件_入门试炼03

    应用部署服务器准备: 本章对Linux系统简介.安装Java环境.安装并配置 Git.安装并配置 Maven.安装并配置 Tomcat.以及将部署服务器配置到Jenkins上. 一.Linux操作系统 ...

  6. 第九篇:Spring Boot整合Spring Data JPA_入门试炼03

    CrudRepository接口的使用 CrudRepository接口,主要完成一些增删改查的操作. 注意:CrudRepository接口继承Repository接口 1.持久层接口: packa ...

  7. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

  8. MyBatis学习总结(1)——MyBatis快速入门

    2019独角兽企业重金招聘Python工程师标准>>> 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所 ...

  9. MyBatis基础入门《九》ResultMap自动匹配

    MyBatis基础入门<九>ResultMap自动匹配 描述: Mybatis执行select查询后,使用ResultMap接收查询的数据结果. 实体类:TblClient.java 接口 ...

最新文章

  1. 图论中的知识点(等待补充和更新)
  2. 汇编语言--sbb指令
  3. 源码安装python
  4. 一组匹配中国大陆手机号的正则表达式
  5. 后端传到前端的字符串如何在pre标签中实现换行
  6. Python Numpy中transpose()函数的使用
  7. uniapp调用c语言方法,uni-app 入坑指南-web开发
  8. java day43【Filter:过滤器 、Listener:监听器】
  9. 基于91助手实现80/54坐标转换到2000大地坐标的七参数计算
  10. multsim 函数发生器的使用
  11. 计算机组成原理:原,反,补码,加减运算,溢出判断,符号扩展
  12. 烤仔的朋友们 | 细数11位身价超十亿美元加密富豪,灰度创始人仅排第七
  13. iPhone备忘录删了怎么恢复?恢复备忘录的两大方法!
  14. 巧用天翼云盘备份云主机数据
  15. android canvas画图gc,自定义控件绘图(Canvas,Paint,Region等)篇一
  16. 《ESP32》Adafruit_GFX、u8g2驱动ssd1306
  17. 自动绘制公路工程纵断面的AutoLisp程序
  18. 人工智能--语义网络表示法
  19. Kafka手动提交偏移量的作用到底是什么???
  20. 我烧的第一个菜-酸辣土豆丝

热门文章

  1. 《碟中谍5》中惊鸿一瞥的步态识别技术,究其神在哪里?
  2. oracle dba_waiters中的lockid是什么,查杀oracle lock session and table
  3. 【使用注意】文件内容突然消失
  4. FileOutputStream为false时候注意的问题
  5. 【转载保存】Java丨jsoup网络爬虫登录得到cookie并带上cookie访问
  6. CDH 配置YARN动态资源池的计划模式,根据时间划分资源,不同时间不同队列使用不同资源
  7. Oracle数据到MaxCompute乱码问题详解
  8. MaxCompute在电商场景中如何进行漏斗模型分析
  9. 聚焦数字化智慧安防的新型社区
  10. Sentinel 成为 Spring Cloud 官方推荐的主流熔断降级方案