mybatis和spring集成例子
本例中使用的是mybatis版本为3.2.6,spring的版本为3.2.1.RELEASE,用于集成spring的jar包版本为1.2.2
mybatis的配置如下:
<!--数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${db.pay.url}" />
<property name="username" value="${db.pay.user}" />
<property name="password" value="${db.pay.password}"/>
</bean>
<!-- mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath*:/resources/**/*mysql.xml"/>
<property name="plugins">
<list>
<bean class="com.MyParamInterceptor"></bean>
</list>
</property>
<property name="configLocation" value="/resources/mybatis-config.xml"></property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="xxx.xx"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
这个类是用于扫描mybatis写的mapper接口类。并和sqlSessionFactory指定的mybatis定义的xml中写的sql文件对应。
org.mybatis.spring.mapper.MapperScannerConfigurer
mapper类如下
public interface MoneyMapper {
Map<String, Object> add(Map<String, Object> params);
void create(MyMap myMap);
}
对应的xml文件
<mapper namespace="com.MoneyMapper">
<insert id="create" parameterType="com.MyMap">
insert into table(name,value) values(#{name},#{value})
</insert>
<pre name="code" class="html"> <insert id="int" parameterType="java.util.Map">
insert into table(name,value) values(#{name},#{value})
</insert>
</mapper>
spring在加载时,会自动扫描mybatis的配置文件,并生一个类型是MoneyMapper的bean。在编码spring业务类时,可以直接通过@Autowired 进行注入mapper
有些时候不同的服务中用于交互的数据格式可能是自定义的,而不是java类库的类。或者是Map里的数据类型可以是很多,每次取数据的时候需要转换数据类型,我们可以对Map进行一下封装,提供更多的方法,比如getInt(key),getLong(key)等。这时就需要对mybatis配置文件进行修改,
本例中的Mapper的create(MyMap map)方法是用的是自定的一个类,而不是mybatis里定义的java类库的类,需要在以下地方多配置2个文件
<property name="configLocation" value="/resources/mybatis-config.xml"></property>
<property name="plugins">
<list>
<bean class="com.MyParamInterceptor"></bean>
</list>
</property>
mybatis-config.xml的处理如下
<configuration>
<objectFactory type="com.MyObjectFactory"/>
</configuration>
我这里只需要把指定的类型,比如com.MyMap在mybatis里内部仍然使用的是Map进行处理
public class MyObjectFactory extends DefaultObjectFactory {
private static final long serialVersionUID = 1L;
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
if (type == MyMap.class) {
return (T)new HashMap<String, Object>();
}
return super.create(type, constructorArgTypes, constructorArgs);
}
}
public class MyParamInterceptor implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
if (invocation.getArgs()[1] instanceof MyMap) {
MyMap myMap= (Record)invocation.getArgs()[1];
//把第一个参数转换成Map
invocation.getArgs()[1] = transBeforeParams(myMap);
Object result = invocation.proceed();
//把第一个参数在转换回MyMap
invocation.getArgs()[1] = transAfterParams(sourceRd, invocation.getArgs()[1]);
return result;
} else {
return invocation.proceed();
}
}
protected Object transBeforeParams(MyMap myMap) {
Map<String, Object> params = new HashMap<String, Object>();
params.putAll(myMap);
return params;
}