2011-06-19

mybatis多个参数问题

在网上google了好久,都说是mybatis只支持一个参数。我想这个框架不至于如此弱智吧。但找了好久都没有找到方法。只有去看看源代码了。在org.apache.ibatis.binding.MapperMethod这个类中有一个getParam方法。
if (args == null || paramCount == 0) {
return null;
} else if (!hasNamedParameters && paramCount == 1) {
return args[paramPositions.get(0)];
} else {
Map param = new HashMap();
for (int i = 0; i < paramCount; i++) {
param.put(paramNames.get(i), args[paramPositions.get(i)]);
}
return param;
}
这里很明白的写着如果有多个参数的话,就会新建一个map,并用paramNames中的string做key。
再看看paramNames的生成过程,在setupMethodSignature方法中。
final Class[] argTypes = method.getParameterTypes();
for (int i = 0; i < argTypes.length; i++) {
if (RowBounds.class.isAssignableFrom(argTypes[i])) {
rowBoundsIndex = i;
} else {
String paramName = String.valueOf(paramPositions.size());
paramName = getParamNameFromAnnotation(i, paramName);
paramNames.add(paramName);
paramPositions.add(i);
}
}
明显的可以看到如果有多个参数的话,就用paramName加入到paramNames中。这个paramName默认就用参数的序号(从0开始),如果有Param注解的话,就使用注解的名称。

所以很明显了。mybatis是支持多个参数的。如果什么都不做的话,就可以使用#{0},#{1}来使用多个参数。如果想好看一些,就使用Param注解给参数一个好听的名字。

当然这是基于mybatis-spring集成的情况下。其它情况下没有细看了。

2011-06-17

使用tomcat-maven-plugin时InvokerServlet与JNDI Datasource配置

在把以前的项目转成Maven项目过程中,有以下两个问题:
1、以前的项目使用了tomcat的InvokerServlet。转为maven项目后,InvokerServlet怎么配置。
2、以前的项目在tomcat中server.xml中context中设置了resource。转为maven项目后,InvokerServlet怎么配置。
解决问题如下:
1、在maven项目中建立src/main/tomcatconf目录,这个目录下的文件会复制到target/conf目录中。如果没有的话,会生成一些默认值。所以可以把这些文件复制到tomcatconf中。主要用到两个文件web.xml和context.xml。
2、修改tomcatconf目录下的web.xml。增加InvokerServlet的配置。修改context.xml,在Context中加入privileged="true"的属性。InvokerServlet就可以使用了。
3、修改context.xml,在Context中加入Resource子节点。具体方法请见DataSource的配置。
4、注意,修改pom.xml,在tomcat-maven-plugin的plugin配置中。加入相应的database driver的依赖。这样,应用就可以通过JNDI查找Datasource了。