Java实现桌面快捷脚本--查MySQL数据

文章介绍了如何使用Java代码连接到MySQL数据库,接受用户输入的SQL查询,以提供只读权限的数据访问。通过引入JDBC驱动,建立数据库连接,并封装成jar包,以防止密码泄露。该方法适用于为同事提供临时查询线上数据的工具,而无需直接分享数据库凭据。

一、场景说明

在工作中,数据库操作分了很多权限,比如,读写和只读权限,可能有些同事需要排查问题,临时需要查询线上数据库的数据,但我们的是读写权限,不能直接给他们用,而且又不能泄露密码给他们,两种方式,一种通过运维同事临时开一个只读账号,还有一种就是我们可以通过写一个程序,支持他们输入SQL查询,下面我们来实现一下第二种方式~

二、代码实现

我们以Java代码为例

1、引入mysql驱动包

因为没有使用到啥框架,所以我们首先需要引入mysql驱动包,下载地址downloads.mysql.com

2、具体代码实现

我们主要实现连接到MySQL数据库并执行用户输入的SQL查询,通过加载MySQL的JDBC驱动,创建一个到MySQL数据库的连接,然后创建一个Statement对象来执行SQL查询,并通过创建了一个Scanner对象来从控制台读取用户输入。

// mysql8.0以上版本com.mysql.jdbc.Driver 更换为 com.mysql.cj.jdbc.Driver
private static final String driver = "com.mysql.jdbc.Driver"; 
private static final String con_url = "jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String user_name = "root";
private static final String user_passward = "forlan";

// 驱动只需要加载一次,所以放在静态代码块里面
static {
	try {
		Class.forName(driver);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
}

public static void main(String[] args) {
	ResultSet rs = null;
	try (Connection connection = DriverManager.getConnection(con_url, user_name, user_passward);
		 Statement stmt = connection.createStatement(); Scanner sc = new Scanner(System.in)) {
		while (true) {
			System.out.println("请输入要执行的sql:");
			String sql = sc.nextLine();
			StringBuilder sb = new StringBuilder();
			rs = stmt.executeQuery(sql);
			ResultSetMetaData metaData = rs.getMetaData();
			while (rs.next()) {
				for (int i = 0; i < metaData.getColumnCount(); i++) {
					String col_name = metaData.getColumnName(i + 1);// 获取列名
					sb.append(col_name).append("=").append(rs.getObject(col_name)).append(";");
				}
				sb.append("\n");
			}
			System.out.println(sb.toString());
		}
	} catch (Exception e) {
		System.out.println("执行失败,请联系管理员处理");
		e.printStackTrace();
	}finally {
		try {
			rs.close();
		} catch (SQLException throwables) {
			throwables.printStackTrace();
		}
	}
}

三、生成jar包

上面写完代码后,我们使用IntelliJ IDEA生成jar包,按照下面的步骤操作即可~

1、打开File>Project Structure

显示以下窗口,按图中的步骤操作
在这里插入图片描述

2、设置启动类

在下面窗口的Main Class中,选择我们前面编写的main方法所在类作为启动类,点击OK
在这里插入图片描述

3、打开Bulid>Build Artifacts,按图中窗口操作

鼠标放在“All Artifacts”上,会弹出“Action”窗口
在这里插入图片描述
点击Bulid,可以看到已经生成jar包了
在这里插入图片描述

4、对jar包进行反编译处理

这里需要对jar包进行反编译处理,防止我们的密码泄露

四、测试效果

假设我们的库表数据如下:

mysql> select * from forlan_class;
+----+------------+
| id | class_name |
+----+------------+
|  1 | 初级班     |
|  2 | 中级班     |
|  3 | 高级班     |
|  4 | 大师班     |
|  5 | 成神班     |
|  6 | 神仙班     |
+----+------------+

编写“bat”脚本文件,或者直接打开命令窗口执行“java -jar queryCode.jar”也OK,脚本内容也是一样的东西,只是方便我们快捷使用

java -jar queryCode.jar
pause

双击bat脚本,输入我们要查询的sql,看到返回结果就OK了
在这里插入图片描述

如果遇到如下错误,可以按照如下方法解决

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
        at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:316)
        at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:258)
        at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:321)
        at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:234)
        at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:767)
        at java.base/java.util.jar.JarFile.getInputStream(JarFile.java:852)
        at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:868)
        at java.base/jdk.internal.loader.Resource.cachedInputStream(Resource.java:77)
        at java.base/jdk.internal.loader.Resource.getByteBuffer(Resource.java:161)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:791)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:760)
# 创建临时目录
mkdir temp && cd temp

# 解压 JAR 文件
jar xf ../decodeLinkParam.jar

# 删除签名文件
rm -rf META-INF/*.SF META-INF/*.RSA META-INF/*.DSA META-INF/*.EC

# 重新打包
jar cfm ../decodeLinkParam_fixed.jar META-INF/MANIFEST.MF *

# 返回原目录
cd ..

# 运行修复后的 JAR
java -jar decodeLinkParam_fixed.jar

五、总结

其实最核心的还是我们编写的Java代码,接受用户输入的SQL,然后处理识别SQL,进行数据库查询,然后只需要把我们的程序打包成可执行的jar包,然后就可以直接通过命令执行了,上面的方式,有个前提条件,就是需要你的电脑有安装jdk。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值