2014年工做中遇到的20個問題:161-180

161.Mybatis的Dao找不到xml中的映射配置,可能的一個緣由是:xml配置中的namespace不對。html

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.p2p.user.dal.dao.MemberPointDao.selectForUpdateByUserId前端

<mapper namespace="com.p2p.user.dal.dao.MemberPointDao">這個地方的名字要正確。java


162.Mybatis的ResultType映射,可使用註解@ResultMap。mysql


@ResultMap("MemberPointResultMap")web

@Select("select "+columns+" from "+tableName+" where user_id=#{userId} for update")ajax

MemberPoint selectForUpdateByUserId(String userId);spring

<mapper namespace="com.p2p.user.dal.dao.MemberPoint">sql


<resultMap id="MemberPointResultMap" type="MemberPoint">數據庫

<result column="user_id" property="userId" />apache

<result column="produce_cumulative" property="produceCumulative" />

<result column="consume_cumulative" property="consumeCumulative" />

<result column="level" property="level" />

</resultMap>

</mapper>

163.mysql數據庫修改密碼。

登陸服務器Linux,想登陸mysql,提示/tmp/socket不能鏈接。

在本地,經過dos鏈接遠程mysql,能夠正常登陸和查看,可是沒有mysql數據庫的權限。非root用戶,沒權限修改本身的密碼。


奇怪的是,線上mysql使用的socket是本身安裝目錄下的,爲何不能正常登陸mysql呢?


只能讓root去修改密碼了。


164.異步搜索和表格,回顯用戶的查詢條件比較麻煩,還有高亮等樣式。

同步打開新頁面的方式,方便用戶蒐藏當前連接,利於搜索引擎優化。

若是是後臺管理系統或者內部使用的系統,AJAX的方式更加方便友好。


165.把Freemarker、Java-EL表達式和Mybatis的表達式搞混淆了。

<#assign queryUrl="${base}/loan/list.html?time=${page.time}&term=${page.term}"/>

這裏只能使用${},取的是Java後臺的變量。

#只有Freemarker內部和Mybatis配置文件中支持。


166.不使用left-join等多表關聯查詢,只用單表查詢和Java程序,簡便實現「多表查詢」效果,

侷限性:單表查詢,不適合作多表聯合搜索,而且須要分頁的時候。


167.分頁的URL有2種狀況。

若是傳入的url包含有參數,含有「?」後面的參數,就不須要再加上?了。

 <#if url?contains('?') == -1 >

           <#assign pageUrl = "${url}?pageNum=${pageNum}&pageSize=${data.pageSize}">

           <#else>

            <#assign pageUrl = "${url}&pageNum=${pageNum}&pageSize=${data.pageSize}">

      </#if>

  

這個問題也能夠說明,分頁url打開新的頁面,而且使用Freemarker生成,維護參數比較麻煩。

若是使用AJAX的分頁組件,不刷新頁面,JS中維護分頁查詢參數就簡單不少了。


168.JQuery POST發送參數有要求。

$.post(

 "/article/comment/list.json",{

"params[article_id]":${article.id},

pageNo:pageNo

}

正確的寫法:article_id,"params.article_id","params[article_id]"

若是參數名稱包含「()[]」,須要用引號括起來。


169.Mybatis屬性必須存在。

傳入的對象,必須存在maxDate等屬性,不然就會報錯。

爲何會出現這種問題呢?

searchListPage(PageVo);

searchListPage(LoanPageVo); 


LoanPageVo有maxDate屬性,而PageVo沒有。


帶搜索的分頁,可能會接收更多的條件,普通的其它地方的查詢可能不須要maxDate等字段,想把參數設置得更爲通用,

能用PageVo就不用LoanPageVo,可是最後卻遇到了上面的問題。


作法是:把2個dao分開,簡化處理。

<select id="searchListPage" resultType="java.util.Map">

select t.*

from p2p_transfer t left join p2p_loan_info l on t.lid =

l.lid

where 1=1

<if test="maxDate != null">

and #{maxDate} >= t.exptime

</if>

<if test="minDeadline != null">

and deadline >= #{minDeadline}

</if>

<if test="maxDeadline != null">

and deadline &lt;= #{maxDeadline}

</if>

order by id desc

</select>


170.Freemarker中的「大於」和「小於」。

   用「gt」和「lt」。

   <#if category.count gt 0 >

   

   科普一下:

   gt :great than

   lt : less than

   

171.SpringMVC2種訪問方式,的動態渲染與JSON格式同時支持。

  http://fansunion.cn/case.json

  http://fansunion.cn/case.html

  <bean

class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

<property name="defaultContentType" value="application/json" />

<property name="mediaTypes">

<map>

<entry key="html" value="text/html" />

<entry key="json" value="application/json" />

<entry key="xml" value="application/xml" />

</map>

</property>

<property name="defaultViews">

<list>

<bean

class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">

</bean>

<bean id="marshallingView"

class="org.springframework.web.servlet.view.xml.MarshallingView">

<property name="marshaller">

<bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">

<property name="autodetectAnnotations" value="true" />

</bean>

</property>

<property name="contentType" value="application/xml" />

</bean>

</list>

</property>

</bean>

這種方式的好處,若是想由動態渲染轉換爲JSON格式,很方便。


172.SpringMVC的@ModelAttribute。

@ModelAttribute

protected void menuColumnList(Model model) {

List<Map<String, Object>> menuColumnList = initMenuColumnList();

model.addAttribute("menuColumnList", menuColumnList);

currentColumn(model, 0);

}

在BaseController定義了上述方法,ArticleController繼承BaseController,那麼ArticleController的每一個方法響應的時候,都會

執行menuColumnList方法,從而查詢菜單數據。


   可是,在後端管理系統中,菜單是固定的,不是動態的,所以不須要再查詢。

   

   解決辦法是,新建AdminBaseController,全部Controller共用的方法才放到Controller,原來的BaseController能夠更名爲

   FrontController。


173.AJAX方法報錯。

  某Web前端同事封裝了AJAX方法,結果在使用過程當中報錯了。

  爲何這麼說呢?一樣的參數,$.ajax和$.post都是能夠的,只要使用了ptp.ajax就不正常,

  對比一下,就知道對錯了。

  

174.substring包頭不包尾。

java.lang.String.substring public String substring(int beginIndex,int endIndex)返回一個新字符串,它是此字符串的一個子字符串。

該子字符串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字符。

所以,該子字符串的長度爲 endIndex-beginIndex。 

175.SpringMVC攔截器排除某些路徑。

<mvc:interceptors>

    <mvc:interceptor>

     <mvc:mapping path="/*"/> 

     <mvc:exclude-mapping path="/resource/**"/>

<bean  class="com.xinlong.cms.front.interceptor.CmsFrontInterceptor"></bean>

    </mvc:interceptor>

</mvc:interceptors>


到此還有個問題mvc:exclude-mapping 標籤不被spring-mvc-3.0.xsd支持,

該配置在spring-mvc-3.2.xsd中,能夠經過http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd獲取,

SpringMVC頭部引入

xsi:schemaLocation="      

           http://www.springframework.org/schema/beans      

           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  

           http://www.springframework.org/schema/aop 

           http://www.springframework.org/schema/aop/spring-aop.xsd    

           http://www.springframework.org/schema/context      

           http://www.springframework.org/schema/context/spring-context-3.0.xsd     

           http://www.springframework.org/schema/mvc      

           http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

           http://www.springframework.org/schema/util

           http://www.springframework.org/schema/util/spring-util-3.0.xsd">

  

使用spring-mvc-3.2.xsd。


176.replace into 跟 insert 功能相似,不一樣點在於:replace into 首先嚐試插入數據到表中,

1. 若是發現表中已經有此行數據(根據主鍵或者惟一索引判斷)則先刪除此行數據,而後插入新的數據。

2. 不然,直接插入新數據。


要注意的是:插入數據的表必須有主鍵或者是惟一索引!不然的話,replace into 會直接插入數據,這將致使表中出現重複的數據。



表有3個字段:uid,name,value

主索引:能夠是uid,或者 uid和uname

replace into p2p_user_info(user_id,info_name,info_value) values(#{uid},'borrower_auth',#{auth}


177.數據庫與Map大小寫。

查詢數據庫結果保存在map中,數據庫的字段是大寫的,好比USER_INFO,Map取數據的時候,用的是小寫「user_info」。

把數據庫的統一改成小寫。


178.Html中重複定義相同元素,會致使不少奇葩的問題。

好比定義2個title,<title></title>;<title>1</title>頁面中的標題爲空,瀏覽器將其默認爲當前訪問的url。

定義2個相同的id,js取值會取錯。

2個同名name的input框,表單提交都會提交,可是後端接收的時候,可能會是第1個,可能不是想要的。


179.sql查詢排序不穩定。

select * from user order by id desc;

主鍵id是惟一的,排序也是惟一的。


select * from user order by name desc;

若是遇到2個同樣的name,好比「boy」,那麼查詢結果就是不穩定的。


我用mysql-front查詢,發現結果都同樣。

可是換一個數據庫查詢工具,還有web界面中看到的,每次是不同的。


排序不穩定,給人的感受不穩定。



180.SpringMVC安全問題。

@RequestMapping("list")

public void list(PageVo form, Model model) {

form.handleSearch();

PageVo page = withdrawService.listPage(form);

form.resetSearch();

model.addAttribute("res", 1);

model.addAttribute("data", PageUtils.data(page));

}

list.json直接響應json格式的請求。

這裏面存在一個問題,若是model.addAttribute裏放置的屬性有多餘的,那麼經過這種方式,前端得到的json

會存放有多餘的信息,好比當前登陸的用戶信息。


  model.addAttribute("user",user);

  手動響應JSON格式的請求,只發送必要的字段,比較好。

原文首發:http://fansunion.cn/article/detail/559.html

相關文章
相關標籤/搜索