三个必要条件
- _mapper.java和 _mapper.xml 需要在同一个目录 这就是为什么看到resources有同样的包
- xml中的namespace为mapper.java的全限定路径
- mapper.xml的id和mapper.java的方法名字、参数类型、返回值一致
最后通过sqlSession.getMapper(*mapper.class)得到接口,这样就可以操作java一样了
mapper为什么要定义成接口
-
mybatis底层通过namespace+id映射到对应xml,通过JDK动态代理帮助生成具体实现
-
JDK动态代理只能代理有接口的类,通过Proxy.newProxyInstall()生成代理,调用invoke方法实现
-
生成的代理类底层已经继承了Proxy类,Java是一继承多实现的,所以mapper只能定义成接口
mapper的参数
除了基本类和POJO、Map都建议使用@Params注解,提高可读性
多个参数
mybatis默认是将参数解析成Map,参数是arg0 | params1 这样,可读性低,使用注解@Params(“ ”) 可以将arg0替换成你指定的key,这个时候KEY arg将会消失,params*保留。
单个参数
-
POJO类,直接使用。属性名和参数名称一致
-
Map集合,直接使用,Key和参数名一致
-
Collection集合,封装为Map
map.put("arg0",collection); map.put("collection",collection集合);
-
List集合,封装成Map
map.put("arg0",collection); map.put("collection",list集合); map.put("list",list集合);
-
Array数组,封装为Map
map.put("arg0",array); map.put("array",array数组);
-
其他类型,直接使用。