一个JDBC小工具

pom.xml

结构
在这里插入图片描述

<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql5>5.1.44</mysql5><mysql8>8.0.30</mysql8><hikari.version>4.0.3</hikari.version>
</properties><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>2.0.7</version></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>${hikari.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql8}</version></dependency>
</dependencies>

basic

DbInfo.java

就是一个普通的bean,记录jdbc的连接信息

@Data
@Builder
public class DbInfo {private String jdbcUrl;private String username;private String password;private String driverClassName;
}

AbstractContainerDatabase.java

生成一个连接池,可用于执行sql

public class AbstractContainerDatabase {protected ResultSet performQuery(DbInfo info, String sql) throws SQLException {DataSource ds = getDataSource(info);Statement statement = ds.getConnection().createStatement();statement.execute(sql);ResultSet resultSet = statement.getResultSet();resultSet.next();return resultSet;}protected DataSource getDataSource(DbInfo info) {HikariConfig hikariConfig = new HikariConfig();hikariConfig.setJdbcUrl(info.getJdbcUrl());hikariConfig.setUsername(info.getUsername());hikariConfig.setPassword(info.getPassword());hikariConfig.setDriverClassName(info.getDriverClassName());return new HikariDataSource(hikariConfig);}
}

mysql

MysqlInfo.java

由于各种JDBC使用的驱动不一样。所以构建一个Mysqlnfo类,负责生成MySQL所使用的Dbinfo。由于MySQL版本可能不一样,这里提供了不同版本的dbInfo。

public class MysqlInfo {private static final String MYSQL_JDBC_URL_TEMPLATE = "jdbc:mysql://%s:%s/%s";private static final String MYSQL_V5_DRIVER_CLASS = "com.mysql.jdbc.Driver";private static final String MYSQL_V8_DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";public static DbInfo getMysql5Info(String host, int port, String username, String password, String db) {return DbInfo.builder().jdbcUrl(String.format(MYSQL_JDBC_URL_TEMPLATE, host, port, db)).username(username).password(password).driverClassName(MYSQL_V5_DRIVER_CLASS).build();}public static DbInfo getMysql8Info(String host, int port, String username, String password, String db) {return DbInfo.builder().jdbcUrl(String.format(MYSQL_JDBC_URL_TEMPLATE, host, port, db)).username(username).password(password).driverClassName(MYSQL_V8_DRIVER_CLASS).build();}
}

MysqlTest.java

测试类,这里集成了前面的AbstractContainerDatabase,直接构造一个DbInfo,然后new一个自己,就可以直接调用performQuery来执行SQL了。

public class MysqlTest extends AbstractContainerDatabase {private static final Logger LOG = LoggerFactory.getLogger(MysqlTest.class);public static void main(String[] args) throws SQLException {DbInfo mysql8Info = MysqlInfo.getMysql8Info("host", 3306, "user", "passwd", "tmp");MysqlTest mysqlTest = new MysqlTest();ResultSet resultSet = mysqlTest.performQuery(mysql8Info, "select * from test");// 输出表结构信息ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();LOG.info("Table Structure is :");for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnName(i);String columnType = metaData.getColumnTypeName(i);int columnLength = metaData.getColumnDisplaySize(i);int nullable = metaData.isNullable(i);String columnTypeName = metaData.getColumnTypeName(i);String columnClassName = metaData.getColumnClassName(i);LOG.info("Column Name: {}", columnName);LOG.info("Data Type: {}", columnType);LOG.info("Column Length: {}", columnLength);LOG.info("Column Nullable: {}", nullable);LOG.info("Column typeName: {}", columnTypeName);LOG.info("Column Class Name: {}", columnClassName);LOG.info("------------------------");}// 处理查询结果while (resultSet.next()) {// 获取数据并进行处理for (int i = 1; i <= columnCount; i++) {Object obj = resultSet.getObject(i);LOG.info("Column {} : {}", i, obj);}LOG.info("------------------------");}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从ChatGPT革命性的对话系统,看人机交互模式6个阶段的演变

ChatGPT引领革命&#xff0c;看人机交互六步飞跃 ©作者|wy 来源|神州问学 引言 在科技的浪潮中&#xff0c;人机交互模式不断演进&#xff0c;从最初的简单指令输入到如今的智能对话系统&#xff0c;每一次革新都昭示着人类与机器交流方式的深刻变革。ChatGPT&#xff0…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 &#xff1f; 1、什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用 basic.reject 或 basic.nack 声明消费失败&#xff0c;并且消息的 reque…

【C++】 认识多态 + 多态的构成条件详细讲解

前言 C 目录 1. 多态的概念2 多态的定义及实现2 .1 虚函数&#xff1a;2 .2 虚函数的重写&#xff1a;2 .2.1 虚函数重写的两个例外&#xff1a; 2 .3 多态的两个条件&#xff08;重点&#xff09;2 .4 析构函数为啥写成虚函数 3 新增的两个关键字3.1 final的使用&#xff1a;3…

Java面试题:多线程2

如何停止正在运行的线程 1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断) 2,使用stop()方法强行终止(不推荐) 3,调用interrupt()方法中断线程 打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常 打断正常的线程,可以根据打断状态来标记…

LLVM的ThinLTO编译优化技术在Postgresql中的应用

部分内容引用&#xff1a;https://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html LTO是什么&#xff1f; 链接时优化&#xff08;Link-time optimization&#xff0c;简称LTO&#xff09;是编译器在链接时对程序进行的一种优化。它适用于以文件为单位编译…

Llama3-Tutorial之XTuner微调Llama3个人小助手

Llama3-Tutorial之XTuner微调Llama3个人小助手 使用XTuner微调llama3模型。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. web demo部署 参考上一节内容已经完成web demo部署&#xff0c;进行对话测试, 当前回答基于llama3官方发布的模型进行推理生成&…

项目|保障房房产管理系统,政务房产解决方案

一、系统概况 保障房管理系统是是为了落实中央关于住房保障的相关政策&#xff0c;实现对低收入家庭住房状况的调查管理、保障计划及落实管理、保障申请及审核管理、保障户和保障房源档案管理等。 针对政府保障房产管理的一站式解决方案&#xff0c;专注于为解决复杂、繁琐的…

为何美国多IP服务器搭建蜘蛛池SEO更经济?

为何美国多IP服务器搭建蜘蛛池SEO更经济? 随着网络时代的不断演进&#xff0c;搜索引擎优化(SEO)已经成为企业和个人提升网站曝光度的必经之路。在这个过程中&#xff0c;蜘蛛池(Spider Pool)服务被广泛应用。但是有趣的是&#xff0c;美国多IP服务器搭建蜘蛛池SEO服务却相对…

【学习AI-相关路程-工具使用-自我学习-cudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 &#xff08;2&#xff09;】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

代码随想录算法训练营第三天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

对于链表完全陌生&#xff0c;但是看题目又觉得和数组一样的 链表理论基础 Q&#xff1a;什么是链表&#xff1f; A&#xff1a;链表是由一系列结点组成的。每一个结点由两部分组成&#xff1a;数据和指针。 203.移除链表元素 题目&#xff1a; 给你一个链表的头节点 head 和…

【电影】【指环王】【中土世界】影碟播放记录

一、写在前面 笔者于5月5日&#xff08;昨天&#xff09;在新加坡淘到了一套《指环王 The Lord of the Rings》DVD光碟&#xff0c;今天却听闻噩耗&#xff0c;Rohan国王Theoden的扮演者&#xff0c;英国演员Bernard Hill去世&#xff08;享年79岁&#xff09;&#xff0c;发文…

从键入网址到网页显示,期间发生了什么?

从键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 孤单小弟【HTTP】真实地址查询【DNS】指南帮手【协议栈】可靠传输【TCP】远程定位【IP】两点传输【MAC】出口【网卡】送别者【交换机】出境大门【路由器】互相扒皮【服务器与客户端】相关问答 不少小伙伴在面试过程…