排除非表字段的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
让我们一起进步!!!