Mybatis中的Dao接口是什么?Dao接口里面的方法能重载吗?

通常一个 xml 映射文件,都会写一个 Dao 接口与之对应。Dao 接口就是人们常说的 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名,就是映射文件中 MappedStatementid 值,接口方法内的参数,就是传递给 sql 的参数。 Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个 MappedStatement ,举例:com.mybatis3.mappers. StudentDao.findStudentById ,可以唯一找到 namespacecom.mybatis3.mappers. StudentDao 下面 id = findStudentByIdMappedStatement 。在 MyBatis 中,每一个 select * from student id = #{id}

能正常运行,并能得到相应的结果,这样就实现了在 Dao 接口中写重载方法。

Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个,否则启动会报错。        

Dao 接口方法可以重载,但是需要满足以下条件:

  1. 仅有一个无参方法和一个有参方法
  2. 多个有参方法时,参数数量必须一致。且使用相同的 @Param ,或者使用 param1 (默认参数名,还有个叫arg)这种。

测试如下

PersonDao.java

Person queryById();

Person queryById(@Param("id") Long id);

Person queryById(@Param("id") Long id, @Param("name") String name);

PersonMapper.xml


org.apache.ibatis.scripting.xmltags. DynamicContext. ContextAccessor#getProperty 方法用于获取 标签中的条件值

public Object getProperty(Map context, Object target, Object name) {
  Map map = (Map) target;

  Object result = map.get(name);
  if (map.containsKey(name) || result != null) {
    return result;
  }

  Object parameterObject = map.get(PARAMETER_OBJECT_KEY);
  if (parameterObject instanceof Map) {
    return ((Map)parameterObject).get(name);
  }

  return null;
}

parameterObject 为 map,存放的是 Dao 接口中参数相关信息。

((Map)parameterObject).get(name) 方法如下:

public V get(Object key) {
  if (!super.containsKey(key)) {
    throw new BindingException("Parameter '" + key + "' not found. Available parameters are " + keySet());
  }
  return super.get(key);
}
  1. queryById()方法执行时,parameterObject为 null,getProperty方法返回 null 值,标签获取的所有条件值都为 null,所有条件不成立,动态 sql 可以正常执行。
  2. queryById(1L)方法执行时,parameterObject为 map,包含了idparam1两个 key 值。当获取标签中name的属性值时,进入((Map)parameterObject).get(name)方法中,map 中 key 不包含name,所以抛出异常。
  3. queryById(1L,"1")方法执行时,parameterObject中包含id,param1,name,param2四个 key 值,idname属性都可以获取到,动态 sql 正常执行。

你可能感兴趣的:(Mybatis,mybatis,java)