Springboot手動(dòng)連接庫并獲取指定表結(jié)構(gòu)的示例代碼
一、前言??
通過,在使用springboot框架之后,就很少涉及到手動(dòng)連接數(shù)據(jù)庫的方式了,但bug菌有遇到這么一個(gè)需求場(chǎng)景,給到你的是無上限的數(shù)據(jù)庫連接信息,要求你能按連接信息指定獲取表數(shù)據(jù),突然我就一愣,我問了問,能給我具體的那些數(shù)據(jù)庫嗎?由于是對(duì)接第三方,不確定,所以只能給到你生成好的連接信息,你只能依據(jù)它的連接信息自動(dòng)連接并解析。
很完美,這不就得回到以前玩springmvc的日子么,通過連接信息手動(dòng)連接數(shù)據(jù)并獲取表結(jié)構(gòu)字段,且返回該表的數(shù)據(jù)。
接下來,廢話不多說,我就給大家演示一下,具體如何實(shí)現(xiàn)?
二、正文??
接下來我還是以接口的請(qǐng)求方式,給大家簡單演示一下,具體場(chǎng)景,你們自己依據(jù)情況而定,我就給大家展示下我手動(dòng)獲取本地庫指定表的表結(jié)構(gòu)字段吧。
定義一個(gè)Controller接口
/** * 獲取指定表的字段集合 */ @PostMapping("/get-db-columns") @ApiOperation(value = "獲取指定表的字段集合",notes = "獲取指定表的字段集合") public ResultResponse<List<String>> getDbColumns(@RequestBody FindDbColumnModel model){ return new ResultResponse<>(dbService.getDbColumns(model)); }
如下是上接口所涉及的入?yún)Ⅲw:
package com.example.demo.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author luoYong * @version 1.0 * @date 2022/8/30 16:02 */ @Data @ApiModel(value = "獲取指定表的字段集合", description = "獲取指定表的字段集合") public class FindDbColumnModel { @ApiModelProperty(value = "數(shù)據(jù)庫url") private String dbUrl; @ApiModelProperty(value = "數(shù)據(jù)庫連接用戶名") private String userName; @ApiModelProperty(value = "數(shù)據(jù)庫連接密碼") private String passWord; @ApiModelProperty(value = "數(shù)據(jù)庫驅(qū)動(dòng)") private String driverClass; @ApiModelProperty(value = "指定查詢表名") private String tableName; }
定義一個(gè)獲取表結(jié)構(gòu)的接口
/** * 獲取指定表的字段集合 */ List<String> getDbColumns(FindDbColumnModel model);
實(shí)現(xiàn)獲取表結(jié)構(gòu)的接口
/** * 獲取指定表的字段集合 */ @Override public List<String> getDbColumns(FindDbColumnModel model) { //與數(shù)據(jù)庫取的連接 Connection conn = this.getConn(model.getDbUrl(), model.getUserName(), model.getPassWord(), model.getDriverClass()); //拼接分頁sql(以mysql為例) String sql = "select * from " + model.getTableName(); //申明PreparedStatement PreparedStatement pst = null; try { //執(zhí)行SQL語句 pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(sql); ResultSetMetaData metaData = rs.getMetaData(); //定義一個(gè)存放所有列名的集合 List<String> columnArr = new ArrayList<>(); //獲取表字段名 for (int i = 1; i <= metaData.getColumnCount(); i++) { //循環(huán)獲取,再儲(chǔ)存到集合中。 String columnName = metaData.getColumnName(i); columnArr.add(columnName); } return columnArr; } catch (SQLException e) { e.printStackTrace(); } return new ArrayList<>(); } /** * 獲取指定表的字段集合 */ @Override public List<String> getDbColumns(FindDbColumnModel model) { //與數(shù)據(jù)庫取的連接 Connection conn = this.getConn(model.getDbUrl(), model.getUserName(), model.getPassWord(), model.getDriverClass()); //拼接分頁sql(以mysql為例) String sql = "select * from " + model.getTableName(); //申明PreparedStatement PreparedStatement pst = null; try { //執(zhí)行SQL語句 pst = conn.prepareStatement(sql); ResultSet rs = pst.executeQuery(sql); ResultSetMetaData metaData = rs.getMetaData(); //定義一個(gè)存放所有列名的集合 List<String> columnArr = new ArrayList<>(); //獲取表字段名 for (int i = 1; i <= metaData.getColumnCount(); i++) { //循環(huán)獲取,再儲(chǔ)存到集合中。 String columnName = metaData.getColumnName(i); columnArr.add(columnName); } return columnArr; } catch (SQLException e) { e.printStackTrace(); } return new ArrayList<>(); }
如下是手動(dòng)連接庫獲取Connection對(duì)象的封裝方法。
/** * 手動(dòng)連接數(shù)據(jù)庫 * * @param url * @param userName * @param passWord * @param driverClass */ public Connection getConn(String url, String userName, String passWord, String driverClass) { //聲明數(shù)據(jù)庫連接對(duì)象 Connection conn = null; try { //加載驅(qū)動(dòng) Class.forName(driverClass); //初始化數(shù)據(jù)庫連接,獲取連接對(duì)象 conn = DriverManager.getConnection(url, userName, passWord); } catch (Exception e) { e.printStackTrace(); System.out.println("獲得數(shù)據(jù)庫連接出錯(cuò)"); } return conn; }
接口測(cè)試
接下來既然我們已經(jīng)實(shí)現(xiàn)了接口,那我們就來進(jìn)行測(cè)試,還是老樣子,直接通過在線接口文檔swagger進(jìn)行測(cè)試,集成swagger文檔我前期文章已經(jīng)講過了,這個(gè)你們自己去看。
參數(shù)體給與正確的,我就以本地庫為例。
具體請(qǐng)看如下截圖,很顯然,是正常獲取到了該【grade】表的表結(jié)構(gòu)信息。
附上請(qǐng)求樣例:
{ "dbUrl": "jdbc:mysql://127.0.0.1:3306/springboot_db?serverTimezone=GMT%2B8", "userName": "root", "passWord": "123456", "driverClass": "com.mysql.cj.jdbc.Driver", "tableName": "grade" }
到此這篇關(guān)于Springboot如何手動(dòng)連接庫并獲取指定表結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)Springboot指定表結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JSONObject.toJSONString 過濾掉值為空的key
這篇文章主要介紹了使用JSONObject.toJSONString 過濾掉值為空的key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ進(jìn)階事務(wù)消息原理詳解
這篇文章主要介紹了為大家介紹了微服務(wù)架構(gòu)中RocketMQ進(jìn)階層面事務(wù)消息的原理詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類的解決方案
本文主要介紹了maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解
這篇文章主要介紹了Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09解決J2EE-session在瀏覽器關(guān)閉后失效問題
最近做項(xiàng)目使用的是Spring+SpringMVC+Mybatis框架,maven管理目錄的javaweb端系統(tǒng),對(duì)于session的一些問題,在此小編給大家分享到腳本之家平臺(tái),需要的朋友參考下吧2018-01-01Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
轉(zhuǎn)發(fā)和重定向都是常用的頁面跳轉(zhuǎn)方式,但在實(shí)現(xiàn)上有一些區(qū)別,本文主要介紹了Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11mybatis打印的sql日志不寫入到log文件的問題及解決
這篇文章主要介紹了mybatis打印的sql日志不寫入到log文件的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別
本文主要介紹了SpringBoot+OCR 實(shí)現(xiàn)圖片文字識(shí)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12使用SpringBoot Actuator監(jiān)控應(yīng)用示例
Actuator是Spring Boot提供的對(duì)應(yīng)用系統(tǒng)的自省和監(jiān)控的集成功能,可以對(duì)應(yīng)用系統(tǒng)進(jìn)行配置查看、相關(guān)功能統(tǒng)計(jì)等。這篇文章主要介紹了使用SpringBoot Actuator監(jiān)控應(yīng),有興趣的可以了解一下2018-05-05