applicationContext.xml
<jee:jndi-lookup id="mysql" jndi-name="jdbc/mysql"/>
<jee:jndi-lookup id="test" jndi-name="jdbc/test"/>
<bean p:dataSource-ref="mysql" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configLocation="classpath:mybatis-config.xml" p:mapperLocations="classpath:*/*.mysql.xml"/>
<bean p:dataSource-ref="test" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configLocation="classpath:mybatis-config.xml" p:mapperLocations="classpath:*/*.test.xml"/>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
mybatis.example.mysql.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="example.mysql">
<select id="selectUser" resultType="hashMap">
select * from user
</select>
</mapper>
mybatis.example.test.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="example.test">
<select id="selectUser" resultType="hashMap">
select * from user
</select>
</mapper>
MybatisUtils.java
package example;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
public class MybatisUtils {
public static Map<Integer,SqlSession> sqlSession;
public static Map<Integer,Configuration> configuration;
static{
Map<String, SqlSessionFactoryBean> map = SpringUtils.getBeansOfType(SqlSessionFactoryBean.class);
sqlSession = new HashMap<Integer, SqlSession>();
configuration = new HashMap<Integer, Configuration>();
for (SqlSessionFactoryBean s : map.values()) {
int id = s.hashCode();
try {
SqlSession ss = new SqlSessionTemplate(s.getObject());
sqlSession.put(id, ss);
configuration.put(id, ss.getConfiguration());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 根据sqlId获取DatabaseId
* @param sqlId
* @return
*/
public static int getDatabaseId(String sqlId){
for (int i : configuration.keySet()) {
Configuration c = configuration.get(i);
try {
//包含在try里,如果不加,找不到就抛出异常,终止循环
MappedStatement ms = c.getMappedStatement(sqlId);
if(null != ms){
return i;
}
} catch (Exception e) {
}
}
return 0;
}
/**
* 根据sqlId取DatabaseId再返回SqlSession
* @param sqlId
* @return
*/
public static SqlSession getSqlSession(String sqlId){
return sqlSession.get(getDatabaseId(sqlId));
}
}
java测试代码
List<Object> list = new ArrayList<Object>();
String sqlId = "example.mysql.selectUser";
SqlSession sqlSession = MybatisUtils.getSqlSession(sqlId);
list = sqlSession.selectList(sqlId);
sqlId = "example.test.selectUser";
sqlSession = MybatisUtils.getSqlSession(sqlId);
list.addAll(sqlSession.selectList(sqlId));
其实applicationContext.xml的配置和MybatisUtils.java的实现是关键,MybatisUtils.java可以根据sqlId动态选择对应的数据库,其中要求文件命名里指定后缀,比如例子中分mysql和test两个数据库mapper文件命名要对应。