1. 程式人生 > >Mybatis中isNotNull與isNotEmpty的使用技巧

Mybatis中isNotNull與isNotEmpty的使用技巧

做開發工作時間長了,會發現,在需求逐步梳理清晰以後,大致的方向已經明確了。此時會進入細節開發環節,是最繁瑣,也是決定開發質量的關鍵階段。最近遇到了一個生產問題,必填欄位的值,清空儲存,無法儲存成功。

具體業務需求是這樣的:

客戶的基本資訊,坐席可以儲存,也可以提交後端系統進行審批。

1,儲存的時候,其實就是一個暫存的功能,只要坐席輸入的是合法的值,都要儲存入庫。

2,提交審批的時候會進行各種校驗,包括合法性校驗、必填校驗,業務邏輯校驗等等。

生產問題就出在這個儲存的功能上,如果一個欄位有值,但是坐席清空,點儲存,這時候儲存沒有生效。

問題其實也很好定位,我去看了一下程式碼就找到問題了。但是這個問題在生產上一直存在的。

主要是不是阻斷性問題,影響不大,所以可能有的坐席發現了,也沒有在意,沒有報生產問題。

原因就是:本該使用isNotNull的地方,缺使用了isNotEmpty

以上是從業務的角度來分析的,接下來,我們從技術角度來看一下這個問題。

isNotNull,顧名思義,就是不為null,也就是<>null

isNotEmpty,顧名思義就是不為空,也就是<>null,並且<>''(空字串)

區別也很明顯,就是是否包含空字串。針對上面的業務場景,我們需要儲存空字串,該什麼哪個呢,看一下下面2個SQL語句:

UPDATE
    PRODUCT P
SET
    UPDATE_TIME = SYSDATE
    <isNotEmpty prepend="AND" property="productName">
        P.PRODUCT_NAME = #productName#
    </isNotEmpty>
WHERE
    P.PRODUCT_ID = #productId#
UPDATE
    PRODUCT P
SET
    UPDATE_TIME = SYSDATE
    <isNotNull prepend="AND" property="productName">
        P.PRODUCT_NAME = #productName#
    </isNotNull>
WHERE
    P.PRODUCT_ID = #productId#

當頁面傳遞過來的值為空字串時,我們要保證能執行對PRODUCT_NAME的修改,很顯然,需要使用isNotNull標籤。

出問題的原因其實也簡單,就是複製貼上的程式碼,也沒有注意到isNotNull與isNotEmpty的區別。所以平時我們還是要細心,關鍵心中要有分寸,如果你很清楚的知道isNotNull與isNotEmpty的區別,一旦看到這個,你自然就會想到該如何使用。

相關推薦

MybatisisNotNullisNotEmpty的使用技巧

做開發工作時間長了,會發現,在需求逐步梳理清晰以後,大致的方向已經明確了。此時會進入細節開發環節,是最繁瑣,也是決定開發質量的關鍵階段。最近遇到了一個生產問題,必填欄位的值,清空儲存,無法儲存成功。 具體業務需求是這樣的: 客戶的基本資訊,坐席可以儲存,也可以提交後端

[轉]MyBatisresultTyperesultMap區別

作用 進一步 sel 存在 其中 對象 直接 model ati MyBatis中關於resultType和resultMap的具體區別如下: MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap。resultTy

mybatis的${}#{}的理解

破壞 字段名 數據 from 兩種 opera 使用場景 any operator   mybatis作為目前java較為常使用的orm框架,其中動態sql的參數的註入有${}與#{兩種形式,下面來介紹一下他們之間的區別,   #{}作為參數註入的方式時,從表象上來看,是在

談談mybatis的#$的區別

需要 mybatis 默認 tis 不改變 輸出 spa 字符串 _id #相當於對數據 加上 雙引號,$相當於直接顯示數據 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析

Mybatis的#{}${}區別以及什麼是SQL注入

今天搞懂了一個問題,就是在使用Mybatis時#{}與${}到底有什麼區別?原來也看過別人的部落格,感覺總是迷迷糊糊(原諒我是菜鳥),今天把這個問題整理了一遍,水平有限,各位大佬如果發現錯誤的地方請指正1,首先Mybatis中的#{}與${}到底有什麼區別?其實,區別就是如果

MybatisjdbcTypedjavaType的對應關係、及oracle、mysql的對應

Mybatis中jdbcType和javaType的對應關係 JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR

一文理清MybatisresultTyperesultMap之間的關係和使用場景

1.概要 Mybatis ORM半自動對映框架對java開發工程師來說應該是必會的框架之一。它的好處這裡不是我們討論的重點。令很

MybatisMapper代理形式開發spring整合

can sna 修改 jar xid oca pac user cal 1.導入jar包 2.分包 cogfig:存放配置文件 mapper:存放映射與接口 pojo:存放實體類 test:測試代碼 3.編寫配置文件 SqlMapConfig.xml <?

java mybatisinsert 操作 返回主鍵的小技巧。。。。

res des lec oracl 嵌入 tid batis 元素 ble 第一種方式: 在實體類的映射文件 "*Mapper.xml" 這樣寫: <insert id="insertvmatedic" keyColumn="mdid" useGeneratedKe

Mybatis#$的區別

根據 class select ssi 什麽 jdb 解析 lec 後臺 1.兩者都是動態的向sql語句中傳入需要的參數 2.#傳入的參數在SQL中顯示為字符串 eg:select id,name,age from student where id =#{id},

筆記:MyBatis$#的區別

首先MyBatis中 $與#都是動態傳參 # 將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號 $ 將傳入的資料直接顯示生成在sql中 # 佔位符號,能夠很大程度防止sql注入「語句的拼接」 $ sql拼接符號,無法防止Sql注入 如果使用在order by中就需要使用 $

mybatis${}#{}的區別

mybatis中${}和#{}都可以在增刪改查中使用 select * from student where name = ${name}; select * from student where name = #{name}; 二者的意思相同,都可以用來查詢資料庫中的內容,且查詢的結果

mybatis動態sql的實現使用

首先引用一段mybatis文件中的話: 動態 SQL     MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記新增必要的空格,還要注意去掉列表最

mybatis的find_in_set in

1.FIND_IN_SET(str,strlist)      假設,字串str在strlist的列表中,其中strlist 的字串是被“,”分開的,那麼在mybatis中的查詢語句為    “find_in_set(id,

PHP學習——24 PHP面向物件(類靜態成員的建立訪問技巧:static)

<?php class Employee { // 訪問控制符:指示類成員在哪裡可以被訪問:public/protected/private // 成員狀態符:指示如何訪問該成員:靜態self/parent/static,非靜態:$this-> public static $

Mybatis解決資料庫表字段實體類不一致的解決方法

解決方法一:通過在查詢sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致,這樣就可以使表的欄位名和實體類的屬性名一一對應上了,這種方式時通過在sql語句中定義別名來解決欄位名和屬性名的對映關係的。 解決方法二:通過<resultMap>來對映欄位名和實體類屬性名一

Mybatis${ }#{ }的區別

今天看BBS,看到有關於面試問題的一個帖子,裡面提到了關於Mybatis中的#{}和${}的區別,這裡也簡單總結記錄下。 #{ }:預編譯處理,字串替換,進行型別匹配 Mybatis處理#{}時,會將SQL語句中的變數#{}替換成?號,呼叫PreparedS

Mybatis的mapper.xml裡面${} 和 #{}區別用法

Mybatis 的Mapper.xml語句中parameterType向SQL語句傳參有兩種方式:#{}和${} #{}方式能夠很大程度防止sql注入。 $方式無法防止Sql注入。 $方式一般用於傳入資料庫物件,例如傳入表名. 一般能用#的就別用$. #{}表示一個佔

Mybatis in 語法 的# $區別

今天寫map時,(虛擬碼):update xxx t set t.a='1' where id in (#{ids});  當ids傳入為string 1,2,3 時,得出效果只是更新了id=1的資料,原來#{xxx}是一個字串,mybatis只會當他是一個值,如果你想達到字

MyBatis#和$的區別PageHelper配置詳解

一.PageHelper配置詳解 二.MyBatis中#和$的區別 #將傳入的資料都當成一個字串,會對自動傳入