设为首页 加入收藏

TOP

mybatis配置使用多个数据源(二)
2015-07-24 10:24:28 来源: 作者: 【 】 浏览:3
Tags:mybatis 配置 使用 多个 数据源
Proxy(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)); } /** * execute mapper method and finally close 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; } } //Get a SqlSessionFactory of environment private static SqlSessionFactory getSqlSessionFactory(DataSourceEnvironment environment) { return DataSourceSqlSessionFactory.getSqlSessionFactory(environment); }
大功告成,客户端使用:
Java代码
UserMapper mapper = MapperFactory.createMapper(UserMapper.class, DataSourceEnvironment.HD);  
User user = mapper.getUserById(162L);  
System.out.println(user);  


OK,到此基本上所有的工作就完成了,以上的方式就可以支持多个数据源了。
但是代码还不够优雅,以上代码我们发现DataSourceEnvironment这个枚举变量在客户端,MapperFactory以及DataSourceEnvironment
中传来传去,我们应该尽量减少一个类对外界类的耦合,也就是不符合Java 编程原则中的迪米特法则。
好了,那我们来改良一下。
将MapperFactory设计成枚举策略模式:
Java代码
/** 
 * Mapper Creator 
 * @author boyce 
 * @version 2014-3-28 
 */  
public enum MapperFactory {  
      
    HD {  
        private SqlSessionFactory sqlSessionFactory;  
          
        @Override  
        public  T createMapper(Class clazz) {  
            return createMapper(clazz, this);  
        }  
          
        @Override  
        protected void createSqlSessionFactory() {  
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name());  
        }  
          
        @Override  
        public SqlSessionFactory getSqlSessionFactory() {  
            return sqlSessionFactory;  
        }  
          
    },  
    HO {  
        private SqlSessionFactory sqlSessionFactory;  
        @Override  
        public  T createMapper(Class clazz) {  
            return createMapper(clazz, this);  
        }  
          
        @Override  
        protected void createSqlSessionFactory() {  
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, this.name());  
        }  
          
        @Override  
        public SqlSessionFactory getSqlSessionFactory() {  
            return sqlSessionFactory;  
        }  
    };  
      
    /** 
     * Create a mapper of environment by Mapper class 
     * @param clazz Mapper class  
     * @param environment A datasource environment 
     * @return a Mapper instance 
     */  
    public abstract  T createMapper(Class clazz);  
      
    /** 
     * Create SqlSessionFactory of environment 
     */  
    protected abstract void createSqlSessionFactory();  
      
    /** 
     * get SqlSessionFactory 
     */  
    public abstract SqlSessionFactory getSqlSessionFactory();  
      
    private static InputStream inputStream = null;  
    static {  
        try {  
            inputStream = Resources.getResourceAsStream("mybatis/mybatis.xml");  
            HO.createSqlSessionFactory();  
            HD.createSqlSessionFactory();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            IOUtils.closeQuietly(inputStream);  
        }  
    }  
      
    @SuppressWarnings("unchecked")  
    private static  T createMapper(Class clazz, MapperFactory MapperFactory) {  
        SqlSession sqlSession = MapperFactory.getSqlSessionFactory().openSession();  
        Mapper mapper = sqlSession.getMapper(clazz);  
        return (T)MapperProxy.bind(mapper, sqlSessio
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Delete删除表数据时对性能的影响.. 下一篇Redis的持久化-AOF

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)
·MySQL 数据类型:从 (2025-12-26 18:20:03)
·Linux Shell脚本教程 (2025-12-26 17:51:10)
·Qt教程,Qt5编程入门 (2025-12-26 17:51:07)