首页 > 其他分享 >2013年工作中遇到的20个问题(Bug):161-180

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

时间:2023-06-08 11:03:59浏览次数:52  
标签:pre 20 String public 180 sql id http 161


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分钟。


标签:pre,20,String,public,180,sql,id,http,161
From: https://blog.51cto.com/fansunion/6438311

相关文章

  • 即将开幕!神策数据 2023 年金融营销科技价值发现论坛亮点前瞻
    由神策数据主办Hi-Finance、爱设计、亚马逊云科技协办和支持的开放融合引领营销5.0新纪元暨2023年金融营销科技价值发现论坛即将于6月9-10日在中国·杭州开幕届时百余位金融数字化从业者将共聚一堂探讨金融业发展的新思路、新路径、新趋势2023年,数字经济正进一步推动生产......
  • 如何续订Exchange2016的自签名证书
    续订Exchange自签名证书续订Exchange自签名证书的过程基本上相当于制作了一个新的证书。使用EAC以续订Exchange自签名证书打开EAC并导航到 “服务器>证书”。Inthe Selectserver list,selecttheExchangeserverthatholdsthecertificatethatyouwa......
  • SummerResearch_Log_20230607
    WorkingContent:1.阅读"VariationalContinualLearning"论文及代码关于ContinualLearning(CL)的认识:这是一个贝叶斯推断过程,这里是gpt给出的贝叶斯推断概念和例子:即先确定一个先验分布,需要求的未知参数是θ(当然也可以添加其他类似α,β)的超参数之类的)。接下来我们进行实......
  • P3498 [POI2010]KOR-Beads 题解
    前言:最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧。题意:题目传送门给你一个序列,需要求出数k,使划分的子串长度为k时,不同的子串数量最多。还要注意几件事:子串可以反转,比如(1,2,3)看做与(3,2,1)相同。如果不能正好划......
  • 200SMART CPU输入/输出接线的几个关键点
    总结来看,S7-200系列PLC提供4个不同的基本型号的8种CPU,其接线方式也可大致分为6种:1.CPUSR20接线2.CPUSR40接线3.CPUCR40接线4.CPUST40接线5.CPUSR60接线6.CPUST60接线除了CPU外,我们还需要了解200smartPLC的数字量输入/输出接线。1.数字量输入接线S7-200SMART的数字量输入......
  • 【题解】 P2221 [HAOI2012]高速公路
    传送门输入时将\(r\)先减1。发现收费之和为$$ans=\sum\limits_{i=l}^{r}a_i\times(r-l+1)\times(i-l+1)$$化简得\[ans=\sum\limits_{i=l}^{r}a_i\times(-i^2+i\times(r+l)+(r-r\timesl-l+1))\]发现可以用线段树来维护:\(s......
  • ubuntu 20.04 lxd 配置容器内使用GPU
    1.检查自己的显卡类型,同时在宿主机上安装显卡驱动一般选择推荐的proprietary,tested  2.配置lxd的容器并添加GPU设备 3.在容器中运行相同驱动版本在nvidia官网上下载驱动 shNVIDIA-Linux-x86_64-520.61.05.run--no-kernel-module4.在容器中配置docker版本19......
  • CMU15445 (Fall 2020) 之 Project#1 - Buffer Pool 详解
    前言去年暑假完成了CMU15-445Fall2019的四个实验,分别对应下述博客:CMU15445(Fall2019)之Project#1-BufferPool详解CMU15445(Fall2019)之Project#2-HashTable详解CMU15445(Fall2019)之Project#3-QueryExecution详解CMU15445(Fall2019)之Proje......
  • 2023.6.7 Linux系统日志管理
    01Linux系统⽇志管理系统⽇志架构概述syslog⽇志审查Journal⽇志审查Journal⽇志持久化⽇志轮询logrotate系统⽇志架构概述在rhel7系统中有两个⽇志服务,分别是传统的rsyslog和新添加的systemd-journalsystemd-journald是⼀个改进型的⽇志管理服务,可以收集来⾃内核......
  • 2023年5月31号聊一下今天以及最近的操作与感想!
    今天操作白糖日线向下,所以它稍微有点向下的趋势我就空了,最多浮亏1800,后面看到回本就跑了......