亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

解決springjpa的局部更新字段問題

瀏覽:6日期:2023-07-24 13:07:18
問題描述:

使用springjpa更新數據時,有時候我們需要更新部分字段,對已有的內容保持不變,通常我們可以通過Spring提供的bean工具類BeanUtils來實現

解決方法:

BeanUtils復制對象,BeanUtils中的構造方法屬性中可以通過傳入更新時忽略的屬性值來實現選擇性復制原對象的字段。更新部分字段時,我們僅需要傳入復制后的字段即可。

解析和實現:

BeanUtils的構造方法:

具體更新部分字段的步驟:

查詢出待更新對象的原有信息

通過傳入的更新的象去復制產生一個新對象,其中新對象中為null的字段不需要更新。

執行更新操作,操作對象時步驟2得出的復制對象。

代碼如下:

public Result update(@RequestBody AppScene appScene, @PathVariable String id ){ AppScene target = appSceneService.findById(id); //數據庫查出待更新對象 BeanUtils.copyProperties(appScene,target,getNullPropertyNames(appScene)); //使用更新對象的非空值去覆蓋待更新對象 appSceneService.update(target ); //執行更新操作 return new Result(true,StatusCode.OK,'修改成功');}

其中涉及的getNullPropertyNames方法作為工具類存在,具體如下:

public static String[] getNullPropertyNames (Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set<String> emptyNames = new HashSet<String>(); for(java.beans.PropertyDescriptor pd : pds) { Object srcValue = src.getPropertyValue(pd.getName()); if (srcValue == null) emptyNames.add(pd.getName()); } String[] result = new String[emptyNames.size()]; return emptyNames.toArray(result); }更新:

這是之前剛開始學習框架的時候遇到的問題,其實這個問題spring早就提供了對應的方法去解決,它提供了對應bean拷貝的方法BeanUtils.copyProperties,通過傳入不同的值決定是否要忽略非空屬性值的拷貝,現在已經沒有必要自己手寫了。

補充:Java Jpa選擇性更新、部分字段更新工具類

使用Jpa自帶的Save方法更新實體類時,會覆蓋數據庫中實體類原有內容。如果我們只想更新一部分字段或是選擇性的更新,就只能另辟蹊徑了。

這個工具類很好地彌補了這個不足,對于待更新實體類中有內容的字段會更新,為空的字段會采用原數據庫中內容,下面是工具類代碼(附使用方法)。

工具類代碼:

import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import java.util.HashSet;import java.util.Set;/** * jpa 部分字段更新方法 */public class UpdateColumnUtil { public static String[] getNullPropertyNames(Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set<String> emptyNames = new HashSet<>(); for (java.beans.PropertyDescriptor pd : pds) { Object srcValue = src.getPropertyValue(pd.getName()); if (srcValue == null) emptyNames.add(pd.getName()); } String[] result = new String[emptyNames.size()]; return emptyNames.toArray(result); }}使用方法:

//首先從數據庫查出待更新對象Customer target = customerService.findById(customer.getCustId());//使用更新對象的非空值去覆蓋待更新對象BeanUtils.copyProperties(customer, target, UpdateColumnUtil.getNullPropertyNames(customer));//執行更新操作save = customerService.save(target);

這樣一個映射就完成我們的需求了。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产免费久久精品99re丫y | 欧美成人免费公开播放 | 国产午夜亚洲精品国产 | 免费国产成人α片 | 久久亚洲精品23p | 日鲁夜鲁鲁狠狠综合视频 | 一区二区三区影视 | 亚洲欧美久久精品一区 | 美一级片 | 亚洲国产日韩欧美在线 | 日本在线观看www免费 | 久久毛片免费看一区二区三区 | 一级特级aaaa毛片免费观看 | 日韩一区二区在线视频 | 亚洲美女精品视频 | 欧美在线观看一区 | 九九亚洲精品自拍 | 日韩精品首页 | 中文字幕在线成人免费看 | 日本亚欧乱色视频在线网站 | 国产乱码一区二区三区四川人 | 欧美特级午夜一区二区三区 | 国产日本一区二区三区 | 成人欧美视频在线看免费 | 久草在线青青草 | 欧美成人a大片 | 成年男女免费视频网站 | 欧美日本道免费一区二区三区 | 中国国产一级毛片视频 | 亚洲精品一区二区久久 | 日韩精品一区二区三区毛片 | 国产精品黄页在线播放免费 | 欧美一区二区在线观看视频 | 一个人看的www日本高清视频 | 色拍拍在精品视频69影院在线 | 久艹在线观看视频 | 经典三级在线视频 | 国产精品色内内在线播放 | 18年大片免费在线 | 日韩欧美色综合 | 成人免费高清视频 |