mybatis新手入门常见问题集(持续更新)
一、参数为集合
Q:parameterType指的的类型是集合类型还是对象?
A:都可以,甚至不用在xml中指定也可以。第一,mybatis会对传入的参数进行判断是不是list或者array,第二,mybatis是根据ONGL表达式,即 【参数.属性】 这样的格式,通过反射去获取和注入属性值,传入的参数为集合的时候,不管指定parameterType的那一个,上面说的两点都能发挥功能。
Q:Parameter '__frch_item_0' not found. Available parameters are [list]
A:首先说明的是frch_item_0这个参数名的来历,在我的xml文件中,<foreach>是这样定义的,
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.a}
</foreach>
‘frch'代表的是在循环内部参数的前缀,’item‘则 标签中指定的item的名字,后面的数字则代表循环中的第几个参数
接口中的方法的定义如下:
List<User> listById( List<User> id);
这里的item.a等同user.a,但是User类里根本没有a这个属性,所以出现这个问题应该第一时间去查看 访问的属性名是否正确
Q:Parameter 'list' not found. Available parameters are [0, 1, param1, param2]
A: 首先解释Available parameters are [0, 1, param1, param2],mybatish会将传入的参数按照顺序设定默认名字,即这里看到的0,1,param1,param2,通过@Param注解可以修改参数名,当传入的参数有且仅有一个的时候,可以不使用@Param注解,在定义的sql语句中,#{}里写的参数是随意的!因为传入的参数只有一个,无论在#{}命名为什么,mybatis都是将这个唯一参数传入,但是在使用@Param注解的情况,就必须使用注解指定的名字或者paramX(X指代顺序数字),回到本题,在使用List作为唯一参数的时候,在foreach标签使用的情况下是不会出现上述问题。
List<User> listById( List<String> id);
<select id="listById" parameterType="scau.zzf.entity.User" resultType="scau.zzf.entity.User">
SELECT * FROM users WHERE id IN
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
但是在传入的参数为多个的时候
List<User> listById( List<String> id,String username); //不使用@Param
<select id="listById" parameterType="scau.zzf.entity.User" resultType="scau.zzf.entity.User">
SELECT * FROM users WHERE username=#{username} AND id IN
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item.id}
</foreach>
</select>
此刻错误日志显示为 Parameter 'list' not found. Available parameters are [0, 1, param1, param2],这个时候我们自然就想到,在多个参数的时候必须用@Param 指定参数名,才能够使用我们的参数规范,否则就必须依据mybatis的参数规范。
但是对于新手来说,可能还差了一步,foreach标签中collection的选择比较多的是list或者array,在传入的参数只有一个的时候,这是绝对正确的,但在多个的时候,这里的collection要依照@Param指定的名称。
可以阅读这篇博客深入了解mybatis参数 http://blog.csdn.net/isea533/article/details/44002219,涉及的大多数是源码,新手很可能看不懂,我这里权当抛砖引玉。
二、模糊查询怎么做
新手涉及到使用mybatis做模糊查询的使用,会首先在xml文件里定义sql的时候尽量拼接上%,然后碰壁,怎么尝试都不对,最后想到了,在传入参数之前添加上%,结果问题迎刃而解,但是这个方式还不够优雅,可以通过bind标签实现该功能
<select id="findByUsername" resultType="scau.zzf.entity.User">
<bind name="pattern" value="username+'%'"></bind>
SELECT * FROM users WHERE username LIKE #{pattern}
</select>
三、关联查询引用的数据混乱
Q:一对多关联查询,多方只返回一条数据,但SQL书写是正确的
A:这种情况经常是查询返回的主键名字是相同的,从而导致返回结果出错。两张表的数据库字段相同,是难以避免的,需要结合使用 SQL语句别名和resultMap一起使用即可解决。
四、如何获取插入对象后该对象的主键值
insert成功之后,mybatis会将插入的值自动绑定到插入的对象的Id属性中,以下代码是能正确打印出ID值的。
<insert id="addUser" >
INSERT INTO users (id,username,password,salt) VALUES (#{id},#{username},#{password},#{salt})
</insert>
iUserService.addUser(user);//插入成功
System.out.println(user.getId());//打印ID
如果使用的主键名不是ID,可以通过修改insert标签中的keyProperty或者keyColumn。
五、无法触发缓存刷新
简单的来说,这种情况发生在关联查询的时候,但是更新的却只是一张表,查却查的是两张表,所有当更新一张表的数据的时候,无法触发刷新查询两张表的缓存数据,具体原理可查看 http://blog.csdn.net/isea533/article/details/44566257
六、org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
找不到接口声明,一般情况下重新检查下DAO和xml文件对应的id是否一致就可以解决了。这里要提出的是另一种情况,在IntellJ IDEA中,maven项目工程默认是只扫描resourses文件下的资源,也就是说如果你在IntellJ IDEA中的maven项目中,要想在src下放xml文件,必须在pom.xml中加入以下代码
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</bulid>
总结了一下自己学习和使用过程遇到过问题,后续将在更多的实战经验中补充出更多,如有不足地方,欢迎在评论区指出,有更多的其他常见的错误情况,也请大家纷纷提出来,这里强烈建议阅读http://blog.csdn.net/isea533/article/category/2092001,该博主深入的讲解mybatis的原理知识,更有通用Mapper和分页插件造福人类,我这里也仅是抛砖引玉。
文章如需转载请说明原处。
mybatis新手入门常见问题集(持续更新)的更多相关文章
- DataStage 错误集(持续更新)
DataStage 错误集(持续更新) DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 D ...
- MyBatis极速入门开发手册(2017-2-6更新)
前言: 本篇文章对我的学习内容做一个归纳梳理,同时也记录一些学习过程中遇上的问题及注意事项等等,可以帮助新入门的朋友们消除一些误区与盲区,希望能帮上一些正在学习的朋友们.在编写时会引用一些mybati ...
- JAVA之Mybatis基础入门二 -- 新增、更新、删除
上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在map ...
- ubuntu相关软件合集(持续更新中)
本人使用的是Ubuntu-Kylin14.04,自带了日历.输入法.优客助手等易于上手的应用.省的每次安装完原生的系统再麻烦的安装,下面介绍默认应用外的相关常用软件: 一.Keylock Applic ...
- zabbix常见问题整理 持续更新……
[toc] 1.zabbix仪表板错误 问题: zabbix server is not running: the information displayed may not be current 解 ...
- Go从入门到精通(持续更新)
1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...
- storm 入门介绍(持续更新)
storm的集群表面上看和hadoop的集群非常像.但是在Hadoop上面你运行的是MapReduce的Job, 而在Storm上面你运行的是Topology.它们是非常不一样的 — 一个关键的区别是 ...
- mongodb管理副本集(持续更新中)
许多维护工作不能在备份节点上完成 因为要写操作,也不能在主节点上进行,这就需要单机模式启动服务器, 是指重启成员服务器,让他成为一个单机运行的服务器,而不再是副本集中的一员(临时的) 在单机 ...
- C# net core程序调试错误集(持续更新)
目录 C#程序调试错误集 1.依赖注入错误System.InvalidOperationException: Unable to resolve service for type 'xxx' whil ...
随机推荐
- Prince2是怎么考试的?想了解P2
自己在项目管理培训的行业已经有了5年的时间,经历了很多的学员和企业,和他们交流的问题,话题也很多. 在前几年,对于项目经理来讲关注的很多是单项目管理的工具技术模板,谈论最多的是,进度延期,成本超支,范 ...
- jQuery后续...
jQuery 选择器 1.jQuery选择器的简介 (1). Jquery中的选择器完全继承了CSS的风格,利用Jquery选择器,可以非常便捷和快速的找出特定的Dom元素,然后为他们添加相应的行为, ...
- Linux下使用ssh密钥实现无交互备份
服务器A(主) 192.168.1.120 服务器B(从) 192.168.1.130 需求:服务器B定期拉取服务器A的数据并备份. 实现方式: 一.备份服务器B安装rsync 1)查看是否安装 rp ...
- ST 单元测试之maven引入junit包
按照上篇博客,已经完成了mavne以及eclipse的安装配置,新建好了一个maven项目. 接下来打开项目,双击打开pom.xml,可以看到如下所示, 点击下方的pom.xml,然后添加如下代码,即 ...
- @Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationEx ...
- WPF: 本地化(Localization) 实现
本文将讨论一种较为方便的本地化方法. 由于在项目中要实现本地化,所以在网上查找相关的解决方案.通过一系列调研,发现实现本地化的方法主要有以下三种: 通过编译项目以设置 x:Uid 并使用 LocBam ...
- CSS.05 -- 规避脱标 定位的盒子居中、CSS标签规范、溢出隐藏、内容移除(网页优化)、CSS精灵图
规避脱标 定位的盒子居中显示 Margin:0 auto : 只能让标准流的盒子居中对齐 当A是B的父系,B可以使用 margin-left:auto: 来获得相当于定位right:0:的效果 M ...
- Python可视化学习(1):Matplotlib的配置
Matplotlib是一个优秀的可视化库,它提供了丰富的接口,让Python的可视化落地显得非常容易上手.本系列是本人学习python可视化的学习笔记,主要用于监督自己的学习进度,同时也希望和相关的博 ...
- centos7 部署openstf
1.安装nodejs,版本需大于6.9(写稿时使用的6.9,7.7.4版本会无法安装zmq): 2.安装android sdk(详细略,百度一大堆),注意必须将platform-tool配置到环境变量 ...
- spring学习起步
1.搭载环境 去spring官网下载这几个包,其中commons-logging-1.2.jar是一个日志包,是spring所依赖的包,可以到apache官网上下载 也可以访问http://downl ...