spring中使用mybatis

本文详细介绍了如何使用Mybatis实现根据SQLID动态选择数据库,通过applicationContext.xml和MybatisUtils.java的配置来完成多数据库的灵活管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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文件命名要对应。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值