[技术分享]-Mybatis配置多个数据源(Java)
2018-01-31 17:26
381 查看
首先,使用Mybatis配置多个数据源需要用到两个工具类:SqlSessionFactory MapperFactory
其中,SqlSessionFactory根据mybatis.xml中配置的不同的environment创建对应的SqlSessionsqlSessionFactory,在由MapperFactory来使用这个sqlSession。
接着,在数据库配置文件jdbc.properties中,配置sql连接需要的参数:
在mybatis-config文件中,配置多个数据源的environment:
OK 到现在为止,工具类以及配置文件都已经写好了,可以在使用了~
使用的时候,首先new 一个空接口Mapper,以作为所有实现该接口的都是mapper实现类的标识
一个具体mapper的接口:
然后就可以在工程中使用了:
通过 MapperFactory.createMapper方法,传入mapper对象与数据源,即可简单便捷的连接到任意配置好的数据源了~
/** * 根据mybatis.xml中配置的不同的environment创建对应的SqlSessionFactory */ public final class SqlSessionFactory { private static final Logger logger = LoggerFactory.getLogger(SqlSessionFactory.class); private static final String CONFIGURATION_PATH = "mybatis/mybatis-config.xml"; private static final Map<String, org.apache.ibatis.session.SqlSessionFactory> SQLSESSIONFACTORYS = new HashMap(); /** * 根据指定的DataSourceEnvironment获取对应的SqlSessionFactory */ public static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) { org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = SQLSESSIONFACTORYS.get(datasource); if (!Objects.isNull(sqlSessionFactory)) return sqlSessionFactory; else { InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(CONFIGURATION_PATH); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, datasource); logger.info("Get {} SqlSessionFactory successfully.", datasource); } catch (IOException e) { logger.warn("Get {} SqlSessionFactory error.", datasource); logger.error(e.getMessage(), e); } finally { IOUtils.closeQuietly(inputStream); } SQLSESSIONFACTORYS.put(datasource, sqlSessionFactory); return sqlSessionFactory; } } }
/** * MapperFactory 创建一个Mapper实例 mapper */ public final class MapperFactory { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MapperFactory.class); /** * 通过datasource 创建一个Mapper 的实现类 mapper */ @SuppressWarnings("unchecked") public static <T> T createMapper(Class<? extends Mapper> clazz, String datasource) { org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(datasource); SqlSession sqlSession = sqlSessionFactory.openSession(); Mapper mapper = sqlSession.getMapper(clazz); return (T) MapperProxy.bind(mapper, sqlSession); } /** * Mapper代理: 执行 mapper 方法和关闭 sqlSession */ private static class MapperProxy implements InvocationHandler { private Mapper mapper; private SqlSession sqlSession; private MapperProxy(Mapper mapper, SqlSession sqlSession) { this.mapper = mapper; this.sqlSession = sqlSession; } @SuppressWarnings("unchecked") private static Mapper bind(Mapper mapper, SqlSession sqlSession) { return (Mapper) Proxy.newProxyInstance(mapper.getClass().getClassLoader(), mapper.getClass().getInterfaces(), new MapperProxy(mapper, sqlSession)); } /** * 执行mapper方法并最终关闭sqlSession */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = null; try { object = method.invoke(mapper, args); } catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage(), e); } finally { sqlSession.close(); } return object; } } /** * 获取数据源 datasource 的 SqlSessionFactory */ private static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) { return SqlSessionFactory.getSqlSessionFactory(datasource); } }
其中,SqlSessionFactory根据mybatis.xml中配置的不同的environment创建对应的SqlSessionsqlSessionFactory,在由MapperFactory来使用这个sqlSession。
Mapper mapper = sqlSession.getMapper(Class<? extends Mapper> clazz);
接着,在数据库配置文件jdbc.properties中,配置sql连接需要的参数:
api00.jdbc.url=jdbc:mysql://10.126.13.10:3307/XXXXX?characterSet=utf8mb4 api01.jdbc.url=jdbc:mysql://10.126.13.24:3307/XXXXX?characterSet=utf8mb4 api02.jdbc.url=jdbc:mysql://10.126.14.6:3307/XXXXX?characterSet=utf8mb4 api03.jdbc.url=jdbc:mysql://10.126.13.6:3307/XXXXX?characterSet=utf8mb4 api04.jdbc.url=jdbc:mysql://10.126.13.11:3307/XXXXX?characterSet=utf8mb4 api.jdbc.username=XXXXX api.jdbc.password=XXXXX api.jdbc.driverClassName=com.mysql.jdbc.Driver
在mybatis-config文件中,配置多个数据源的environment:
<?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> <properties resource="mybatis/jdbc.properties"/> <!-- 全局参数 --> <settings> <!-- 使用驼峰命名法转换字段。 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="com.XXX.XXX"/> </typeAliases> <environments default="wemedia"> <environment id="api00"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="url" value="${api00.jdbc.url}" /> <property name="driver" value="${api.jdbc.driverClassName}" /> <property name="username" value="${api.jdbc.username}" /> <property name="password" value="${api.jdbc.password}" /> </dataSource> </environment> <environment id="api01"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="url" value="${api01.jdbc.url}" /> <property name="driver" value="${api.jdbc.driverClassName}" /> <property name="username" value="${api.jdbc.username}" /> <property name="password" value="${api.jdbc.password}" /> </dataSource> </environment> <environment id="api02"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="url" value="${api02.jdbc.url}" /> <property name="driver" value="${api.jdbc.driverClassName}" /> <property name="username" value="${api.jdbc.username}" /> <property name="password" value="${api.jdbc.password}" /> </dataSource> </environment> <environment id="api03"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="url" value="${api03.jdbc.url}" /> <property name="driver" value="${api.jdbc.driverClassName}" /> <property name="username" value="${api.jdbc.username}" /> <property name="password" value="${api.jdbc.password}" /> </dataSource> </environment> <environment id="api04"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="url" value="${api04.jdbc.url}" /> <property name="driver" value="${api.jdbc.driverClassName}" /> <property name="username" value="${api.jdbc.username}" /> <property name="password" value="${api.jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mybatis/mapper/XXX.xml"/> <mapper resource="mybatis/mapper/YYY.xml"/> </mappers> </configuration>
OK 到现在为止,工具类以及配置文件都已经写好了,可以在使用了~
使用的时候,首先new 一个空接口Mapper,以作为所有实现该接口的都是mapper实现类的标识
public interface Mapper { }
一个具体mapper的接口:
public interface ChannelDao extends Mapper { Long checkRelationship(@Param("fromId") String fromId, @Param("userId") Long userId); }
然后就可以在工程中使用了:
ChannelDao channelDao = MapperFactory.createMapper(ChannelDao.class, "api01"); channelID = channelDao.checkRelationship("XXXXX", 123456);
通过 MapperFactory.createMapper方法,传入mapper对象与数据源,即可简单便捷的连接到任意配置好的数据源了~
相关文章推荐
- java-durid、mybatis、spring 整合基于 AbstractRoutingDataSource 的多数据源读写分离配置
- 【Java】一次SpringMVC+ Mybatis 配置多数据源经历
- 【Java】一次SpringMVC+ Mybatis 配置多数据源经历
- 【Java】一次SpringMVC+ Mybatis 配置多数据源经历
- 【JAVA秒会技术之随意切换数据库】Spring如何高效的配置多套数据源
- Java中属性和字段的区别 ,很多人都分不开吗.尤其是反射技术之上的mybatis,spring配置,jstl 标签
- Java编程:配置Tomcat5数据源心得
- JAVA配置JNDI数据源
- 【转】Java程序数据库连接,数据源配置,数据库连接池
- Java中,不用配置数据源,通过JDBC-ODBC与Access数据库建立连接
- Java工具类:读配置文件,jdbc,数据源,hsqldb随web启动的Listener
- Java程序数据库连接,数据源配置,数据库连接池
- 清华大学计算中心培训部-技术分享:java入门教程:Hello world程序
- (1) MyBatis学习之准备--配置数据源、创建公用类
- java从XML中读取数据源配置
- 利用spring+ibatiS技术,在spring中配置多个数据源,并实现动态切换。
- 清华大学计算中心培训部-技术分享:Java基础入门:不定长度参数
- Java技术的入门配置
- Java程序数据库连接,数据源配置,数据库连接池
- JAVA技术:XML配置文件的读取处理