基於mybatis設計簡單OA系統問題3

来源:https://www.cnblogs.com/thyHome/archive/2018/05/11/9022655.html
-Advertisement-
Play Games

1、 問題:使用mybatis更新數據失敗 描述:java.lang.NullPointerException 提交表單 問題可能是因為中文亂碼 列印輸出可以看出問題是因為頁面傳回來的數據為亂碼,但是在servlet中有設置接收數據的格式,那問題應該是jsp頁面提交的數據亂碼 原因:未指定具體的提交 ...


1、  問題:使用mybatis更新數據失敗

描述:java.lang.NullPointerException

提交表單

 

 

com.duma.entity.User.updateUser     - ==> Parameters: ?¤§???(String), 23(Integer), nv(String), 1232342343(String), [email protected](String), 2018-05-06 13:11:38.16(Timestamp), 6666(String), 1(Integer)

問題可能是因為中文亂碼

 

列印輸出可以看出問題是因為頁面傳回來的數據為亂碼,但是在servlet中有設置接收數據的格式,那問題應該是jsp頁面提交的數據亂碼

原因:未指定具體的提交方式。

 

 2、問題:java.lang.NumberFormatException: For input string: ""

分析原因應該是類型轉換的時候出錯,如果輸入為空得到的字元串為"",而不是null值,於是在類型轉換的時候格式不匹配,修改代碼

String ageStr = request.getParameter("age");

Integer age= null;

if(ageStr!=null&&!ageStr.equals("")){

age= Integer.valueOf(ageStr);

}
繼續測試提交部分預設(為空)表達還是錯誤
java.lang.NullPointerException
       at com.duma.dao.UserDao.updateUser(UserDao.java:67)

首先認識事務提交mybatis和MySQL引擎innoDB區別。Mybatis預設不提交,innodb預設自動提交事務。所以,我們在使用的時候需要在mybatis手動commit。

 

而我已經手動關閉,所以問題應該是SQL語句的問題。查看日誌可以看見:

13143 DEBUG [http-bio-8080-exec-9]       com.duma.entity.User.updateUser     - ==>  Preparing: update user SET nickname=?, gender=?, phone=?, email=?, updateTime=?, remark=? where id=?

13144 DEBUG [http-bio-8080-exec-9]       com.duma.entity.User.updateUser     - ==> Parameters: 大慕(String), 女(String), (String), (String), 2018-05-06 15:49:28.294(Timestamp), (String), 1(Integer)

 

提交數據為空的項在mapper的if判斷下,還是成功加入添加到SQL語句

仔細觀察可以發現

 

 

紅色框username值為null,在查詢的時候就沒有添加,而phone值為””時卻添加到了語句中

 

Google他們之間的區別得到:

 

空對象: String s = null;

空對象是指定義一個對象s,但是沒有給該對象分配空間,即沒有實例化該對象,因此,空對象在調用所有對象方法時候都會拋出異常,如s.length(), s.isEmpty()等方法。

空值: String k = "";

空值是指一個字元床對象已經實例化,即系統已經給該變數分配了空間,只是對象的內容為空。

空格: String n = " ";

是指一個字元對象已經實例化,對象的內容為空格。

博客:http://ych0108.iteye.com/blog/2125427

 

於是修改userMapper的配置

<update id="updateUser">

        update user

        <set>

            <if test="username!=null and username !=''">username=#{username},</if>

            <if test="userpass!=null and userpass!=''">userpass=#{userpass},</if>

            <if test="nickname!=null and nickname!=''">nickname=#{nickname},</if>

            <if test="age!=null and age!=''">age=#{age},</if>

            <if test="gender!=null and gender!=''">gender=#{gender},</if>

            <if test="phone!=null and phone!=''">phone=#{phone},</if>

            <if test="email!=null and email!=''">email=#{email},</if>

            <if test="createTime!=null and createTime!=''">createTime=#{createTime},</if>

            <if test="updateTime!=null and updateTime!=''">updateTime=#{updateTime},</if>

            <if test="lastLogin!=null and lastLogin!=''">lastLogin=#{lastLogin},</if>

            <if test="userStatus!=null and userStatus!=''">userStatus=#{userStatus},</if>

            <if test="remark!=null and remark!=''">remark=#{remark},</if>

        </set>

        where id=#{id}

</update>
繼續測試提交預設(為空)表達,server報錯
org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

Google得到:

原來這是mybatis 3.3.0中對於時間參數進行比較時的一個bug. 如果拿傳入的時間類型參數與空字元串''進行對比判斷則會引發異常. 所以在上面的代碼中去該該判斷, 只保留非空判斷就正常了

<if test="updateTime!=null">updateTime=#{updateTime},</if>

 

繼續實現這個功能,還是沒有update成功

java.lang.NullPointerException空指針異常,異常位置

sqlSession.commit();

 

修改:

SqlSession Session = getSqlSession();

      row = Session.update("updateUser", user);

      Session.commit();

將調用之後的session對象進行commit,成功更新列表

 

 

3、  添加用戶成功資料庫返回數據亂碼

 

 

檢查發現是頁面傳回servlet亂碼,是未修改post提交方式的編碼

 

 

4、  思考mybatis多次修改資料庫數據變得很慢的原因

 

1、資料庫為了優化性能,有時候不會設置外鍵,而是通過邏輯關聯連接,方便管理

2、自增ID可以設置起始欄位,這樣可以預留位置。

 

5、  第二個模塊為灰色

 

原因是

 

Maven忽略文件勾選為了灰色

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 課程是按照真實企業級開發項目流程進行講解,通過學習此課程可以體會到真實的大型大數據項目開發流程,學完此課程可以熟練掌握大數據技術,java web技術,docker虛擬化技術,分散式技術,緩存技術,linux等。 ...
  • 雙擊 勾上藍色保存 ...
  • 驗證客戶端鏈接的合法性 如果你想在分散式系統中實現一個簡單的客戶端鏈接認證功能,又不像SSL那麼複雜, 那麼可以利用hmac+加鹽的方式來實現。 SocketServer是標準庫中的一個高級模塊(python3.x中重命名為socketserver), 它的目標是簡化很多樣板代碼,它們是創建網路客... ...
  • Java開源生鮮電商平臺-商品表的設計(源碼可下載) 任何一個電商,無論是B2C還是B2B的電商,商品表的設計關係到整個系統架構的核心。 1. 商品基本信息表:用單詞:goods做為商品表 2. 商品分類信息表: 說明:商品分類信息表存在父子級關係,採用parent_id來做父類,預設是0表示頂級。 ...
  • ref:https://www.cnblogs.com/dongguacai/p/6030187.html http://www.360doc.com/content/15/0511/14/12726874_469670444.shtml https://blog.csdn.net/honghail ...
  • 在前面的文章,我提到過VSCO Cam 的膠片濾鏡演算法實現是3d lut。 那麼3d lut 到底是個什麼東西呢? 或者說它是用來做什麼的? 長話短說,3d lut(全稱 : 3D Lookup table )它是通過建立一個顏色映射表,對圖像的色調進行重調的演算法。 有用於攝像機的效果美化潤色,例如 ...
  • 1. 封裝 面向對象三大特性:封裝、繼承、多態 封裝(Encapsulation):這是定義類的 準則,單個類。根據 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中。 封裝的意義: 1.將屬性和方法放到一起做為一個整體,然後通過實例化對象來處理; 2.隱藏內部實現細節,只需要和對象及其屬性和方 ...
  • https://blog.csdn.net/tengfei461807914/article/details/52203202 string是C++標準庫的一個重要的部分,主要用於字元串處理。可以使用輸入輸出流方式直接進行操作,也可以通過文件等手段進行操作。同時C++的演算法庫對string也有著很好 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...