关于一个项目兼容mysql多版本问题总结
同一个java项目兼容mysql多版本(8.0,5.6,5.1)
mysql兼容多版本
公司有一个报表系统,可提供用户录入数据源并展示统计结果,由于数据源是用户自己手动录入的,mysql 版本有很多(本身系统支持多种数据源,本次只讨论mysql兼容问题),需要同时兼容5.1,5.6,5.7,8.0及以上版本,在此记录一下方法。
使用的jar包
项目默认使用的是mysql-connector-java-8.0.16.jar,但是8.0可以兼容5.6及以上版本,不兼容5.1版本,所以在获取数据库连接的时候,需要转换一下驱动。如果所有mysql版本都在5.6及以上,可以直接使用Class.forName(JDBC_MYSQL_DRIVER)来更换驱动,但是要连接5.1版本,需要下一步操作。
获取5.1版本驱动
在项目中加入mysql-connector-java-5.1.34.jar包,可以放在resource下,也可新建目录,保证路径可以加载即可,手写类加载器,将mysql-connector-java-5.1.34.jar包的com.mysql.jdbc.Driver加载进来,然后获取连接,代码如下:
public class MyClassloader extends URLClassLoader {public static final Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();public MyClassloader(URL[] urls) {super(urls);}@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {Class<?> classLoaded = classMap.get(name);if (classLoaded != null) {return classLoaded;}Class<?> findClass = null;try {findClass = findClass(name);} catch (Exception e) {//还可以从父类查找,这个异常吞掉,如果没有父类会抛出}if (findClass != null) {classMap.put(name, findClass);return findClass;}return super.loadClass(name);}@Overrideprotected Package getPackage(String name) {return null;}}
@Service
public class ClassUrlsLoader {public Logger logger = LoggerFactory.getLogger(ClassUrlsLoader.class);public Map<String, URL[]> urlsMap = new HashMap<>();public URL[] getUrls(){URL[] urls = urlsMap.get("urls");if(urls != null){return urls;}try {// 获得File对象,当然也可以获取输入流对象String filePath = url + "/mysql-connector-java-8.0.16.jar";InputStream inputStream = new FileInputStream(filePath);File file = new File(url + "/targetFile.tmp");FileUtils.copyInputStreamToFile(inputStream, file);URL url1 = file.toURL();urls = new URL[]{url1};urlsMap.put("urls", urls);logger.info("urls map:" + urls.length);return urls;} catch (IOException e) {e.printStackTrace();}return urls;}}
使用方法:
String driverClass="com.mysql.cj.jdbc.Driver";//高版本驱动,获取mysql5的驱动,去掉cjMyClassloader loader = new MyClassloader(new ClassUrlsLoader().getUrls());Class<?> aClass = loader.loadClass(driverClass);Driver driver = (Driver) aClass.newInstance();
获取到驱动后就可以调用connect方法获取连接来使用了。
最后:
感谢!!
小白编辑,有问题请随时指正,不胜感激!!
关于一个项目兼容mysql多版本问题总结相关推荐
- 独家专访:SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL!
SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL! 标签:SequoiaDB 3.0,MySQL,OLTP SequoiaDB巨杉数据库 3.0,在产品GA发布后,经过近半年在金融级 ...
- Web项目--------原Oracle数据库的项目同时兼容MySql
原Oracle数据库的项目同时兼容MySql步骤: (一)修改资源配置文件applicationContext-dataSource.xml的数据库连接 Oracle数据库中加上from dual的原 ...
- 使用Intellij Idea创建第一个SpringBoot+MyBatis+MySql项目并运行(附安装教程),使用Maven构建项目并管理第三方jar
Intellij Idea 背景 开发工具及主要框架 Maven 下载安装 settings.xml修改 IDEA配置Maven 注册私有jar Maven打包 MySql安装 配置环境变量 Inte ...
- 如何导入别人的android studio项目,解决gradle版本不兼容问题
如何导入别人的android studio项目,解决gradle版本不兼容问题 参考文章: (1)如何导入别人的android studio项目,解决gradle版本不兼容问题 (2)https:// ...
- VUE项目兼容IE11 遇见的问题 SyntaxError: strict 模式下不允许一个属性有多个定义;ie11下载excel文件需要用navigator.msSaveBlob
最近要把vue项目兼容ie11 前面引入bable等一系列操作就不说了,下面说一下具体具体的问题 1 如图所示 SyntaxError: strict 模式下不允许一个属性有多个定义, 点击sta ...
- 使用umi打包项目兼容低版本浏览器如safari,chrome等
umi.js 中有运算符 Safari和低版本Chrome报错,参考 umijs.org 文档,配置正确的 targets 在umirc.js中配置targets 2.1.0+ 配置浏览器最低版本,会 ...
- 一个项目部署多个节点会导致锁失效么_不为人知的分布式锁实现,全都在这里了
1引入业务场景 首先来由一个场景引入: 最近老板接了一个大单子,允许在某终端设备安装我们的APP,终端设备厂商日活起码得几十万到百万级别,这个APP也是近期产品根据市场竞品分析设计出来的,几个小码农通 ...
- 一个小时学会MySQL数据库
致谢:一个小时学会MySQL数据库 一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库 ...
- 【转载】一个小时学会MySQL数据库
一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库技术品牌.服务与架构 1.3.数据库 ...
最新文章
- 2021-2027年中国室内定位市场研究及前瞻分析报告
- 关于服务器返回信息的Unicode转码的方法
- DedeCMS(织梦)安全设置经验分享
- java 观察者模式
- 学会这几招,你也可以用 Redis 做实时订阅推送!
- 通过反射获取无参无返回值成员方法并使用
- 安装UBUNTU Server 11.10
- Java的注解机制——Spring自动装配的实现原理
- ATK - Accessibility Toolkit - 辅助功能工具包
- 申通回应被京东“封杀”;Kotlin 1.4.0 发布 | 极客头条
- ajax 服务器怎么响应,Ajax 接收服务器返回的json响应方法
- 用python编写决策树算法_详细介绍python实现决策树C4.5算法
- SpringBoot实现导入功能
- python模拟ios点击_弱弱的问下,ios的捷径可以实现模拟点击吗?
- 支付宝小程序、百度小程序、微信小程序、今日头条小程序技术分析
- 黑群晖折腾之docker系列之迅雷远程下载
- STM32F100R4 单片机解密特性 ST芯片解密
- 2022泰迪杯数据分析技能赛B题方案及赛后总结:银行客户忠诚度分析
- csgo中国上海服务器因维护,2019CSGO亚洲邀请赛11月20日战火重燃 再临上海
- ASPCMS标签教程