自主创建mybtis管理应用,用以横向管理数据源
这个是我写的第一个随手小记,一晃眼做后端开发也有7年多了,现在也准备将一些杂七杂八的资料整理下。也算是回顾这7年中做的比较有意思的东西了。
这个需求是我17年做的,当时的应用场景是仓储库比较多,随时会动态的开启和关闭。好在数据库的表结构是一致的。需要针对不同的库将商品进行有效的管理起来。考虑到数据源是动态变化的,那么使用spring架构下的多数据源配置是行不通。因为表名一致,而且数据源是动态变化的,最少也有90多家的数据,手工配置会死人的。那换成java的jdbc管理呢,最基本的那个,考虑到现在都到mybatis进行数据库管理了。往回退也不好。那么就花了几天出了这个方案。废话不说了,开工...... 第一次写博客还是有点小激动啊。
首先需要手动获取spring的application,从而手动进行资源的注入。将代码的独立性做起来。


/**
* Created by Dean on 2017/10/19.
* 获取SpringApplicationContext信息获取 该方法可以不用通过注入形式获取相关数据
*/
@Component
public class SpringApplictionAuto implements ApplicationContextAware {
// Spring应用上下文环境
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*
* @param applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringApplictionAuto.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象
*
* @param name
* @return Object
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
}
图1: Mybatis的大致结构


1 public SqlSessionTemplate getLocalMybatislSession() {
2 ApplicationContext applicationContext = SpringApplictionAuto.getApplicationContext();
3 SqlSessionFactory defaultSqlSessionFactory = (SqlSessionFactory) applicationContext.getBean("sqlSessionFactory");
4 SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(defaultSqlSessionFactory);
5 return sqlSessionTemplate;
6 }
获取本地SqlSessionTemplate
本地SqlSession获取好后那么后面就是重头戏了。
我们首先需要获取的有以下几点:
- 数据库连接说明
- 数据库账号信息(没有相关信息也连不上数据库,当然数据库密码小伙伴们打算用密文还是明文,都是随意的。密文的话需要双向加密方式,明文吗,倒是随时可以查其他系统数据库了)
- 数据库mapper组信息
- 数据库mapper具体地址
- 数据库mapper组和mapper的具体关联
- 数据库配置参数表,其中还有类型处理器
后面就是依次创建SqlSessionFactoryBean,SqlSessionFactory,DruidDataSource,Configuration,TypeHandler[]


1 /**
2 * 通过数据库相关信息与mybatis相对应的信息创建 SqlSessionFactory
3 *
4 * @param hospitalDbInfoEntity 数据库相关信息
5 * @param hospitalMapperEntityArrayList 该数据源下存在相应的mapper信息
6 * @return 返回SqlSessionFactory
7 * @throws Exception 创建失败时会返回异常
8 */
9 public SqlSessionFactory buildSqlSessionFactory(SqlSessionFactoryBean factoryBean, HospitalDbInfoEntity hospitalDbInfoEntity, ArrayList<HosMapper> hospitalMapperEntityArrayList) throws Exception {
10 DruidDataSource dataSource =new DruidDataSource();
11 dataSource.setDefaultAutoCommit(true);
12 dataSource.setUrl(hospitalDbInfoEntity.getUrl());
13 dataSource.setPassword(hospitalDbInfoEntity.getPassword());
14 dataSource.setUsername(hospitalDbInfoEntity.getUser());
15 dataSource.setDriverClassName(hospitalDbInfoEntity.getDriver_name());
16
17 dataSource.setInitialSize(50);
18 dataSource.setMaxActive(100);
19 dataSource.setMaxIdle(50);
20 dataSource.setMinIdle(30);
21 dataSource.setRemoveAbandoned(true);
22 dataSource.setRemoveAbandonedTimeout(180);
23 dataSource.setFilters("stdout");
24 dataSource.setResetStatEnable(false);
25 dataSource.setMaxWait(600000);
26 dataSource.setTimeBetweenEvictionRunsMillis(300000);
27 dataSource.setMinEvictableIdleTimeMillis(600000);
28 dataSource.setValidationQuery("SELECT 1 from dual");
29 dataSource.setTestOnBorrow(true);
30 dataSource.setTestOnReturn(false);
31 dataSource.setTestWhileIdle(true);
32 factoryBean.setDataSource(dataSource);
33 String paths = "";
34 factoryBean.setMapperLocations(getMapperResource(hospitalMapperEntityArrayList));
35 Configuration configuration = buildConfiguration();
36 factoryBean.setConfiguration(configuration);
37 factoryBean.setTypeHandlers(buildTypeHandlers(configuration));
38 SqlSessionFactory sqlSessionFactory = factoryBean.getObject();
39 return sqlSessionFactory;
40 }
部分创建代码
上面这块设置好后就是后面拿结果了,结果还是封装到了SqlSessionTemplate中。


1 /**
2 * 创建SqlSession信息通过医院Id值
3 *
4 * @param hospitalId 数据库中对应的唯一键值
5 * @return 返回创建好的数据库连接信息
6 */
7 public SqlSessionTemplate buildSqlSession(Integer hospitalId) {
8 SqlSession localSession = getLocalSession();
9 HosConnIdMapper hosConnIdMapper = localSession.getMapper(HosConnIdMapper.class);
10 HosMapperMapper hosMapperMapper = localSession.getMapper(HosMapperMapper.class);
11 HospitalDbInfoEntity hospitalDbInfoEntity = hosConnIdMapper.findHospitalEntity(hospitalId);
12
13 if (hospitalDbInfoEntity == null) {
14 return null;
15 }
16 ArrayList<HosMapper> hospitalMapperEntityArrayList = (ArrayList<HosMapper>) hosMapperMapper.findByHospitalId(hospitalId);
17 if (hospitalMapperEntityArrayList.size() == 0) {
18 return null;
19 }
20 SqlSessionFactory sqlSessionFactory;
21 try {
22 sqlSessionFactory = buildSqlSessionFactory(hospitalId.toString(), hospitalDbInfoEntity, hospitalMapperEntityArrayList);
23 } catch (Exception e) {
24 e.printStackTrace();
25 return null;
26 }
27 sqlSessionFactoryHashMap.put(hospitalId.toString(), sqlSessionFactory);
28 SqlSessionTemplate sqlSession = new SqlSessionTemplate(sqlSessionFactory);
29 dataPools.put(hospitalId.toString(), sqlSession);
30 return sqlSession;
31 }
创建SqlSessionTemplate
最后就是准备拿结果了:


1 /**
2 * 获取mybatis中Mapper信息
3 *
4 * @param mapper mybatis 相关dao层类名
5 * @param hospitalId mybatis连接的
6 * @param <T> 自定义类型可供不同的mapper进行使用
7 * @return 返回Mapper信息
8 */
9 public <T> T getMapperInstance(Class<T> mapper, Integer hospitalId) {
10 SqlSessionTemplate sqlSession;
11
12 if (hospitalId == 0) {
13 sqlSession = dataPools.get("localSession");//本地连接
14 } else {
15 sqlSession = dataPools.get(hospitalId.toString());
16 }
17 if (sqlSession == null) {
18 sqlSession = buildSqlSession(hospitalId);
19 }
20 return SqlSessionUtils.getSqlSession(sqlSession.getSqlSessionFactory(),sqlSession.getExecutorType(),sqlSession.getPersistenceExceptionTranslator()).getMapper(mapper);
21 }
获取具体的mapper
到此,目的达到了。可以通过入参比如数据源ID,可以动态获取某一个数据源的ID下的具体mapper。
由于当时应该是工作的第二年,很多地方写的也不好,我就将关键的地方放上来了。有些描述不对的,请小伙伴指出来。
图1来源:https://blog.csdn.net/u013541707/article/details/113245421
自主创建mybtis管理应用,用以横向管理数据源的更多相关文章
- intellij 创建java web项目(maven管理的SSH)
intellij 创建java web项目(maven管理的SSH) 环境intellij IDEA14.MAVEN.Spring.Struts2.Hibernate.Java Web.工程搭建. 1 ...
- oracle创建表空间自增空间管理
表空间(tablespace).段(segment).区(extent).块(block),这些都是oracle数据库在数据文件中组织数据的基本单元 1.创建表空间create tablespace ...
- 订单业务楼层化 view管理器和model管理器进行了model和view的全面封装处理 三端不得不在每个业务入口上线时约定好降级开关,于是代码中充满了各种各样的降级开关字段
京东APP订单业务楼层化技术实践解密 原创 杜丹 留成 博侃 京东零售技术 2020-09-29 https://mp.weixin.qq.com/s/2oExMjh70Kyveiwh8wOBVA 用 ...
- 云原生应用管理,像管理手机APP一样管理企业应用
我们在使用智能手机的时候,手机APP从应用市场一键安装,安装好即点即用,当有新版本一键升级,如果不想用了长按图标删除,整个过程非常简单,小朋友都能熟练掌握.而对于企业应用,由于结构复杂.可用性要求高. ...
- Linux中断管理 (1)Linux中断管理机制
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Atitit 分布式管理 vs 集中式管理
Atitit 分布式管理 vs 集中式管理 1. 集中式管理缺点 1 1.1. 单点故障 1 1.2. 没有灵活性 1 1.3. 打败vs 征服 参考 尼可罗·马基雅弗利编著的<君主论> ...
- 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)
一.Spring事务管理的特点 Spring框架为事务管理提供一套统一的抽象,带来的好处有:1. 跨不同事务API的统一的编程模型,无论你使用的是jdbc.jta.jpa.hibernate.2. 支 ...
- Java SSM 客户管理 商户 管理系统 库存管理 销售报表 项目源码
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- SVN-项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改
错误描述: 项目 XXX 受源代码管理.向源代码管理注册此项目时出错.建议不要对此项目进行任何修改 解决办法: 使用记事本打开,项目csproj文件删除图中几行,重新打开解决方案就可以了 原因分析: ...
随机推荐
- AI全流程开发难题破解之钥
摘要:通过对ModelArts.盘古大模型.ModelBox产品技术的解读,帮助开发者更好的了解AI开发生产线. 本文分享自华为云社区<[大厂内参]第16期:华为云AI开发生产线,破解AI全流程 ...
- 利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标)
现而今,我们纵向的回顾整个大前端的历史,不难发现,人们对前端的审美要求越来越高,越来越严苛,与此同时,人们对追求美的体验是也极致的,从理性到感性,从平面到几何,从现实到虚拟,所以从某种角度来说,作为前 ...
- RSS订阅微信公众号初探-feed43
为什么用RSS,能怎么用RSS订阅微信公众号 建议信息聚合(Really Simple Syndication, RSS)在08年我第一次摸到自己家电脑时就给我留下了印象,当时还想这打开都啥玩意呀怎么 ...
- 为MySQL MGR实现简单的负载均衡代理
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 原创:万里数据库,花家舍 导读 在多写(多节点写入)数据库(例如MySQL MGR的multi-primary mode) ...
- Luogu2858[USACO06FEB]奶牛零食Treats for the Cows (区间DP)
我是个傻逼,这么水的题都会T #include <iostream> #include <cstdio> #include <cstring> #include & ...
- Linux 07 用户组文件
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 用户组的所 ...
- 刷题记录:Codeforces Round #739 (Div. 3)
Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...
- 安装配置华为Fusion acces(Lite AD)并使Windows登录
安装Fusion access虚拟机 根据自己情况自定义 点击编辑虚拟机设置 添加镜像 点击确定并开启此虚拟机 选择第二个 Install 添加Network:修改hostname:修改密码 回车添加 ...
- Windows平台真实时毫秒级4K H264/H265直播技术方案
背景 在刚提出4K视频的时候,大多数人都觉得没有必要,4K的出现,意味着更高的硬件规格和传输要求,1080P看的很爽.很清晰,完全满足了日常的需求.随着电视的尺寸越来越大,原本1080P成像已经无法满 ...
- 【SQLServer】max worker threads参数说明
本文介绍如何使用SQL Server Management Studio或Transact-SQL在SQL Server中配置最大工作线程服务器配置选项. max worker threads选项配置 ...