mybatis方法多个参数时,不加注解,可以吗?

不可以。多个参数时,必须加注解,并且注解内的名与EL的名字相同,否则,执行错误。
但是,一个参数时,不需要加注解,并且不必与EL的名字相同。比如

多个参数时,注解名字必须与配置文件中名字相同

User selectWhere(@Param("myname")String myname,@Param("age") Integer age);
select * from user where name=#{myname,jdbcType=VARCHAR}  and and age=#{age,jdbcType=INTEGER}

一个参数时,不需要加注解,参数名不必与配置文件中相同

User selectUserByName(String tempName);
select * from user where name=#{myname,jdbcType=VARCHAR}

最开始我以为不加注解,只要参数名字与配置文件对应就可以了。但是,同事告诉我,java不会保存方法参数名字,所以是没法对应的。


mybatis association可以设置延迟吗?association的执行原理是什么,是先查询主记录然后一条一条的查询子记录还是主记录与子记录一起查出来?

可以设置是否延迟加载,懒加载或者立刻加载,association的fetchType就是用来设置加载策略,有eager和lazy,两种选择。

<resultMap id="BaseResultMap" type="testmaven.entity.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="dept_id" jdbcType="INTEGER" property="deptId" />
    <association property="dept" column="dept_id" fetchType="eager" select="testmaven.mapper.DeptMapper.selectByPrimaryKey" ></association>
  </resultMap>

首先查询主记录,然后根据主数据,然后再查询从数据,是一条一条的查询子记录,不是关联查询。eager时会立刻查询,lazy时会懒加载,用到时再查询。


mybatis where标签会删除多余的or、and?

会删除,这正是mybatis动态sql的强大之处!在没有where标签之前,你可能需要添加类似1=1 以防止myname为空时多余的and,如下

select * from user where 1=1 
          <if test="myname!=null and myname !=''">
             and name=#{myname,jdbcType=VARCHAR} 
          </if>
          <if test="age!=null">
              and age=#{age,jdbcType=INTEGER}
          </if>

现在,大可不必这样,只要使用<where> 标签,它会删除多余的and,这里假设myname为空,age不为空,那么它会删除age 语句的and

select * from user 
      <where>
          <if test="myname!=null and myname !=''">
              name=#{myname,jdbcType=VARCHAR} 
          </if>
          <if test="age!=null">
              and age=#{age,jdbcType=INTEGER}
          </if>
      </where>

where标签会删除多余的andor


mybatis foreach的collection,key值分为list和array?

这个说法是正确的,如果方法参数只有一个,并且是list,那么foreach的collection就设置为list;如果方法参数只有一个,并且是数组,那么foreach的collection就设置为array。
援引mybatis官方文档

你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键