risc-v中文社区

 找回密码
 立即注册
查看: 8379|回复: 3

[原创] java自动搜索数据库表的结构

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-5-9 09:58:58 | 显示全部楼层 |阅读模式
springboot下,当我们需要搜索mysql数据库表的结构并做相应逻辑处理时,并不能直接用mysql相关的starter进行mapper操作,因为本帖要处理的数据库和表都是变量化的,所以处理原理是用到了"MetalData",具体来说就是:通过HikariDataSource数据源获取数据库及表的元数据结构,然后再按照自己需要的逻辑进行处理。
1)HikariDataSource获取相应的数据源
HikariDataSource defaulthikariDataSource = new HikariDataSource();
defaulthikariDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/"+txtDBName.getText().trim()+"?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT");
defaulthikariDataSource.setUsername(txtDBUser.getText().trim());
defaulthikariDataSource.setPassword(txtDBPassword.getText().trim());
defaulthikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
Connection dataSourceConnection = defaulthikariDataSource.getConnection();
DatabaseMetaData metaData1 = dataSourceConnection.getMetaData();
2)获取表的元数据结构
esultSet tables = metaData1.getTables(null, txtDBName.getText().trim() + "%", txtDBTable.getText().trim(), new String[]{"TABLE"});
在此特别说明的是getTables函数的几个参数:String catalog, String schemaPattern,String tableNamePattern, String types[]
xxxPattern的匹配搜索原则与Mysql数据库引擎所用到的原则是一样的,比如本例中txtDBName.getText().trim() + "%",表示以txtDBName开头的数据库,如果有abc和abcd二个数据库,那么当用abc+%搜索时会有二个搜索结果,
如果用%+abc则搜索结果只能是abc;
types[]则有"TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY","LOCAL TEMPORARY", "ALIAS", "SYNONYM"这些值,很明显是数据库的各种表,过程,视图等。
catalog表示catalog name,有可能是null,当然,在mysql中搜索时,如果用:ResultSet tables = metaData1.getTables(txtDBName.getText().trim(), txtDBName.getText().trim() + "%", txtDBTable.getText().trim(), new String[]{"TABLE"});
此时如果库中有abc和abcd,然而txtDBNmae还是abc的话,则不会搜索出abcd,只能是abc.



回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-5-9 10:07:07 | 显示全部楼层
如果库中有abc和abcd,而代码是:
ResultSet tables = metaData1.getTables(null, txtDBName.getText().trim() , txtDBTable.getText().trim(), new String[]{"TABLE"});
搜索匹配时结果有abc和abcd,也就是说catalog为null时,schemapattern不含mysql的匹配字符,则只要名称中有schemapattern就会出现在搜索结果中。当然,如果catalog指定了txtDBName为abc则结果只能是abc了
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-5-9 10:11:18 | 显示全部楼层
如果库中有abc和abcd,而代码是:
ResultSet tables = metaData1.getTables(null, "%" + txtDBName.getText().trim() , txtDBTable.getText().trim(), new String[]{"TABLE"});
搜索结果依然会出现abc和abcd
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-5-9 10:14:56 | 显示全部楼层
如果库中有abc和abcd,而代码是:
ResultSet tables = metaData1.getTables(txtDBName.getText().trim() , "%" , txtDBTable.getText().trim(), new String[]{"TABLE"});
或者metaData1.getTables(txtDBName.getText().trim() , null , txtDBTable.getText().trim(), new String[]{"TABLE"});
搜索结果中只有abc
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 07:49 , Processed in 0.014946 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表