[置顶] 2013年工作中遇到的20个问题(Bug):161-180

161.用户表和超级用户分成2个表,很不合理,查询的时候,非常复杂。

162.left join还是很有“市场”的。
机构表Org连接User时,想获得user的名字,可能存在,也可能不存在,left join就适合。

##多个left join 之间不能使用","隔开
select cg.*,u.loginName creatorName,org.nativeName advertiserName
from CampaignGroup cg
left join Organization org on cg.advertiserId=org.id
left join User u on cg.creator = u.id

163.MySQL Explain命令。
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

参考资料:http://database.51cto.com/art/200912/168453.htm

164.JSTL标签用法
<select id="advertiserId">
                                <!– <option value="">请选择</option> –>
                                <c:forEach var="advertiser" items="${advertiserList}">
                                    <c:choose>                                                               
                                        <c:when test="${campaignGroupBean.advertiserId == advertiser.id}">
                                            <option selected="selected" value="${advertiser.id}">${advertiser.englishName}</option>
                                        </c:when>
                                        <c:otherwise>
                                            <option value="${advertiser.id}">${advertiser.englishName}</option>
                                        </c:otherwise>
                                    </c:choose>

                                </c:forEach>
                        </select>
           
#eq 可以代替 ==
<c:when test="${campaignGroupBean.advertiserId eq advertiser.id}">           
                       
165.Spring MVC接收请求参数。
a.基本类型@RequestParam可要可不要。
b.实体类型的bean/model,一定不能加。如果非要加,可以使用@ModelAttribute来修饰。
c.Map类型的,一定要加@RequestParam。

public String viewDetail(@RequestParam Integer id);
public PageVO list(CampaignGroupBean campaignGroupBean);
public PageVO listByIds(@RequestParam Map<String, Object> map);    

越来越发现,通过做项目,学习知识/技术,不够系统。
只能在实践中慢慢系统化了。

166.Hibernate插入和更新数据失败。

1个好友遇到这个问题了,问我。
我首先想到的是 没有配置事务,后来我又提示debug是否显示有“insert语句”,没有。
最终,是他自己解决的。

最终的原因:
进行批量的插入数据库的数据是,不管是save/update等。首先是在session的一级缓存里面进行操作存储数据。
当数据量过大时,导致缓存不够。
所以你要进行批量数据操作时,要么定时flush一下,要么配置文件,让数据库执行sql的数量进行限制。

167.通过HTTP-Get方法同步数据的时候出现乱码。
   接口使用SpingMVC响应get请求,Server是Tomcat。

   Get请求的默认编码是ISO-8859-1,SpringMVC也没有做特殊处理。
  
   需要在Tomcat的配置文件中,指定编码。

   上面的描述其实是有问题的:

  Tomcat-server.xml配置文件,可以配置URLEncoding指的是URL的编码。

   我通过
httpclient同步spingmvc实现的接口数据出现乱码,是因为我们使用SpringMVC已经设置了编码UTF-8.

之所以出现乱码,是因为我自己多转换了一次编码。正所谓 “画蛇添足”。

是否需要转码,需要结合项目的实际情况。

 

168.Hibernate和Mybatis执行分页查询需要2个步骤。
  list,获得1页记录,count查询总记录数。
  这2个方法的sql语句,where的条件是一样的。

  在Mybatis中可以通过
  <sql id="listAndCountCommonSql">my sql</sql>
  <select id="list" parameterType="campaignGroupBean" resultType="campaignGroupBean">
        select cg.*,u.loginName creatorName,org.nativeName advertiserName

        <include refid="listAndCountCommonSql" />

        order by ${orderBy}
        ${order}
    </select>

    <select id="count" parameterType="campaignGroupBean" resultType="int">
        select count(*)

        <include refid="listAndCountCommonSql" />
    </select>
   
    在Hibernate中,需要自己构造通用的sql。
   
    维护2份类似的sql,太费劲了。
   
    类似的还有,
    <if test="firstResult !=null">
            <if test="maxResult
            !=null"> limit #{firstResult},#{maxResult} </if>
        </if>

169.Equals比较。
       String id="1";
        Integer i = 1;
        boolean flag = i.equals(id);
   
    Integer.equals方法
        Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
       
    不同类型,返回false。

        

170.JS中的String方法没有trim()方法,
可以写一个工具方法

  function trimString(var str);
  也可以调用jquery的$.trim()方法。

  网上也有人直接扩展了js原生的String,
  /** trim() method for String */ 
  String.prototype.trim=function() { 
    return this.replace(/(^s*)|(s*$)/g,''); 
  }; 

  不过这种方法,公司js大牛大龙哥不建议这样做,可能破坏js。

171.变量的取名问题。

#Mybatis sql语句
<if test="mustIn != null and mustIn !='' ">
            and mc.AgencyId in (${mustIn})
        </if>

  这个地方"mustIn"的名字不够准确。
  我想表达的意思是“代理商的id一定要在muscIn这个范围内”,
  而我最初的sql脚本写的是“活动的id”。

  我是建议/习惯 取个长一点的名字,可以避免很多bug。

  测出bug 的另外一种方法就是认真编写“单元测试”,JUnit很不错。


172.js响应“回车事件”。
  搜索、翻页(跳转到) 需要响应“回车”事件。
  (搜索、翻页 的"值"一般会进行"trim")

   btns[4].onkeydown = function(e) {
                e = e || window.event;
                var code = e.keyCode;
                var val = (e.target || e.srcElement)['value'];
                if (code == 13) {
                    that.goTo(val);
                }
            };
           
    //响应回车事件
        $("#searchText").keydown(function(event){
            alert(event.keyCode);
            if(event.keyCode == 13){
                searchCampaignGroup();
            }
        });        

    特别注意:js和jquery中,函数名"keydown"似乎都是“小写”,变量名是驼峰式"keyCode"。
   
   
173.正则表达式 牛逼网站。
     http://www.regexpal.com/
     写正则,在网页上就可以进行“输入校验”了。
   
174.经常打错单词,很重要的原因是“左手按键更快,或者说当左手指与要打的字母距离更近时”。
比如 update达成了udpate。左手按“d”的速度高于右手按“p”的速度。

175.CSS样式中的换行问题
    white-space:nowrap

    定义和用法white-space 属性设置如何处理元素内的空白。
    这个属性声明建立布局过程中如何处理元素中的空白符。值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的。默认值: normal继承性: yes版本: CSS1JavaScript 语法: object.style.whiteSpace="pre"实例规定段落中的文本不进行换行:
    p  {  white-space: nowrap  }
    TIY浏览器支持所有浏览器都支持 white-space 属性。
   
    注释:任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit"。可能的值normal 默认。空白会被浏览器忽略。pre 空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。pre-wrap 保留空白符序列,但是正常地进行换行。pre-line 合并空白符序列,但是保留换行符。inherit 规定应该从父元素继承 white-space 属性的值。
   
    参考资料:http://zhidao.baidu.com/question/134023734.html
   
176.jQuery的bug。
    "".replace is not a function
   
    jQuery1.4中的$.trim()方法有bug。
    新版本的1.8和1.9 都没有问题。
   
    建议:放弃旧版本的jQuery吧,使用新版本的更好。

177.Sitemesh导致网站报错。

    <!DOCTYPE decorators PUBLIC "//SITEMESH/" "http://www.opensymphony.com/sitemesh/dtd/sitemesh_1_5_decorators.dtd">

    刚才http://www.iac-i.org,http://advocab.miaozhen.com/和http://pr.cn.miaozhen.com/三个网站不能正常访问,看日志是 sitemesh报错,发现这三个网站/WEB-INF/decorators.xml开头都有如上头信息,刚才将url放到浏览器执行,返回500错误。注释掉如上头信息后网站可以正常运行。
   
    最近sonatype网站永久关闭了,所以如果有 <DOCTYPE>那段就解析不通过的。

    开发的时候把描述文件都本地化来避免这个问题。


178.浮点数的比较。
    以下是JUnit中的源码。
    /**
     * Asserts that two doubles are equal concerning a delta.  If they are not
     * an AssertionFailedError is thrown with the given message.  If the expected
     * value is infinity then the delta value is ignored.
     */
    static public void assertEquals(String message, double expected, double actual, double delta) {
        if (Double.compare(expected, actual) == 0)
            return;
        if (!(Math.abs(expected-actual) <= delta))
            failNotEquals(message, new Double(expected), new Double(actual));
    }
   
    它使用的是 Double.compare(expected, actual) == 0和Math.abs(expected-actual) <= delta
    来判断2个浮点数是否相等。
   
    这种比较浮点数的方法完全值得我们去借鉴。
   
    看高质量开源项目的源码还是很有好处的。

179. Mybatis不使用Map传递多个参数。
    public List<Campaign> listEqualOrgId(@Param(value="orgId") int orgId, @Param(value="userId") int userId);
    <select id="listEqualOrgId" parameterType="Map" resultType="com.miaozhen.cms.business.model.Campaign">
   
    我习惯的写法是public List<Campaign> listEqualOrgId(Map<String,Object params);
   
    上面的代码是同事写的,也是我想找的,有次我就想用这种方式。
   
180.参数命名的一致性问题。

public PageVO list(@RequestParam Map<String, Object> params);

//合理的调用方式
CampaignValidate.validate(params);

//当使用Eclipse调用CampaignValidate.validate默认给出的参数提示是param,而不是params。
Eclipse是根据被调用方法的参数名称,给出的建议/默认参数。

public static boolean validate(Map<String, Object> param);

很多人不屑于这种“细节问题”,但我想说,掌握这些细节问题一次可能只能帮你节省1s的时间,
但是这个细节使用频率非常高,1年可以节省不少时间的。如果按1秒*20次*300天=100分钟。

原文参见:http://fansunion.cn/articles/2267

相关文章:http://fansunion.cn/category/km/problem

原文地址:https://www.cnblogs.com/bbsno1/p/3265263.html