真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

提高做CRUD操作的SQL字段賦值的方法-創(chuàng)新互聯(lián)

這篇文章主要介紹“提高做CRUD操作的SQL字段賦值的方法”,在日常操作中,相信很多人在提高做CRUD操作的SQL字段賦值的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”提高做CRUD操作的SQL字段賦值的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務至上”的服務理念,堅持“二合一”的優(yōu)良服務模式,真誠服務每家企業(yè),認真做好每個細節(jié),不斷完善自我,成就企業(yè),實現(xiàn)共贏。行業(yè)涉及成都發(fā)電機租賃等,在重慶網(wǎng)站建設、成都營銷網(wǎng)站建設、WAP手機網(wǎng)站、VI設計、軟件開發(fā)等項目上具有豐富的設計經(jīng)驗。

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

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


優(yōu)點:

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

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


缺點:

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

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

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


提高做CRUD操作的SQL字段賦值的方法

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


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

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


public static  void emptyNullValue(final T model) {
Class tClass = model.getClass();
List 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();
}
}
}

然后在代碼調(diào)用insert前調(diào)用函數(shù)來解決:


ModelHelper.emptyNullValue(request);

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


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


public static  void buildCreateAndModify(T model,ModifyModel modifyModel,boolean isCreate){
Class tClass = model.getClass();
List 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();
}
}
}

最后在數(shù)據(jù)處理前,根據(jù)創(chuàng)建或者編輯去調(diào)用函數(shù)來給系統(tǒng)字段賦值,這類代碼都混雜在業(yè)務代碼中。


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);
}

提高做CRUD操作的SQL字段賦值的方法

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


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


? 判斷是否是需要注入的參數(shù),一般通過判斷參數(shù)上是否有特殊的注解來實現(xiàn),也可以增加一個其它的參數(shù)判斷,可根據(jù)具體的業(yè)務做調(diào)整,我這里只以是否有特殊注釋來判定是否需要參數(shù)注入。


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

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


@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;
}

這段函數(shù)有幾處核心邏輯:

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

?RequestMappingHandlerAdapter


?RequestResponseBodyMethodProcessor

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

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


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

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


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

?調(diào)用處理函數(shù)解決默認字段以及系統(tǒng)的賦值,可以根據(jù)配置來決定是否處理字段默認值。


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

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






提高做CRUD操作的SQL字段賦值的方法

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

@RequestMapping(value = "/addOrUpdateUser")
@ResponseBody
public Map addOrUpdateUser(@ManageModelConfig(isSetDefaultFieldsValue=true) EmployeeDto request) {
Map 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;
}

提高做CRUD操作的SQL字段賦值的方法

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


到此,關于“提高做CRUD操作的SQL字段賦值的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享標題:提高做CRUD操作的SQL字段賦值的方法-創(chuàng)新互聯(lián)
文章路徑:http://weahome.cn/article/dgehcd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部