springmvc+mybatis常见错误

来源:互联网 发布:在虚拟机上安装mac os 编辑:程序博客网 时间:2024/06/05 20:02

最近因为项目组的需要,又重新开始弄java后台,采用的spring-mvc+mybatis。zookeeper+dubbo分布式服务的框架,由于一段时间没有接触过oracle数据库了,遇到了许多问题,把问题记录下来,避免以后遇到同样的问题又是长时间的找解决方案。

1.Exception: org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.lang.Integer;

这个错误当时看着也有点懵逼,太久没弄,虽然看懂了,但是一直不清楚具体是哪一行的错误,mybatis就这一点有点坑,xml中写错了 也不会报具体的错,后面才发现,我某个select返回int,但是我写的是resultMap,应该是resultType。这里讲一下区别:

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。


2.mybatis中Date类型的返回。

  在bean中我使用的是java.util.Date,然后在mybatis result设置的jdbcType="DATE",发现这样设置以后丢是了时间精度,date的值为2017-05-15 00:00:00,丢失了时间精度,这样的结果我们需不指定jdbcType。

给一篇参考文件

iBatis Date 类型 时分秒丢失(精度丢失)问题


3.关于mybatis中 mapper.xml文件中if语句字符串匹配问题
  在mybatis中 偶尔会用到字符串匹配传过来的值问题,发现一个问题,

<if test=" name=='你好' ">

<if>

这样是有问题的,是无法正常完成校验的,但是,如果我们把写法改成这样就没问题了。

<if test=' name=="你好" '>

<if>


只是一个单双引号的问题,还有这样一种语法也是可以的。
听说mybatis之后解决了这个问题在3.3.1之后是没问题的,但是如果遇到了,可以采用这种方法。

4.关于分页插件 com.github.pageHelper的使用问题。
我有个页面是需要查询三个sql执行分页的,但是显示出来的数据一直不正确,后面发现了问题,
这个插件它只会对执行的第一条sql使用他的分页原则,所以,如果使用多条sql的话是会有问题的。

5.ie8下不支持透明色的问题
ie 8下设置background:translate 失效问题 需要将背景改为透明的背景图片
background-image: url(images/translate.jpg);
 background-repeat: no-repeat;
 background-color: transparent;
6.ie8下不支持placeholder属性,实现密码提示框,
实现文字输入框的提示好解决,我们只需要在给它的value设置提示,在它获取焦点时判断是否为默认提示字,如果是则清空,然后在它失去焦点时,判断如果为空就设置value为默认提示。看一看代码
<tr><td>账号</td><td><input type="text" value="请输入您的账号" class="admin" /></td></tr>//js代码$(".admin").focus(function(){if($(this).val() == "请输入您的账号"){$(this).val("");}});$(".admin").blur(function(){if($(this).val() == ""){$(this).val("请输入您的账号");}//这样就实现了一种默认提示框的效果,但是密码提示框不同,密码提示框的type="password"是默认显示**的,所以要显示默认提示框的话,我们得玩点黑科技,就是用一个同样的文字输入框去显示,首先需要把密码提示框设置为隐藏,当我们点击文字输入框时,我们清楚文字输入框,并隐藏起来,然后把密码提示框显示,并且把焦点转移到密码提示框上,来,上代码<tr>    <td>密码</td>    <td>        <input type="text" value="请输入您的密码"id="login_showPwd" />        <input type="password"id="login_password" style="display: none"/>    </td></tr>//js代码$('#login_showPwd').focus(function(){var text_value=$(this).val();if(text_value == this.defaultValue){$('#login_showPwd').hide();$('#login_password').show().focus();}});$('#login_password').blur(function(){var text_value = $(this).val();if(text_value==""){$('#login_showPwd').show();$('#login_password').hide();}});


ie下兼容密码提示框

但是我使用之后发现一个问题,就是ie和chrome下会有密码保存等缓存功能,这会导致我们的密码提示有问题,所以我们需要在onready里面加入判断,
当密码提示框的值不为空而且不等于我们所提示的文字时,置为默认提示。
    window.onload=function(){
if(text_value != null&&text_value != ''&&text_value != this.defaultValue){        $('#login_showPwd').val(this.defaultValue);    }
}


7.ie11下验证码后加参数为new date()不能正确解析的问题

不知道为什么在ie11下new date()虽然后面会加入时区,但是ie8下完好,ie11下不显示,想了想就改成带随机数了,这里就不多说了,希望有大手能知道原因之后告知,解决方法暂时就先用这个吧。

今天暂时就写到这里吧。后续有问题会同步更新的,希望能和大家共同进步。

原创粉丝点击