mybatis和spring集成的例子

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);
	}

}


在需要定义一个拦截器。用于处理前面传过来的类型为MyMap的数据,转换成Map

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;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值