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忽略文件勾選為了灰色