2016年工作中遇到的問題1-10:select-for-update鎖表

小雷FansUnion發表於2016-03-07


1.select... for update鎖表。
注意事項:
事務下使用,@Transactional
如果用主鍵,只鎖住1行記錄
如果不用主鍵,會鎖住多條記錄,mysql下測試,查詢1條,鎖住1行,查詢2條,鎖住2行。


網上不少文章說,沒有用主鍵,會“鎖表”,似乎不符合事實額。
比如,http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537508.html


2.分頁跳轉的輸入框,可以用html5中的input-number.
<input type="number" max="10" min="1"/>
右側的“增加-減少”輸入工具,可以+1或者-1。
如果使用者手動輸入,字串等非數值是不允許的。


但是,存在1個問題。
使用者輸入的數字,不會檢查是否滿足 min 和 max屬性的限制。


因此,需要額外寫js事件去判斷,blur失去焦點事件是可以的。


最後需要注意一點,jquery的attr獲得是string型別,使用者輸入的頁數 是否 滿足min和max,需要先轉換成int型別。


//解決分頁輸入,可能超過最大頁數的問題。html5的input-number,不會檢查使用者的輸入,是否滿足min和max這2個屬性
  $(function(){
 var toGoPage=$("#toGoPage");
 if(toGoPage){
  toGoPage.blur(function(){
 var page=parseInt(toGoPage.val());
 var maxPage=parseInt(toGoPage.attr("max"));
 var minPage=parseInt(toGoPage.attr("min"));
 console.log("page,"+page);
 console.log("maxPage,"+maxPage);
 console.log("minPage,"+minPage);
 if(page>maxPage){
 page=maxPage;
 }
 if(page<minPage){
 page=minPage;
 }
 toGoPage.val(page);
console.log("page,"+page);
  });
  console.log("bind2");
 }
  });
</script>
3.用字串替換replace,而不是手動拼接字串。
   var str ="<a href='{url}' target='_about'>{name}</a>";
   str=str.replace("{url}",url);
   str=str.replace("{name}",name);
   
   手動拼接字串,太麻煩了,可讀性很差。
4.jquery-easyui,格式化函式formatter.
注意事項:
a.formatter只需要填寫函式的名字。
b.如果是格式化某個欄位,field就是欄位的名稱。
c.如果格式化需要多個欄位,field不能不寫,同時不能寫某個指定的欄位,可以用個不存在的欄位,比如“null”。
formatLink函式,就存在一定的技巧。field用不存在的“null”,挺好使的。


<#include "common/common.html"/>
<meta charset="UTF-8">
<table
    class="easyui-datagrid"   
    id="datagrid"  
         title="友情連結"  
         url="${base}/friendlink/list"
         toolbar="#toolbar" 
         rownumbers="true" 
         fitColumns="true"
         singleSelect="true"
         data-options="fit:false,border:false,pageSize:10,pageList:[5,10,15,20]" >  
    <thead>  
        <tr>
            <th field="id" width="5%">ID</th>  
            <th field="name" width="5%">名稱</th>  
            <th field="url" width="35%">URL</th>
            <th field="remark" width="35%">備註</th>   
            <th field="sort" width="5%">排序</th> 
            <th field="null" width="10%" formatter="formatLink" width="5%">效果</th>    
        </tr>  
    </thead>  
</table> 
<script type="text/javascript">
function formatLink(val,row,index){
if(!row){console.error("The row is null,index="+index);return;};
   var name = row.name;
   var url = row.url;
   var str ="<a href='{url}' target='_about'>{name}</a>";
   str=str.replace("{url}",url);
   str=str.replace("{name}",name);
   return str;
   
}
</script>
5.電商系統,後端新增商品預覽。
  後端再做一套“商品詳細頁面”,工作量巨大。
  解決方法:
    前端商品詳細頁面,改造下。
再增加一個url,service查詢資料的時候,可以查詢“未釋出”的商品。
後端使用Iframe,嵌入前端新增的url。
“完全逼真”的預覽效果。
6.Mybatis的“#{}”和"${}"
@Select("select * from ${tableName} where status =0 order by sort asc,id asc")
List<CommonCategory> listAll(@Param("tableName")String tableName);
這個地方的tableName只能用${},不會帶“引號”。
str=abc, ${str}輸出abc,#{str}輸出 'abc'。


7.SpringMVC3的ResponseBody返回字串亂碼問題.
這個問題遇到很多次了,最近找不到那個配置了,網上找了一個。


引起亂碼原因為spring mvc使用的預設處理字串編碼為ISO-8859-1,具體參考org.springframework.http.converter.StringHttpMessageConverter類中public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");


解決方法:


第一種方法:


對於需要返回字串的方法新增註解,如下:


@RequestMapping(value="/getUsers", produces = "application/json; charset=utf-8")
 public String getAllUser() throws JsonGenerationException, JsonMappingException, IOException
 {
 List<User> users = userService.getAll();
 ObjectMapper om = new ObjectMapper();
 System.out.println(om.writeValueAsString(users));
 DataGrid dg = new DataGrid();
 dg.setData(users);
 return om.writeValueAsString(dg);
 }


此方法只針對單個呼叫方法起作用。


第二種方法:


在配置檔案中加入


<mvc:annotation-driven>
     <mvc:message-converters register-defaults="true">
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
      <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
    </bean>
   </mvc:message-converters>
     </mvc:annotation-driven>
參考:http://www.cnblogs.com/dyllove98/p/3180158.html


網上也有配置了mappingJacksonHttpMessageConverter,不需要。
但是如果配置了這個,訪問一個url,比如http://localhost/category/list?amw=w,Chrome出現的“下載”,而不是直接展示內容了。
<mvc:annotation-driven >  
  <mvc:message-converters>
           <bean class="org.springframework.http.converter.StringHttpMessageConverter" >    
            <property name = "supportedMediaTypes">  
                <list>  
                     <value>text/plain;charset=UTF-8</value>  
                </list>  
            </property>  
           </bean>    
         <!--   <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">    
            <property name="supportedMediaTypes">    
                <list>    
                    <value>applicaton/json;charset=UTF-8</value>    
                </list>    
            </property>    
        </bean>     -->
       </mvc:message-converters> 
</mvc:annotation-driven>
8.Mybatis,There is no getter for property named 'merchantId' in 'class java.lang.String'。


如果mybatis語句中,增加了<if test="merchantId != null">這個if判斷,需要給dao方法中,手動增加@Param("merchantId")。
List<String> findByShopId(@Param("merchantId")String merchantId);
<select id="findByShopId" resultType="string">
select id from mall_brand where 1 =1
<if test="merchantId != null">
and merchantType=2 and merchantId=#{merchantId}
</if>
</select>

如果只是#{}取值,不需要手動@Param("merchantId")。
List<String> findByShopId(String merchantId);
<select id="findByShopId" resultType="string">
select id from mall_brand where 1 =1
and merchantType=2 and merchantId=#{merchantId}
</select>
9. Spring直接把配置檔案中的變數,放到Java變數中,放到xml中有時候不夠直接。
@Value("${mailFromAddress}")
private String mailFromAddress;

10.SpringMVC傳送郵件,必須設定“from”引數。
在這個bean中設定from引數不行,因為沒有from這個引數。
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>${mailServerHost}</value>
</property>
<property name="port">
<value>${mailServerPort}</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>${mailUserName}</value> <!-- 傳送者使用者名稱 -->
</property>
<property name="password">
<value>${mailPassword}</value> <!-- 傳送者密碼 -->
</property>
<!-- <property name="from">
 <value>${mailFromAddress}</value>
</property> -->
</bean>


@Resource
private JavaMailSender mailSender;

@Value("${mailFromAddress}")
private String mailFromAddress;

//在傳送的時候,必須設定from
public void send(String subject,String content,String to){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
simpleMailMessage.setFrom(mailFromAddress);
simpleMailMessage.setTo(to);
mailSender.send(simpleMailMessage);
}

#配置引數
mailServerHost=
mailServerPort=25
mailUserName=
mailPassword=
mailFromAddress=
shopHost=


需要特別注意,userName是用來連線伺服器的,from引數是可以手動設定的。
from和userName可以不同。




相關文章