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

  总结了一下自己学习和使用过程遇到过问题,后续将在更多的实战经验中补充出更多,如有不足地方,欢迎在评论区指出,有更多的其他常见的错误情况,也请大家纷纷提出来,这里强烈建议阅读http://blog.csdn.net/isea533/article/category/2092001,该博主深入的讲解mybatis的原理知识,更有通用Mapper和分页插件造福人类,我这里也仅是抛砖引玉。

  文章如需转载请说明原处。

  

时间: 2024-08-25 16:54:59

mybatis新手入门常见问题集(持续更新)的相关文章

Android 常见问题收集 (持续更新)

gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, parent.getWidth()/2+DpPx.dip2px(context,20));//-20 10spacing 5padding + 40 textview.height

C# net core程序调试错误集(持续更新)

目录 C#程序调试错误集 1.依赖注入错误An unhandled exception has occurred while executing the request. 1.1 出错现象 1.1.1原因是net core在调用ValueController的时候,发现UnitOfWork没有进行依赖注入. 1.2 出错现象 1.2.1 原因是net core在调用UnitOfWork的时候,发现IPBoxContext没有进行依赖注入. 1.3 解决方法 C#程序调试错误集 1.依赖注入错误A

项目工作中常见问题系列! 持续更新!

欧洲日期转标准或中文日期 欧洲大多数国家日期格式 24-12-1991  代表 dd-mm-yyyy 现在我想转换成中文日期格式1991年12月24日 或者转成国际标准格式日期 1991-12-24  yyyy-mm-dd格式 怎么解决呢? 这里我们可以通过正则表达式 轻松解决这个问题 static void Main(string[] args) { //定义一组欧洲日期列表 数据来源可能是一张数据表 或txt文本文件等.. var enDateList = new List<string>

MyBatis中Mapper配置常见问题(持续更新)

入参为List时,foreach标签中collection属性值固定为"list"(list存放在map中作为入参时,collection应为key值): <foreach item="item" collection="list" open="(" separator="," close=")"> #{item, jdbcType=VARCHAR, javaType=str

Mybatis新手入门一

一丶Mybatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinar

Linux新手训练营--命令大全(持续更新中)

1. authconfig --passalgo=sha256 --update authconfig --test |grep hashing 查询当前密码加密算法 更改加密类型为更难破解的sha512算法 2. lscpu 显示cpu属性细节 3. cat  4. chvt # 切换终端 5.chsh  更改登录shell -l 显示 /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh -s Specify(指定) you

计算几何入门模板(持续更新)

我也算是刚入门计算几何吧,想写一篇入门的模板,让那些和我一样刚入门的人都能看懂就好. 首先要有一些理论知识,这可以百度,我就不多说了,通过百度,你要知道: ①叉积可以判断3个点共线,还可以判断2个点构成直线,第3个点在直线的左边还是右边. ②判断两条线段相交要有2个条件,一个是矩形的什么定理(名字太长,忘了)另一个就是4个点的叉积相乘小于0(也就是异号) 之后就可以看下我收集的简单的模板了. #include <map> #include <set> #include <li

Linux之一条命令解决常见问题(持续更新)

# 1.删除0字节文件 find -type f -size 0 -exec rm -f {} \; # 2.批量文件重命名 find . -type f -name "*.txt" -exec rename txt sh {} \; for i in `ls *.sh`;do rename sh txt $i;done # 3.查看http并发请求数及其TCP连接状态 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print

NHibernate遇到的问题集 持续更新。

问题1: “NHibernate.TypeMismatchException”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理 其他信息: Provided id of the wrong type. Expected: System.Int64, got System.Int32 当查询方法id数据类型为long的时候,session.Get<HibernateModel.Warrant_BaseInfo>(1);直接在查询参数中数据数字. 则会报错... 解决办