代码如下:

//代码示例:例如保存时,传入下面两个字段

String filed;
String content;
//User代表要更新的实体,user即本对象
//filed代表要更改的字段,例如user.name
//content代表要更改字段的值,例如“张三”
import org.springframework.beans.BeanUtils;

            
            User user = new User();
            //反射赋值
//反射 + javaBean机制 get set 方法
Class<? extends User> clz = user.getClass();
PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(clz, filed); //获取当前字段的javabean写方法
Method writeMethod = propertyDescriptor.getWriteMethod();
if (writeMethod != null) {
try {
writeMethod.invoke(user, "张三");
} catch (Exception e) {
syatem.out.println(e);
}
}

JPA保存即保存对象即可,因为对象的值已经存入user对象。

User newUser = goodsMsgService.insert(oldGoodsMsg);

mybatis保存对象:

@Update("update goods_msg set ${filed} = #{context} where uid = #{uid}")
public int saveFiled(@Param("filed")String filed, @Param("uid")String uid, @Param("context")String context);

如下,有一个完整的代码示例可以参考:

//将实体字段存入List

public static final List<String> AUTH_FILEDS = Arrays.asList(new String[]{
"innerFrist",
"innerNormal",
"innerDanger",
"outFrist",
"outNormal",
"outDanger",
"notAct",
"share",
"notSub",
"exceedMaxQueryTime",
"scanCodeLimit",
"innerSafetyTime",
"outerSafetyTime",
"scanCodeLimitTime"
}); //将实体属性 对应数据库字段存入 map 方便下面mybatis更新单个字段调用 public static final Map<String,String> AUTH_FILEDS_MAPPING = new HashMap<>(); static{
AUTH_FILEDS_MAPPING.put("innerFrist","inner_frist");
AUTH_FILEDS_MAPPING.put("innerNormal", "inner_normal");
AUTH_FILEDS_MAPPING.put("innerDanger", "inner_danger");
AUTH_FILEDS_MAPPING.put("outFrist", "out_frist");
AUTH_FILEDS_MAPPING.put("outNormal", "out_normal");
AUTH_FILEDS_MAPPING.put("outDanger", "out_danger");
AUTH_FILEDS_MAPPING.put("notAct", "not_act");
AUTH_FILEDS_MAPPING.put("share", "share");
AUTH_FILEDS_MAPPING.put("notSub","not_sub");
AUTH_FILEDS_MAPPING.put("exceedMaxQueryTime", "exceed_max_query_time");
AUTH_FILEDS_MAPPING.put("scanCodeLimit","scan_code_limit");
AUTH_FILEDS_MAPPING.put("innerSafetyTime","inner_safety_time");
AUTH_FILEDS_MAPPING.put("outerSafetyTime","outer_safety_time");
AUTH_FILEDS_MAPPING.put("scanCodeLimitTime","scan_code_limit_time");
} /**
* 保存或修改(针对单一字段)
*
* ===========================非空字段===========================
* [
* 要修改的字段 : filed
* 字段内容 : context
* 是否全局 : global (1全局 0不是全局)
* 绑定的商品或分类 : guid(全局为空)
* ]
* ===========================保存逻辑===========================
* 1 检查要修改的字段是否存在
* 2 判断操作话述是否属于当前租户
* 3 判断是否是全局,不是全局guid做非空验证
* 4 如果已经存在记录则修改 如果不存在新增
*
* ===========================安全验证===========================
* guid是否属于当前租户
*
*
*/
@Override
public AjaxResult<String> saveFiled(@RequestBody SaveFiledRequestBean requestBean) {
//当前租户
TenementUser tenementUser = RequestData.TENEMENT_USER.get(); //非空
LunaResultBean.checkField(requestBean,"filed","context","global","name"); // 不是全局的非空
if (1 != requestBean.getGlobal()) {
LunaResultBean.checkField(requestBean,"guid");
} String filed = requestBean.getFiled();
String guid = requestBean.getGuid();
String context = requestBean.getContext(); AjaxResult<String> res = new AjaxResult<String>(); boolean isAdd = true;
boolean success = true;
GoodsMsg oldGoodsMsg = null;
if(AUTH_FILEDS.contains(filed)){ if (StringUtils.isNotBlank(guid)) { boolean check = goodsConfigUtils.check(GoodsConfigUtils.CHECK_GUID, guid);
if (check) { // 是否需要新增
oldGoodsMsg = goodsMsgService.findByGuid(guid); if (oldGoodsMsg != null) {
isAdd = false; } } else {
success = false;
} } else {
// 判断全局是否已经存在
oldGoodsMsg = goodsMsgService.findByGlobalMsg(tenementUser.getTenementId());
if (oldGoodsMsg != null) { isAdd = false;
} } //判断参数验证是否通过
if (success) {
if (isAdd) {
// 添加
oldGoodsMsg = new GoodsMsg();
oldGoodsMsg.initInsertData();
oldGoodsMsg.setUid(UUID.randomUUID().toString().replaceAll("-", ""));
oldGoodsMsg.setGuid(guid);
oldGoodsMsg.setGlobal(requestBean.getGlobal()); //反射赋值
//反射 + javaBean机制 get set 方法
Class<? extends GoodsMsg> clz = oldGoodsMsg.getClass();
PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(clz, filed); //获取当前字段的javabean写方法
Method writeMethod = propertyDescriptor.getWriteMethod();
if (writeMethod != null) {
try {
writeMethod.invoke(oldGoodsMsg, requestBean.getContext());
} catch (Exception e) {
throw new LunaException("方法 "+ writeMethod.getName() +"无法执行",AjaxResult.ERROR_SYS_EXCPTION);
}
} //新增
GoodsMsg insert = goodsMsgService.insert(oldGoodsMsg);
if (insert != null) {
res.initTrue("操作成功");
} else {
res.initFalse("操作失败", LunaResultBean.ERROR_BUSINESS);
} } else {
//修改
//调用mybatis update 字段 by uid
int saveFiled = goodsMsgService.saveFiled(AUTH_FILEDS_MAPPING.get(filed), oldGoodsMsg.getUid(), context); if(saveFiled > 0){
res.initTrue("操作成功");
} else {
res.initFalse("操作失败", LunaResultBean.ERROR_BUSINESS);
}
} } else {
res.initFalse("请选择正确的商品或商品类型", LunaResultBean.ERROR_BUSINESS);
} }else{
res.initFalse("无效字段 ["+ filed +"]", LunaResultBean.ERROR_BUSINESS);
} return res;
}

【spring data jpa】【mybatis】通过反射实现 更新/保存 实体的任意字段的操作的更多相关文章

  1. Spring data Jpa,Mybatis,读写锁,@Lock 使用

    Spring data jpa 支持注解式的读写锁(悲观锁),实际上这个东西硬编码也简单,但是基于Jpa 命名方式定义的Sql,只能用注解添加支持读写锁了, 不了解读写锁的可以点这里 mysql读写锁 ...

  2. 在Spring Data JPA 中使用Update Query更新实体类

    对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...

  3. Spring Data JPA查询指定列,并返回实体(改)

    现有PostEntiy实力,包含各种属性,如: /** * @Auther: DingShuo * @Date: 2018/7/18 11:09 * @Description: */ @Entity ...

  4. 关于Spring Data JPA更新部分字段的问题

    1.问题背景 个人比较喜欢Spring data JPA,这次的问题是在实体类中使用List类型作为字段,JPA也提供了操作的方法,即使用@ElementCollection注解,网上对于JPA的知识 ...

  5. 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?

    目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...

  6. spring data jpa(一)

    第1章     Spring Data JPA的快速入门 1.1   需求说明 Spring Data JPA完成客户的基本CRUD操作 1.2   搭建Spring Data JPA的开发环境 1. ...

  7. SpringBoot学习笔记:Spring Data Jpa的使用

    更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...

  8. Spring Data JPA应用之常规CRUD操作初体验

    基于对于一个陌生的技术框架,先使用后研究其实现的原则(大部分本人如此,就如小朋友学习骑自行车不会先研究自行车是怎么动起来的而是先骑会了),对于Spring JPA先通过案例实践其怎么用吧. 用之前得明 ...

  9. Spring Data JPA 自定义对象接收查询结果集

    Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...

随机推荐

  1. Hibernate 查询方法

    1.简单查询: public User select(User user) { User newUser; try { newUser = (User) session.get(User.class, ...

  2. CSS3的笔记总结

    css3  就是css2 的一个升级版本.css2 是用来做效果渲染的,而css3 可以使做出来的效果更佳丰富. C3有兼容性问题,移动端支持稍微要好些.       坚持以下原则:         ...

  3. Win10 Ubuntu18.04 编译安装 nignx

    nginx 下载页 http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.14.0.tar.gz //安装依 ...

  4. 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  5. Codeforces 934.B A Prosperous Lot

    B. A Prosperous Lot time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. bzoj [Noi2008] 1061 志愿者招募 单纯形

    [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5437  Solved: 3267[Submit][Status][Di ...

  7. .com和.cn域名的区别所在,各个域名后缀含义

    很多人在注册域名的时候不明白域名后缀的含义,在这里就介绍两种最为常用的域名,介绍下他们的区别以及适用的范围.需要先查询是否被注册,我们经常去的就是西部数据和万网,查询并注册未被注册的域名,一般无论是什 ...

  8. 【Web前端】把图片嵌入到css样式表中(附小工具)

    适用场景: 本地通过stylish等插件自定义网站样式时 开通css自定义的空间但暂无图片上传途径时 ……   举例:     把视频页的缩略图边框改为下面这种        .main_list u ...

  9. [LeetCode] Evaluate Reverse Polish Notation stack 栈

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  10. 除了IE浏览器,其他浏览器都联不上网怎么办~转载百度经验

    百度师傅最快的到家服务,最优质的电脑清灰 百度经验:jingyan.baidu.com 有个网友遇到一个非常奇怪的上网问题,刚才始,发现QQ不能登录,后来接着发现火狐浏览器也打不开网页,刚开始,以为只 ...