TypeHandler
如果我理解正确,我可以提供下一个变体:为Type创建 MyBatis Strategy
,从 Spring 上下文中获取适当的策略 bean。我希望我没有忘记任何事情。
细节:
MyClass {
private Strategy strategy;
}
StrategyA implements Strategy - "a" id in DB
StrategyB implements Strategy - "b" id in DB
1)弹簧上下文.xml:
<bean id="strategyA" class="test.mybatis.inject.StrategyA" scope="singleton"></bean>
<bean id="strategyB" class="test.mybatis.inject.StrategyB" scope="singleton"></bean>
2)创建Spring上下文提供者:
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
context = ctx;
}
}
3)在spring-context.xml中添加provider bean描述:
<bean id="applicationContextProvder" class="test.mybatis.inject.ApplicationContextProvider"/>
4)创建StrategyTypeHandler:
@MappedTypes(value={Strategy.class})
public class StrategyTypeHandler implements TypeHandler<Strategy> {
...
public Strategy getResult(ResultSet rs, String columnName) throws SQLException {
switch(rs.getString(columnName)){ //for Java 1.7 & above
case "a":
return (StrategyA)ApplicationContextProvider.getApplicationContext().getBean(StrategyA.class);
case "b":
return (StrategyB)ApplicationContextProvider.getApplicationContext().getBean(StrategyB.class);
}
return null;
}
}
5)MyClassMapper.xml:
<result column="strategy_id" property="strategy" jdbcType="VARCHAR" typeHandler="test.mybatis.inject.StrategyTypeHandler"/>
跑。