婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 在CRUD操作中與業務無關的SQL字段賦值的方法

在CRUD操作中與業務無關的SQL字段賦值的方法

熱門標簽:怎么去開發一個電銷機器人 南昌呼叫中心外呼系統哪家好 ai電話電話機器人 河北便宜電銷機器人軟件 小程序智能電話機器人 泗洪正規電話機器人找哪家 怎么申請400熱線電話 簡單的智能語音電銷機器人 湖南保險智能外呼系統產品介紹

提高效率一直是個永恒的話題,編程中有一項也是可以提到效率的,那就是專注做一件事情,讓其它沒有強緊密聯系的與之分開。這里分享下我們做CRUD時遇到的常見數據處理場景:

•數據庫表字段全部設計為非空,即使這個字段在業務上是可以為空的,之所以將數據庫表字段全部設計為非空,這里有優點也有缺點,我們認為優點大于缺點,所以選擇了它

優點:

1.獲取值時,不用判斷這個字段是否為null,直接可用于邏輯運算。

2.mysql DBA推薦此方案,可能是有利于性能,這里我并非求證過。

缺點:

1.業務含義沒有null清楚,比如int字段默認值設置成0,0就沒有null語義清晰。

2.在使用ORM插入數據時,需要處理非空字段值為null的問題。

• 系統字段的賦值,比如創建人,創建人id,創建時間,編輯人,編輯人id,編輯時間等,這些都需要在實際插入數據庫前賦值給Model。這些系統字段與具體的業務一般沒有太大的關聯關系,只是起到標注數據被什么人在什么時間處理的,當這些非業務相關的代碼充斥在代碼中時,就顯得有些多余,而且這類代碼多了也會顯示冗余,最后帶來的結果就是非關鍵代碼比例大。

上面關于默認值與null語義問題不需要解決,因為我們認為具有默認值帶來的優點遠大于可空字段帶來的煩惱,我們來看默認值與系統字段一般情況下如何處理:

•在操作ORM時,將模型所有可空的字段都手動賦值成默認值,int的賦值為0等。

•在設計數據庫時,將非空字段加上默認值,讓數據庫來處理這些未插入值的字段,如果使用mybatis的話,mapper中提到的插入操作有兩個:insert,insertSelective,后面這個insertSelective就是處理非空字段的,即插入的模型對于不需要賦值的字段就保持null值,數據庫在插入時生成的sql語句也不會包含這些字段,這樣就可以利用上數據庫的默認值了。如果正巧數據庫的結構當初設計時沒有設計默認值,又不能改的情況就比較糟糕了,情況回到上面手動賦值,可能會出現類似如下的代碼:編寫一個函數通過反射來解析每個字段,如果為null就修改為默認值:

public static T> void emptyNullValue(final T model) {
Class?> tClass = model.getClass();
ListField> fields = Arrays.asList(tClass.getDeclaredFields());
for (Field field : fields) {
Type t = field.getType();
field.setAccessible(true);
try {
if (t == String.class  field.get(model) == null) {
field.set(model, "");
} else if (t == BigDecimal.class  field.get(model) == null) {
field.set(model, new BigDecimal(0));
} else if (t == Long.class  field.get(model) == null) {
field.set(model, new Long(0));
} else if (t == Integer.class  field.get(model) == null) {
field.set(model, new Integer(0));
} else if (t == Date.class  field.get(model) == null) {
field.set(model, TimeHelper.LocalDateTimeToDate(java.time.LocalDateTime.of(1990, 1, 1, 0, 0, 0, 0)));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
} 

然后在代碼調用insert前調用函數來解決:

ModelHelper.emptyNullValue(request); 

如何處理系統字段呢,在創建編輯數據時,需要獲取當前用戶,然后根據邏輯分別更新創建人信息以及編輯人信息,我們專門編寫一個反射機制的函數來處理系統字段:

注:下面的系統字段的識別,是靠系統約定實現的,比如creator約定為創建人等,可根據不同的情況做數據兼容,如果系統設計的好,一般在一個系統下所有表的風格應該是相同的。

public static T> void buildCreateAndModify(T model,ModifyModel modifyModel,boolean isCreate){
Class?> tClass = model.getClass();
ListField> fields = Arrays.asList(tClass.getDeclaredFields());
for (Field field : fields) {
Type t = field.getType();
field.setAccessible(true);
try {
if(isCreate){
if (field.getName().equals(modifyModel.getcId())) {
field.set(model, modifyModel.getUserId());
}
if (field.getName().equals(modifyModel.getcName())) {
field.set(model, modifyModel.getUserName());
}
if (field.getName().equals(modifyModel.getcTime())) {
field.set(model, new Date());
}
}
if (field.getName().equals(modifyModel.getmId())) {
field.set(model, modifyModel.getUserId());
}
if (field.getName().equals(modifyModel.getmName())) {
field.set(model, modifyModel.getUserName());
}
if (field.getName().equals(modifyModel.getmTime())) {
field.set(model, new Date());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}

最后在數據處理前,根據創建或者編輯去調用函數來給系統字段賦值,這類代碼都混雜在業務代碼中。

ModifyModel modifyModel = new ModifyModel();
modifyModel.setUserId(getCurrentEmployee().getId());
modifyModel.setUserName(getCurrentEmployee().getName());
if (request.getId() == 0) {
ModelHelper.buildCreateAndModify(request, modifyModel, true);
deptService.insert(request);
} else {
ModelHelper.buildCreateAndModify(request, modifyModel, false);
deptService.updateByPrimaryKey(request);
}

我們可以利用參數注入來解決。參數注入的理念就是在spring mvc接收到前臺請求的參數后,進一步對接收到的參數做處理以達到預期的效果。我們來創建

ManageModelConfigMethodArgumentResolver,它需要實現HandlerMethodArgumentResolver,這個接口看起來比較簡單,包含兩個核心方法:

• 判斷是否是需要注入的參數,一般通過判斷參數上是否有特殊的注解來實現,也可以增加一個其它的參數判斷,可根據具體的業務做調整,我這里只以是否有特殊注釋來判定是否需要參數注入。

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(ManageModelConfig.class);
}

• 參數注入,它提供了一個擴展入口,讓我們有機會對接收到的參數做進一步的處理。

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Object manageModel =getRequestResponseBodyMethodProcessor().resolveArgument(parameter, mavContainer, webRequest, binderFactory);
ServletRequest servletRequest = webRequest.getNativeRequest(ServletRequest.class);
Employee currentUser = (Employee) servletRequest.getAttribute(DEFAULT_ATTRIBUTE_GET_USER_FROM_REQUEST);
if (null == currentUser)
{
return manageModel;
}
ManageModelConfig parameterAnnotation = parameter.getParameterAnnotation(ManageModelConfig.class);
ModelHelper.setDefaultAndSystemFieldsValue(manageModel, currentUser,parameterAnnotation.isSetDefaultFieldsValue());
return manageModel;
}

這段函數有幾處核心邏輯:

•取得參數對象,因為我們處理的是ajax請求的參數,最簡單的注入方法就是得到實際參數通過反射去處理默認字段以及系統的值。ajax請求與form表單post提交的數據綁定略有不同,可參考之前文章分享的列表頁動態搜索的參數注入(列表頁的動態條件搜索)。獲取當前請求參數對象,我們可以借助如下兩個對象配合來完成:

•RequestMappingHandlerAdapter

•RequestResponseBodyMethodProcessor

private RequestMappingHandlerAdapter requestMappingHandlerAdapter=null;
private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor = null;
private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor() {
if(null==requestMappingHandlerAdapter)
{
requestMappingHandlerAdapter=new RequestMappingHandlerAdapter();
}
if (null==requestResponseBodyMethodProcessor) {
ListHttpMessageConverter?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters();
messageConverters.add(new MappingJackson2HttpMessageConverter());
requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters);
}
return requestResponseBodyMethodProcessor;
} 

通過如下代碼就可以取到參數對象了,其實就是讓spring mvc重新解析了一遍參數。

Object manageModel =getRequestResponseBodyMethodProcessor().resolveArgument(parameter, mavContainer, webRequest, binderFactory); 

•如何獲取當前用戶,我們在成功登錄系統后,將當前用戶的信息存儲在request中,然后就可以在函數中獲取當前用戶,也可以采用其它方案,比如ThreadLocal,緩存等等。

ServletRequest servletRequest = webRequest.getNativeRequest(ServletRequest.class);
Employee currentUser = (Employee) servletRequest.getAttribute(DEFAULT_ATTRIBUTE_GET_USER_FROM_REQUEST); 

•調用處理函數解決默認字段以及系統的賦值,可以根據配置來決定是否處理字段默認值。

ManageModelConfig parameterAnnotation = parameter.getParameterAnnotation(ManageModelConfig.class);
ModelHelper.setDefaultAndSystemFieldsValue(manageModel, currentUser,parameterAnnotation.isSetDefaultFieldsValue());

最后將我們的參數注入邏輯啟動起來,這里選擇在xml中配置:

mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
mvc:argument-resolvers>
bean class="cn.wanmei.party.management.common.mvc.method.annotation.ManageModelConfigMethodArgumentResolver"/>
/mvc:argument-resolvers>
/mvc:annotation-driven> 

再看action中的調用:只需要在參數前面增加注解@ManageModelConfig,如果需要處理默認值,則將啟用默認值的選項設置成true即可,下面的實現部分完全看不到任何與業務無關的代碼。

@RequestMapping(value = "/addOrUpdateUser")
@ResponseBody
public MapString, Object> addOrUpdateUser(@ManageModelConfig(isSetDefaultFieldsValue=true) EmployeeDto request) {
MapString, Object> ret = new HashMap>();
ValidateUtil.ValidateResult result= new ValidateUtil().ValidateModel(request);
boolean isCreate=request.getId() == 0;
try {
if (isCreate)
{
employeeService.insert(request);
}
else
{
employeeService.updateByPrimaryKey(request);
}
ret.put("data", "ok");
}catch (Exception e){
ret.put("err", e.getMessage());
}
return ret;
}

通過自定義實現HandlerMethodArgumentResolver,來捕獲ajax請求的參數,利用反射機制動態的將系統字段以及需要處理默認值的字段自動賦值,避免人工干預,起到了代碼精簡,邏輯干凈,問題統一處理的目的。需要注意的是這些實現都是結合當前系統設計的,比如我們認為id字段>0就代表是更新操作,為空或者等于小于0就代表是創建,系統字段也是約定名稱的等等。

您可能感興趣的文章:
  • SQL學習筆記五去重,給新加字段賦值的方法

標簽:景德鎮 瀘州 江蘇 淮安 威海 荊門 柳州 那曲

巨人網絡通訊聲明:本文標題《在CRUD操作中與業務無關的SQL字段賦值的方法》,本文關鍵詞  在,CRUD,操作,中,與,業務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《在CRUD操作中與業務無關的SQL字段賦值的方法》相關的同類信息!
  • 本頁收集關于在CRUD操作中與業務無關的SQL字段賦值的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本午夜一本久久久综合| 26uuu另类欧美亚洲曰本| 亚洲一区二区欧美日韩| 久久亚洲一区二区三区四区| 在线观看亚洲a| 成人视屏免费看| 日韩av电影免费观看高清完整版在线观看 | 精品剧情v国产在线观看在线| 成人av影院在线| 国模冰冰炮一区二区| 日本伊人色综合网| 水野朝阳av一区二区三区| 亚洲福利电影网| 中文字幕日本乱码精品影院| 亚洲国产精品黑人久久久| 亚洲精品一区在线观看| 日韩欧美卡一卡二| 日韩一区二区不卡| 日韩亚洲欧美成人一区| 91精品国产一区二区三区蜜臀| 欧美日精品一区视频| 欧美日韩精品一区视频| 欧美精品久久99| 欧美一区在线视频| 日韩欧美一二三四区| 欧美va天堂va视频va在线| 精品国产3级a| 国产精品卡一卡二| 亚洲综合免费观看高清完整版| 夜夜操天天操亚洲| 一区二区三区精品视频| 亚洲成人综合在线| 青椒成人免费视频| 国产成人精品www牛牛影视| 99免费精品在线| 欧美日韩一区二区三区不卡| 日韩一卡二卡三卡四卡| 久久精品亚洲精品国产欧美kt∨ | 成人免费视频国产在线观看| www.欧美亚洲| 欧美日韩一区二区三区四区五区| 欧美老年两性高潮| 久久久久久亚洲综合影院红桃| 国产免费观看久久| 亚洲国产精品一区二区久久恐怖片| 视频一区二区三区入口| 国产毛片精品视频| 色综合av在线| 日韩三级高清在线| 国产精品天天看| 亚洲18色成人| 成人教育av在线| 欧美日韩高清一区二区不卡| 国产日韩欧美亚洲| 亚洲国产日韩综合久久精品| 国产又黄又大久久| 在线免费亚洲电影| 中文字幕欧美日本乱码一线二线| 亚洲黄色小视频| 奇米亚洲午夜久久精品| 91影视在线播放| 26uuu精品一区二区三区四区在线| 亚洲精品一二三区| 成人国产亚洲欧美成人综合网| 99re这里都是精品| 精品国产一区二区精华| 亚洲自拍与偷拍| 国产一区在线精品| 欧美男人的天堂一二区| 中文字幕中文字幕在线一区| 日日夜夜免费精品| 91精品91久久久中77777| 精品国产乱码久久久久久蜜臀| 亚洲图片激情小说| 成人一二三区视频| 久久久精品天堂| 午夜精品免费在线| 99精品久久久久久| 久久综合精品国产一区二区三区| 午夜精品一区二区三区免费视频 | 午夜视频一区在线观看| 久久疯狂做爰流白浆xx| 欧美性感一类影片在线播放| 中文字幕欧美激情| 成人精品国产免费网站| 中文字幕欧美国产| 国产在线精品一区二区不卡了 | 五月天国产精品| 色婷婷激情一区二区三区| 国产天堂亚洲国产碰碰| 极品尤物av久久免费看| 日韩免费观看高清完整版在线观看| 亚洲欧美视频在线观看| www.久久精品| 最新高清无码专区| 91蜜桃在线观看| 亚洲视频一二区| 99精品欧美一区二区三区小说| 欧美国产97人人爽人人喊| 国产一区二区三区高清播放| 欧美一级免费大片| 日本aⅴ精品一区二区三区| 欧美一区二区三区成人| 精品影视av免费| 久久精品人人做人人爽人人| 成人高清视频在线观看| 亚洲欧美日韩国产综合| 色噜噜狠狠色综合欧洲selulu| 亚洲欧美日韩国产中文在线| 国产成人精品亚洲日本在线桃色| 欧美韩日一区二区三区| 91视频在线观看免费| 亚洲精品国产高清久久伦理二区| 成人小视频在线| 亚洲一二三专区| 欧美午夜精品久久久久久超碰| 亚洲女人的天堂| 欧美丝袜丝交足nylons| 久久激情综合网| 亚洲国产精品t66y| 在线观看欧美精品| 久久精品国产精品亚洲红杏| 久久久久青草大香线综合精品| a美女胸又www黄视频久久| 亚洲第一成人在线| 久久久www成人免费无遮挡大片 | 国产精品欧美一区二区三区| 欧美性一级生活| 蜜桃一区二区三区在线| 久久精品亚洲国产奇米99| 91一区二区三区在线播放| 美女视频黄免费的久久| 亚洲国产精品传媒在线观看| 91亚洲永久精品| 天堂成人免费av电影一区| 日韩欧美色综合| 97超碰欧美中文字幕| 亚洲成人www| 国产精品久久久久三级| 欧美裸体bbwbbwbbw| 国产成人精品免费在线| 亚洲欧美日本在线| 精品国产伦理网| 欧美在线一二三四区| 捆绑调教美女网站视频一区| 亚洲少妇中出一区| 久久五月婷婷丁香社区| 欧美日韩一区二区在线视频| 国产麻豆视频一区| 日韩高清不卡一区二区三区| 中文字幕一区二区日韩精品绯色| 欧美夫妻性生活| voyeur盗摄精品| 国产精品一区二区男女羞羞无遮挡 | 亚洲欧美激情插| 久久久www成人免费无遮挡大片| 欧美日韩和欧美的一区二区| 成人动漫av在线| 婷婷综合在线观看| 国产日韩欧美制服另类| 91精品国产综合久久精品性色| 91看片淫黄大片一级在线观看| 国产精品综合二区| 美日韩一区二区| 日韩精品一二三区| 日韩黄色片在线观看| 亚洲成a人在线观看| 综合色天天鬼久久鬼色| 中文字幕一区av| 国产亚洲综合在线| 国产香蕉久久精品综合网| 26uuu成人网一区二区三区| 欧美一区二区不卡视频| 欧美区在线观看| 91精品在线麻豆| 欧美精品自拍偷拍动漫精品| 欧美一区二区视频在线观看2022| 亚洲一区二区免费视频| 亚洲色图视频网站| 18成人在线观看| 亚洲天堂2014| 亚洲老妇xxxxxx| 欧美一级欧美一级在线播放| 欧美精品一卡二卡| 欧美伦理视频网站| 91精品啪在线观看国产60岁| 日韩午夜在线播放| 色婷婷久久久亚洲一区二区三区 | 日韩一区二区不卡| 欧美不卡一区二区三区四区| 日韩一区二区电影在线| 欧美一区日韩一区| 2023国产精品| 国产情人综合久久777777| 日本一区二区三区dvd视频在线| 国产欧美视频在线观看| 亚洲天堂成人网| 国产丝袜欧美中文另类| 综合久久一区二区三区| 一区二区在线看|