解決springjpa的局部更新字段問題
使用springjpa更新數(shù)據(jù)時,有時候我們需要更新部分字段,對已有的內(nèi)容保持不變,通常我們可以通過Spring提供的bean工具類BeanUtils來實(shí)現(xiàn)
解決方法:BeanUtils復(fù)制對象,BeanUtils中的構(gòu)造方法屬性中可以通過傳入更新時忽略的屬性值來實(shí)現(xiàn)選擇性復(fù)制原對象的字段。更新部分字段時,我們僅需要傳入復(fù)制后的字段即可。
解析和實(shí)現(xiàn):BeanUtils的構(gòu)造方法:
具體更新部分字段的步驟:
查詢出待更新對象的原有信息
通過傳入的更新的象去復(fù)制產(chǎn)生一個新對象,其中新對象中為null的字段不需要更新。
執(zhí)行更新操作,操作對象時步驟2得出的復(fù)制對象。
代碼如下:
public Result update(@RequestBody AppScene appScene, @PathVariable String id ){ AppScene target = appSceneService.findById(id); //數(shù)據(jù)庫查出待更新對象 BeanUtils.copyProperties(appScene,target,getNullPropertyNames(appScene)); //使用更新對象的非空值去覆蓋待更新對象 appSceneService.update(target ); //執(zhí)行更新操作 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); }更新:
這是之前剛開始學(xué)習(xí)框架的時候遇到的問題,其實(shí)這個問題spring早就提供了對應(yīng)的方法去解決,它提供了對應(yīng)bean拷貝的方法BeanUtils.copyProperties,通過傳入不同的值決定是否要忽略非空屬性值的拷貝,現(xiàn)在已經(jīng)沒有必要自己手寫了。
補(bǔ)充:Java Jpa選擇性更新、部分字段更新工具類
使用Jpa自帶的Save方法更新實(shí)體類時,會覆蓋數(shù)據(jù)庫中實(shí)體類原有內(nèi)容。如果我們只想更新一部分字段或是選擇性的更新,就只能另辟蹊徑了。
這個工具類很好地彌補(bǔ)了這個不足,對于待更新實(shí)體類中有內(nèi)容的字段會更新,為空的字段會采用原數(shù)據(jù)庫中內(nèi)容,下面是工具類代碼(附使用方法)。
工具類代碼: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); }}使用方法:
//首先從數(shù)據(jù)庫查出待更新對象Customer target = customerService.findById(customer.getCustId());//使用更新對象的非空值去覆蓋待更新對象BeanUtils.copyProperties(customer, target, UpdateColumnUtil.getNullPropertyNames(customer));//執(zhí)行更新操作save = customerService.save(target);
這樣一個映射就完成我們的需求了。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車輛管理系統(tǒng)2. 怎樣才能用js生成xmldom對象,并且在firefox中也實(shí)現(xiàn)xml數(shù)據(jù)島?3. 利用ajax+php實(shí)現(xiàn)商品價格計(jì)算4. ASP.Net MVC利用NPOI導(dǎo)入導(dǎo)出Excel的示例代碼5. jstl 字符串處理函數(shù)6. JSP動態(tài)網(wǎng)頁開發(fā)原理詳解7. PHP中為什么使用file_get_contents("php://input")接收微信通知8. .Net core Blazor+自定義日志提供器實(shí)現(xiàn)實(shí)時日志查看器的原理解析9. IOS蘋果AppStore內(nèi)購付款的服務(wù)器端php驗(yàn)證方法(使用thinkphp)10. XML CDATA是什么?
