SpringBoot maven 项目 JDBC 连接多源数据库

news2024/11/17 13:26:47

此方法支持 mysql,oracle,postgre,sqlserver等等

基本逻辑:1. 加载驱动; 2. 通过DriverManager传入数据库地址,用户名,密码,获取本地数据库连接

1. pom文件下添加依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-driver.version}</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- oracle -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>21.1.0.0</version>
</dependency>

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.4.0.jre8</version>
</dependency>

2. 新建Connect基础类,其中提供select和insert方法。

public class JDBCConn {
    private Connection conn = null;
    private String driver;
    private String user;
    private String password;
    private String url;

    public JDBCConn(String driver, String user, String password, String url) {
        this.driver = driver;
        this.user = user;
        this.password = password;
        this.url = url;
        this.getConnection();
    }

    private void getConnection() {
        try {
            //加载驱动
            Class.forName(driver);
            //获取本地数据库
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功");
        } catch (Exception e) {
            System.out.println("获取数据库连接对象时产生的异常" + e);
        }
    }

    //关闭数据库连接
    public void closeAll(PreparedStatement pst) {
        if (pst != null) {
            try {
                pst.close();
                System.out.println("关闭数据库连接");
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("PreparedStatement对象关闭数据库的异常" + e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
                System.out.println("关闭数据库连接");
            } catch (Exception e) {
                System.out.println("数据库连接对象的异常" + e);
            }
        }
    }

    public Connection getConn() {
        return conn;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }


    public List<Map<String, String>> selectAll(String tableName, String where) {
        List<Map<String, String>> result = new ArrayList<>();
        try {
            Statement statement = conn.createStatement();
            String sql = "select * from " + tableName + " " + where;
            ResultSet rs = statement.executeQuery(sql);//执行sql语句
            ResultSetMetaData rsmd = rs.getMetaData();//获取属性名
            String[] keys = new String[0];
            if (rsmd != null) {
                int count = rsmd.getColumnCount();
                keys = new String[count];
                for (int i = 1; i <= count; i++) {
                    keys[i - 1] = rsmd.getColumnName(i);
                }
            }
            System.out.println();
            while (rs.next()) {
                Map<String, String> temp = new HashMap<>();
                for (String key : keys) {
                    temp.put(key.toLowerCase(), rs.getString(key));
                }
                result.add(temp);
            }
            rs.close();
            statement.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public void insertList(String tableName, List<Map<String, String>> params) {
        ResultSetMetaData rsmd = null;
        StringBuilder keySb = new StringBuilder();
        StringBuilder valueSb = new StringBuilder();
        try {
            Statement sqlStatement = conn.createStatement();
            String sql = "select * from " + tableName;
            ResultSet rs = sqlStatement.executeQuery(sql);
            rsmd = rs.getMetaData();
            List<String> keys = new ArrayList<>();
            if (rsmd != null) {
                int count = rsmd.getColumnCount();
                for (int i = 1; i <= count; i++) {
                    keys.add(rsmd.getColumnName(i));
                }
            }
            keys.forEach(key -> keySb.append(key).append(","));
            params.forEach(temp -> {
                StringBuilder sb2 = new StringBuilder("('");
                for (int i = 0; i < keys.size(); i++) {
                    String value = temp.get(keys.get(i));
                    if (null == value && Character.isUpperCase(keys.get(i).charAt(0))) {
                        value = temp.get(keys.get(i).toLowerCase());
                    }
                    if (null == value && Character.isLowerCase(keys.get(i).charAt(0))) {
                        value = temp.get(keys.get(i).toUpperCase());
                    }
                    sb2.append(value);
                    if (i == keys.size() - 1) {
                        sb2.append("'),");
                    } else {
                        sb2.append("','");
                    }
                }
                valueSb.append(sb2);
            });
//            INSERT [INTO] table_or_view [(column_list)] VALUES data_values
            String insertSql = "insert into " + tableName + "(" + keySb.substring(0, keySb.length() - 1) + ") values " + valueSb.substring(0, valueSb.length() - 1) + "";//SQL语句
            System.out.println(insertSql);
            sqlStatement.executeUpdate(insertSql);
            System.out.println();
            rs.close();
            sqlStatement.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Execute failed !");
        }
    }
}

封装的数据库链接我就直接上图了

main函数测试

public static void main(String[] args) {
    JDBCConn mySqlConn = JDBCService.getMySqlJDBCConn();
    List<Map<String, String>> ads_tops = mySqlConn.selectAll("ads_top", "");
    System.out.println(ads_tops);
}

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 多线程下载以及断点续传

多线程下载 在日常开发中&#xff0c;我们不可避免的会接到类似这样的需求&#xff0c;下载一个比较大的素材文件或者安装包文件&#xff0c;以此实现APP的自动更新&#xff0c;APP内的素材替换等。由于一般此类文件都比较大&#xff0c;一般会在50M以上&#xff0c;如果我们不…

高效好用的开发工具箱——猿如意

目录 前言&#xff1a; 1.我常用的功能介绍 2.主要功能chatGPT测评 3.我的使用体验和改进建议 前言&#xff1a; 猿如意是一款帮助开发的效率工具&#xff0c;集成了许多有用的工具和文档教程。帮助开发者提升开发效率&#xff0c;帮你从“问题”找到“答案”。尤其是12月…

加注超融合 星辰天合推出 XHERE V2 系列

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;“XSKY星辰天合”&#xff09;成功举办了主题为“能存会算&#xff0c;创新不断”的 XHERE 超融合新品渠道推介会&#xff0c;正式向市场推出 XHERE V2 超融合软件平台。通过继续加大对超融合产品线的…

上云节省 35%计算资源,420 个运维人天:运满满实时计算实践和思考

摘要&#xff1a;本文整理自满帮实时数据团队 TL 欧锐&#xff0c;在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a;满帮业务及平台架构介绍实时数据实时产品未来计划Tips&#xff1a;点击「阅读原文」查看原文视频&演讲 ppt01满帮业务及平台架构介绍…

数据可视化系列-01大数据可视化基础

文章目录1.概述2.大数据可视化基础2.1 数据可视化基础知识1、数据可视化简史&#xff1a;2、数据可视化是什么&#xff1a;3、数据可视化的分类&#xff1a;4、数据可视化流程&#xff1a;5、数据可视化的意义&#xff1a;2.2 认识BI和数据可视化工具1、BI的简介&#xff1a;BI…

RabbitMQ:订阅模型-匹配模式

阅模型-匹配模式&#xff0c;相比于前两种订阅模型&#xff0c;是更细致的分组&#xff0c;允许 在RoutingKey 中使用匹配符 *&#xff1a;匹配一个单词#&#xff1a;匹配0个或多个单词 RabbitMQ 订阅模型-匹配&#xff08;topics&#xff09;模式主要有以下六个角色构成&#…

FFmpeg功能命令汇总

前言 如此强大的FFmpeg&#xff0c;能够实现视频采集、视频格式转化、视频截图、视频添加水印、视频切片、视频录制、视频推流、更改音视频参数功能等。通过终端命令如何实现这些功能&#xff0c;Richy在本文做一记录&#xff0c;以备之后查阅。 注意&#xff1a;下面一一列举…

AI4DB-Cardinality Estimation

一个学期已经结束了&#xff0c;通过这篇文章总结一下自己在CE方面所学习的内容。 由于大数据技术的飞速发展&#xff0c;使数据库在查询方面面临很大的挑战。原来数据量不大的时候&#xff0c;查询可以在很快的时间内得到结果&#xff0c;但是现在动辄就是上万上千万甚至上亿的…

数据结构之红黑树的生成、添加以及删除详解(附代码)

一&#xff0c;红黑树的来历 红黑树&#xff0c;首先是一个二叉树&#xff0c;对于二叉树&#xff0c;人们为了提升它的搜索效率&#xff0c;降低时间复杂度&#xff0c;创造出了二叉搜索树&#xff0c;把时间复杂度降低为对数级&#xff08;LOGn)&#xff0c;但是会出现一些极…

zookeeper之基本使用及实现分布式锁

写在前面 本文一起看下zk的基本用法。 安装 。 1&#xff1a;数据结构 采用类似于linux系统的文件系统存储结构&#xff0c;但不同于Linux系统文件&#xff0c;zk每个节点都可以存储数据&#xff0c;结构如下图&#xff1a; 节点类型分为如下四种&#xff1a; PERSISTENT&…

RK3568平台开发系列讲解(设备驱动篇)中断下文之tasklet的使用

🚀返回专栏总目录 文章目录 一、tasklet 的概念二、tasklet 参考步骤沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们一般将中断分为上下两个部分,分为上半部,下半部。上半部完成有严格时限的工作(必须),例如回复硬件等,这些工作都是在禁止其他中断情况下进…

汽车相关概念记录

目录 一、汽车电路相关概念 1.1、两个电源 1.2、单线制 1.3、低压直流供电 1.4、常电与ACC 1.4.1、大众ACC供电开关 1.4.2、奥迪ACC开关 二、电子电路 2.1、三极管 2.1.2、截止状态 2.1.3、放大区 2.1.4、饱和区 2.1.4、实例分析 一、汽车电路相关概念 1.1、两个电…

CIO40— 2022 行平常心,做自由人 (3年之约已满)

今天的天空依然很蓝。认识还是在那个不戴口罩的夏天。 感谢IT行业给了我们帮助。 IT将交流植根于微信群&#xff0c;微信群既是信息的集散地&#xff0c;也是良好实践的方案池。在工作中碰到的问题&#xff0c;只要在IT微信群中求助&#xff0c;大家都是知无不言&#xff0c…

C# 异步编程

一 异步编程 1 异步 asynchronize 2 主要解决的事情是 ① 等待一些耗时的任务&#xff08;特别是文件&#xff0c;网络操作&#xff09;而不阻塞当前任务&#xff1b; ② 异步编程提高响应能力&#xff08;特别是UI&#xff09; 开始一个任务后&#xff0c;让任务在离感应线…

机器学习:图文详细总结马尔科夫链及其性质(附例题分析)

目录0 写在前面1 从一个实例出发2 马尔科夫链3 马氏链的基本性质4 C-K方程5 平稳状态分布6 遍历性与例题分析0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

canopen4.0-canfestiva移植以及同步帧发送

1.canfestival移植入 工程包: 一、canfestival系列教程之程序移植 1.1、首先准备一个hal工程 ,cubmx --------------RCC配置 -----------SYS配置 ----------时钟配置 -----canopen定时器配置(开启中断) --------------can配置波特率,接收中断

CSS3知识点精学

CSS3 被拆分为"模块"。旧规范已拆分成小块&#xff0c;还增加了新的。 一些最重要 CSS3 模块如下&#xff1a; 选择器盒模型背景和边框文字特效2D/3D转换动画多列布局用户界面css引入方式 内嵌式&#xff1a;CSS写在style标签中&#xff0c;style标签虽然可以写在…

PE格式的base reloc分区

https://0xrick.github.io/win-internals/pe7/ 程序雕塑被编译之后&#xff0c;编译器假设可执行文件将会在特定1的v z基地址被加载&#xff0c;这个地址被保存在image_optional_header的imagebase成员中&#xff0c;一些地址会被计算出来然后硬编码到可执行文件中 出于各种原…

malmquist指数案例分析

传统的DEA模型可以反应静态的投入产出效率情况&#xff0c;但如果是面板数据&#xff0c;则需要使用malmquist指数进行研究。malmquist指数可以分析从t期到t1期的效率变化情况。Malmquist指数可分解为技术效率&#xff08;EC&#xff09;和技术进步&#xff08;TC&#xff09;&…

Java高手速成│Java程序怎样和数据库对话

从上一篇 Java高手速成│编写你第一个数据库程序 的例子中可以看出&#xff0c;Java和数据库的连接和对话离不开JDK库类&#xff0c;如java.sql包中支持数据库编程的各种API类、数据库软件DBMS、JDBC驱动软件或Java Connector以及你编写的数据库编程代码。 并且&#xff0c;在…