本篇博客拖延了很久,可能细节处有些许遗忘了
项目需求要支持多种数据库的操作:基本的通过sql进行增删改查、查某个库的所有表、查数据表的字段、表数据及对应类型长度,👇都有实现,涉及到mysql、oracle、postgresql、gbase、mongo五种数据库
一、先上代码
1.pom引入配置
–各位如果需要驱动安装包可以私我,应该gbase的驱动包是最难找的了
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.0</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.7.0.0</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>gbase-connector-java</groupId>
<artifactId>gbase-connector-java</artifactId>
<version>8.3.81.53</version>
</dependency>
2.demo代码
mysql
main方法
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
String mysqlQueryTables = "select table_name from information_schema.tables where table_schema='test'";
String insertToMysql = "insert into `yzh_0922_002` (yzh_0922_002_no,id,sheet_name) values( 4,null,null)";
String mysqlTableInfo = "select * from information_schema.COLUMNS where table_name = 'aa_wy_test_a' and table_schema = 'test'";
String mysqlTableRows = "select count(0) from " + "table_name";
int page = 2;
int size = 10;
String q = page == 0 && size == 0 ? "" : " limit " + (page - 1) * size + "," + size;
String mysqlQuerySql = "select `amount`,`id` from `" + "aa_wy_test_a" + "`" + q;
try {
// mysql数据库
connection = mysqlConnection();
insertToMysql(connection, insertToMysql);
getDbTables(connection, mysqlQueryTables);
getTableColumn(connection, "aa_wy_test_a");
getTableRowsCount(connection, mysqlTableRows);
getTableData(connection, mysqlQuerySql);
//insert
// String insertSql ="insert into accounts (id,name,age,salary) values( 15,\'0xx\',11,12)";
// statement = connection.createStatement();
// statement.executeQuery(insertSql);
//delete
// String delSql ="drop table if exists aaaa_missing";
// statement.executeUpdate(delSql);
//select
// String sql1 ="select * from aa_wy_test_a";
// statement = connection.createStatement();
// ResultSet resultSet = statement.executeQuery(sql1);
// while(resultSet.next()) {
// System.out.println("------------" + resultSet.getString("TABLE_NAME"));
// }
// convertList(resultSet);
// resultSet.close();
//
// statement.close();
// connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
获取表中数据
private static List<Map<String, ?>> convertList(ResultSet rs) throws SQLException {
List<Map<String, ?>> list = new ArrayList<>();
while (rs.next()) {
ResultSetMetaData md = rs.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取列的数量
Map<String, Object> orderedRecords = new LinkedHashMap<>();
for (int i = 1; i <= columnCount; i++) {
System.out.println(md.getColumnName(i) + "---" + rs.getObject(i) + ", -------md:" + md.getColumnTypeName(i));
orderedRecords.put(md.getColumnName(i), rs instanceof BigInteger ? ((BigInteger) rs).longValue() : rs);
}
list.add(orderedRecords);
}
return list;
}
其余方法
//获取连接
private static Connection mysqlConnection() throws Exception {
String mysqlUser = "";
String mysqlPassword = "";
String mysqlUrl = "jdbc:mysql://ip:3306/test";
String driverClassName = "com.mysql.cj.jdbc.Driver";
Class.forName(driverClassName);
return DriverManager.getConnection(mysqlUrl, mysqlUser, mysqlPassword);
}
//insert
private static void insertToMysql(Connection connection, String sql) throws SQLException {
Statement statement = connection.createStatement();
statement.executeUpdate(sql);
statement.close();
connection.close();
}
//获取库中的表
private static List<String> getDbTables(Connection connection, String sql) throws SQLException {
List<String> list = new ArrayList<String>();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()) {
list.add(resultSet.getString("TABLE_NAME"));
System.out.println("------------" + resultSet.getString("TABLE_NAME"));
}
resultSet.close();
statement.close();
connection.close();
return list;
}
//获取表字段、类型和长度
private static List<String> getTableColumn(Connection connection, String tableName) throws SQLException {
List<String> list = new ArrayList<String>();
DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet resultSet = databaseMetaData.getColumns( null, "%", tableName, "%");
while(resultSet.next()) {
String columnName = resultSet.getString("COLUMN_NAME");
String columnType = resultSet.getString("TYPE_NAME");
int datasize = resultSet.getInt("COLUMN_SIZE");
System.out.println(columnName+" "+columnType+" "+datasize);
}
resultSet.close();
connection.close();
return list;
}
//获取表行数
private static long getTableRowsCount(Connection connection, String sql) throws SQLException {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
long rowCount = 0;
if (resultSet.next()) {
rowCount = resultSet.getInt(1);
}
System.out.println(rowCount );
resultSet.close();
statement.close();
connection.close();
return rowCount;
}
//获取表数据
private static List<Map<String, Object>> getTableData(Connection connection, String sql) throws SQLException {
System.out.println(sql);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
List<Map<String, Object>> recordsList = new ArrayList<>();
ResultSetMetaData md = resultSet.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取列的数量
while (resultSet.next()) {
Map<String, Object> orderedRecords = new LinkedHashMap<>();
for (int i = 1; i <= columnCount; i++) {
try {
orderedRecords.put(md.getColumnName(i), md.getColumnType(i) == Types.INTEGER ? resultSet.getInt(i) : resultSet.getString(i));
} catch (Exception e) {
orderedRecords.put(md.getColumnName(i), resultSet.getString(i));
}
}
recordsList.add(orderedRecords);
}
resultSet.close();
statement.close();
connection.close();
return recordsList;
}
oracle
main方法
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
String oracleSqlQueryTables = "select table_name from user_tables";
String oracleTableRows = "select count(0) from " + "PSI1";
int page = 2;
int size = 10;
String oracleQ = page == 0 && size == 0 ? "" : " where ROWNUM BETWEEN " + (page - 1) * size + " AND " + page * size;
String ol = "select ID from (select t.*,rownum r from PSI1 t ) where r between " + ((page - 1) * size + 1) + " and " + page * size;
String oracleQuerySql = page == 0 && size == 0 ? "select * from PSI1" : ol;
try {
oracle数据库
connection = oracleConnection();
getDbTables(connection, oracleSqlQueryTables);
getTableColumn(connection, "TEST");
getTableRowsCount(connection, oracleTableRows);
getTableData(connection, oracleQuerySql);
} catch (Exception e) {
e.printStackTrace();
}
}
其余方法
//获取连接
private static Connection oracleConnection() throws Exception {
String oracleUser = "";
String oraclePassword = "";
String oracleUrl = "jdbc:oracle:thin:@ip:port:xe";
String driverClassName = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverClassName);
return DriverManager.getConnection(oracleUrl, oracleUser, oraclePassword);
}
//下面四个方法和上面mysql调用的是同一个方法,就不赘述了
getDbTables(connection, oracleSqlQueryTables);
getTableColumn(connection, "TEST");
getTableRowsCount(connection, oracleTableRows);
getTableData(connection, oracleQuerySql);
postgresql
main方法
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
int page = 2;
int size = 10;
String l = page == 0 && size == 0 ? "" : " limit " + size + " offset " + (page - 1) * size;
String postQuerySql = "select id,age from accounts" + l;
String postTableRows = "select count(0) from " + "accounts";
try {
// postGre数据库
connection = postConnection();
getPostTables(connection);
getTableColumn(connection, "basic_info");
getTableRowsCount(connection, postTableRows);
getTableData(connection, postQuerySql);
} catch (Exception e) {
e.printStackTrace();
}
}
其余方法
//获取连接
private static Connection postConnection() throws Exception {
String postGreUser = "";
String postGrePassword = "";
String postGreUrl = "jdbc:postgresql://ip:port/test";
String driverClassName = "org.postgresql.Driver";
Class.forName(driverClassName);
return DriverManager.getConnection(postGreUrl, postGreUser, postGrePassword);
}
//获取数据库中所有表名
private static List<String> getPostTables(Connection connection) throws SQLException {
DatabaseMetaData metaData = connection.getMetaData();
List<String> list = new ArrayList<String>();
ResultSet resultSet = metaData.getTables(null, null, "%", null);
while (resultSet.next()) {
String tableName = resultSet.getString("TABLE_NAME");
String tableType = resultSet.getString("TABLE_TYPE");
if (judgeContainsStr(tableName, false) && null != tableType && tableType.equals("TABLE")) {
System.out.println("postGre-tableName:" + tableName + ", tableType:" + tableType);
list.add(tableName);
}
}
return list;
}
//下面三个方法和上面mysql调用的是同一个方法,就不赘述了
getTableColumn(connection, "basic_info");
getTableRowsCount(connection, postTableRows);
getTableData(connection, postQuerySql);
gbase
main方法
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
String gbaseQueryTables = "select table_name from information_schema.tables where table_schema='test'";
String gbaseTableRows = "select count(0) from " + "mytable";
String gbaseQuerySql = "select * from " + "mytable" + q;
String gbaseQuerySql1 ="select `col2`,`col1` from `" + "mytable" + "`" + q;
try {
// gbase数据库
connection = gbaseConnection();
getDbTables(connection, gbaseQueryTables);
getTableColumn(connection, "mytable");
getTableRowsCount(connection, gbaseTableRows);
getTableData(connection, gbaseQuerySql1);
} catch (Exception e) {
e.printStackTrace();
}
}
其余方法
private static Connection gbaseConnection() throws Exception {
String gbaseUser = "";
String gbasePassword = "";
String gbaseUrl = "jdbc:gbase://ip:port/test";
String driverClassName = "com.gbase.jdbc.Driver";
Class.forName(driverClassName);
return DriverManager.getConnection(gbaseUrl, gbaseUser, gbasePassword);
}
//下面四个方法和上面mysql调用的是同一个方法,就不赘述了
getDbTables(connection, gbaseQueryTables);
getTableColumn(connection, "mytable");
getTableRowsCount(connection, gbaseTableRows);
getTableData(connection, gbaseQuerySql1);
mongo
main方法
public static void main(String[] args) {
try {
// mongo数据库
MongoClient mongoClient = mongo();
getMongoTables(mongoClient, "dmtestdb");
getMongoTableColumn(mongoClient, "dmtestdb", "dmtestcoll");
getMongoTableColumn1(mongoClient, "dmtestdb", "dmtestcoll");
getMongoTableRowsCount(mongoClient, "dmtestdb", "dmtestdb");
} catch (Exception e) {
e.printStackTrace();
}
}
其他方法
private static MongoClient mongo() {
try {
ServerAddress serverAddress = new ServerAddress(ip,port);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential credential = MongoCredential.createScramSha1Credential("dmtest", "dmtestdb", "dmlab".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
System.out.println("Connect to database successfully");
//通过连接认证获取MongoDB连接
return new MongoClient(addrs,credentials);
} catch (Exception e) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
return null;
}
}
public static List<String> getMongoTables(MongoClient mongoClient, String databaseName) {
List<String> tableCounts = new ArrayList<>();
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
for (String collectionName : mongoDatabase.listCollectionNames()) {
tableCounts.add(collectionName);
}
mongoClient.close();
return tableCounts;
}
private static List<String> getMongoTableColumn(MongoClient mongoClient, String databaseName, String tableName) throws SQLException {
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(tableName);
//查询集合全部数据 FindIterable<Document> cursor = mongoCollection.find();
//分页查询 FindIterable<Document> cursor = mongoCollection.find().skip(1).limit(2);
//分页查询 mongoCollection.find().skip("跳过").limit("查询几条")
// mongoCollection.find(eq("status", "A")).skip("跳过").limit("查询几条")
//查询具体的字段 .projection(fields(include("item", "status"), excludeId()));
FindIterable<Document> cursor = mongoCollection.find().skip(1).limit(2).projection(fields(include("name", "age", "_id"), excludeId()));
HashMap<String, String> keyAndType = new HashMap<>();
for (Map.Entry<String, Object> entry : cursor.first().entrySet()) {
if (entry.getValue() instanceof Double) {
keyAndType.put(entry.getKey(), "Double");
} else if (entry.getValue() instanceof Integer) {
keyAndType.put(entry.getKey(), "Integer");
} else {
keyAndType.put(entry.getKey(), "String");
}
}
MongoCursor<Document> mongoCursor = cursor.iterator();
List<CollectionRecords.CollectionRecord> records = Lists.newArrayList();
while (mongoCursor.hasNext()) {
Document loopDocument = mongoCursor.next();
CollectionRecords.CollectionRecord collectionRecord = new CollectionRecords.CollectionRecord();
for (Map.Entry<String, Object> entry : loopDocument.entrySet()) {
CollectionRecords.CollectionField collectionField = new CollectionRecords.CollectionField();
collectionField.setKey(entry.getKey());
collectionField.setValue(entry.getValue().toString());
collectionField.setType(keyAndType.get(entry.getKey()));
collectionRecord.add(collectionField);
records.add(collectionRecord);
}
}
// [{"record":[{"key":"name","value":"\"bob\"","type":"[]uint8"},{"key":"age","value":"42","type":"[]uint8"},{"key":"status","value":"\"A\"","type":"[]uint8"},{"key":"ObjectId","value":"62f328222522c7b329120af3","type":"bson.ObjectId"}]},{"record":[{"key":"status","value":"\"A\"","type":"[]uint8"},{"key":"ObjectId","value":"62f328332522c7b329120afb","type":"bson.ObjectId"},{"key":"name","value":"\"ahn\"","type":"[]uint8"},{"key":"age","value":"22","type":"[]uint8"}]},{"record":[{"key":"age","value":"34","type":"[]uint8"},{"key":"status","value":"\"D\"","type":"[]uint8"},{"key":"ObjectId","value":"62f3283d2522c7b329120b14","type":"bson.ObjectId"},{"key":"name","value":"\"xi\"","type":"[]uint8"}]}]
System.out.println("records: " + new Gson().toJson(records));
mongoCursor.close();
mongoClient.close();
return null;
}
private static List<String> getMongoTableColumn1(MongoClient mongoClient, String databaseName, String tableName) throws SQLException {
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
ListCollectionsIterable<Document> collectionsIterable = mongoDatabase.listCollections();
Document firstDocument = collectionsIterable.first();
if (firstDocument != null) {
System.out.println("first collection >>>" + firstDocument.toJson());
}
/** collectionsIterable.iterator() 获取 MongoCursor<Document> 游标
* 不用担心空指针异常*/
MongoCursor<Document> mongoCursor = collectionsIterable.iterator();
while (mongoCursor.hasNext()) {
Document loopDocument = mongoCursor.next();
// collectionList.add(loopDocument);
}
/**关闭游标*/
mongoClient.close();
return null;
}
private static long getMongoTableRowsCount(MongoClient mongoClient, String databaseName, String tableName) throws SQLException {
long rowCount = 0;
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(tableName);
rowCount = mongoCollection.count();
mongoClient.close();
System.out.println("getMongoTableRowsCount-rowCount:" + rowCount);
return rowCount;
}
代码较多,但应该是比较细节了,这里就不做过多的讲解了