亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Java實(shí)現(xiàn)在線SQL編程(完整版)

                Java實(shí)現(xiàn)在線SQL編程(完整版)

                前言:

                由于前段時(shí)間,項(xiàng)目組長(zhǎng)分配的任務(wù)是要完成一個(gè)在線編寫 SQL 并要實(shí)現(xiàn)查詢功能的需求,最終需要將查詢到的數(shù)據(jù)以 JSON 格式顯示到響應(yīng)數(shù)據(jù)的區(qū)域,以供操作者進(jìn)行查看,一開始拿到需求時(shí)想著直接使用 Mybatis 進(jìn)行操作不就可以了,完全沒必要大費(fèi)周章,因?yàn)樵?MyBatis 中有個(gè)拼接 SQL 的語(yǔ)法,可以使用 ${sql} 來進(jìn)行執(zhí)行輸入的 SQL 語(yǔ)句,但是實(shí)際操作起來并不是想象中的那么簡(jiǎn)單,因?yàn)槭褂?MyBatis 會(huì)將數(shù)據(jù)源固定在本項(xiàng)目所使用的數(shù)據(jù)庫(kù),而不可以進(jìn)行數(shù)據(jù)源之間的切換,無法進(jìn)行其他數(shù)據(jù)源中表的查詢操作 :x:,所以在實(shí)現(xiàn)過程也是相當(dāng)艱難曲折…

                難度分析

                在線執(zhí)行 SQL 語(yǔ)句的查詢主要的難點(diǎn)分為以下幾點(diǎn):其一則是對(duì) JDBC 的部分的 API 理解的不夠透徹,導(dǎo)致在實(shí)現(xiàn)某些工鞥是并不是想象中的順利;其二在于對(duì)于查詢部分屬性的SQL語(yǔ)句該如何使用 Java 進(jìn)行實(shí)現(xiàn),是將輸入的字符串進(jìn)行分割再拼接還是使用直接整條語(yǔ)句的查詢操作;其三則是用戶可以動(dòng)態(tài)的切換數(shù)據(jù)源,并且對(duì)相應(yīng)數(shù)據(jù)源下的表進(jìn)行查詢操作,如果使用 Mybatis 進(jìn)行 SQL 的查詢操作則無法進(jìn)行數(shù)據(jù)源的切換,只能查詢所在微服務(wù)項(xiàng)目所連接的數(shù)據(jù)庫(kù)進(jìn)行查詢,否則無法進(jìn)行相應(yīng)的操作,即會(huì)出現(xiàn)該數(shù)據(jù)庫(kù)下并不存在所查詢的某張數(shù)據(jù)庫(kù)表的錯(cuò)誤信息 :x:

                項(xiàng)目回顧(在線編寫SQL查詢)

                需求分析

                使用者在頁(yè)面可以選擇切換需要操作的數(shù)據(jù)源,并在編輯區(qū)域內(nèi)輸入 SQL 語(yǔ)句進(jìn)行查詢,查詢語(yǔ)句可以是全表查詢表中所有字段或者根據(jù)所需查詢指定某幾列字段對(duì)應(yīng)的值,點(diǎn)擊查詢之后即可在響應(yīng)數(shù)據(jù)之后以 JSON 的格式將查詢到的每一條數(shù)據(jù)封裝一個(gè)對(duì)象最后顯示到響應(yīng)數(shù)據(jù)區(qū)域以供操作者進(jìn)行觀看以達(dá)到可視化工具的效果。

                項(xiàng)目搭建

                ① 引入項(xiàng)目所需要的相關(guān)Maven依賴

                org.springframework.boot spring-boot-starter-web commons-lang commons-lang 2.6 javax.servlet servlet-api 2.5 provided mysql mysql-connector-java 8.0.28

                ② 編寫配置文件

                server: port: 8080spring: datasource: username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/data_source?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

                ③ 創(chuàng)建Controller前端控制器

                @PostMapping(“/dynamic-query”)@ApiOperation(value = “動(dòng)態(tài)執(zhí)行SQL”)public Result dynamicQuery(@RequestBody DynamicQuery dynamicQuery){ List res = null;BladeVisualDb visualDb = bladeVisualDbService.getOne(new QueryWrapper().eq(“id”, dynamicQuery.getId()));List result = ConnectBySql.connAndExecSql(visualDb.getUrl(), visualDb.getDriverClass(), visualDb.getUsername(), visualDb.getPassword(),dynamicQuery.getSql());return Result.ok(result);}

                ④ 探究 JDBC中ResultSet中的方法

                • next()

                解釋:將光標(biāo)從其當(dāng)前位置向前移動(dòng)一行。 ResultSet 游標(biāo)最初位于第一行之前;第一次調(diào)用 next 方法使第一行成為當(dāng)前行;第二次調(diào)用使第二行成為當(dāng)前行,依此類推。實(shí)則對(duì)查詢到的數(shù)據(jù)進(jìn)行遍歷操作

                • getString(String columnLabel)

                解釋:根據(jù)表中對(duì)應(yīng)的列名稱來查詢到該列對(duì)應(yīng)到的數(shù)據(jù)

                • getMetaData()

                解釋:獲取某張表中列的數(shù)量、類型和列名稱

                • findColumn(String columnLabel)

                解釋:返回某個(gè)列的索引值即下標(biāo)

                ⑤ 獲取所有的數(shù)據(jù)源

                因?yàn)槭褂谜呤强梢詣?dòng)態(tài)的選擇數(shù)據(jù)源從而來對(duì)表中的數(shù)據(jù)進(jìn)行相關(guān)操作,所以首先要查詢出可供連接的數(shù)據(jù)源

                /** * 下拉數(shù)據(jù)源列表 * @return */@ApiOperation(value = “下拉列表”)@GetMapping(“/db-list”)public Result list(){ List bladeVisualDbs = bladeVisualDbService.list();return Result.ok(bladeVisualDbs);}

                ⑥ 實(shí)現(xiàn)執(zhí)行查詢邏輯

                首先執(zhí)行查詢有兩種方式:所有字段的全查詢即 select * from xx 或者 查詢指定字段即 select xx from xx

                • 所有字段的全查詢即 select * from xx

                在進(jìn)行所有字段的查詢時(shí),由于無法得知需要查詢的表中有什么字段,所以首先需要對(duì)輸入的 SQL 字符串進(jìn)行判斷是否是全字段查詢,然后即可獲取查詢表中的所有字段,然后再一一的進(jìn)行查詢出字段對(duì)應(yīng)的值即可,此操作也是需要對(duì)輸入 SQL 字符串進(jìn)行分割的,拿出所有插敘的表名即可。

                ResultSet resultSet = stmt.executeQuery(sql);//如果輸入的SQL屬于select * 操作if (sql.contains(“*”)){ List list = new ArrayList(); //獲取SQL中需要查詢的表的結(jié)構(gòu) ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i {}”,metaData.getColumnName(i)); //獲取表中的所有列 list.add(metaData.getColumnName(i)); } while (resultSet.next()){ HashMap hashMap = new HashMap(); for (String index : list) { //根據(jù)列名稱查詢出該列對(duì)應(yīng)的數(shù)據(jù) String rs = resultSet.getString(index); //將其放入列和值存放HashMap中 hashMap.put(index,rs); //將多個(gè)HashMap合并成一個(gè)Map hashMap.putAll(hashMap); } res.add(hashMap); }}

                • 查詢指定字段即 select xx from xx

                在使用 JDBC 進(jìn)行指定字段查詢時(shí)需要對(duì)輸入的 SQL 字符串進(jìn)行分割后將所需要查詢到的字段再使用 JDBC 中的 getString(String columnName) 進(jìn)行查詢字段對(duì)應(yīng)的值

                /** * 將SQL語(yǔ)句進(jìn)行拆分 * @param sql * @return */ @NotNull private static List getString(String sql) { List list = new ArrayList(); String str = sql.substring(0, sql.indexOf(“from”)); String realSql = str.replace(“select”, “”).trim(); if (realSql.contains(“,”)){ String[] split = realSql.split(“,”); for (String s : split) { list.add(s); } }else { list.add(realSql); } return list; }

                隨后將分割完成的 SQL 存放到 List 集合中再進(jìn)行查詢操作

                ResultSet resultSet = stmt.executeQuery(sql);while (resultSet.next()){ HashMap hashMap = new HashMap(); List str = getString(sql); for (String index : str) { String rs = resultSet.getString(index); hashMap.put(index,rs); hashMap.putAll(hashMap); } res.add(hashMap);}

                經(jīng)過對(duì)操作者輸入的 SQL 即可完成對(duì)表的查詢操作,由于所要實(shí)現(xiàn)的是可動(dòng)態(tài)切換數(shù)據(jù)源從而進(jìn)行相關(guān)的查詢操作,所以在此操作邏輯中首先需要連接數(shù)據(jù)庫(kù),后再對(duì)輸入的 SQL 進(jìn)行分割查詢等操作。合并后的完整代碼:

                /** * 連接數(shù)據(jù)庫(kù)并根據(jù)輸入的SQL語(yǔ)句查詢數(shù)據(jù) * @param url * @param driverClass * @param username * @param password * @param sql * @return */ public static List connAndExecSql(String url, String driverClass, String username, String password, String sql) { Boolean result = false; Connection conn = null; Statement stmt = null; List res = new ArrayList(); try { Class.forName(driverClass); System.out.println(“————連接數(shù)據(jù)庫(kù)———–“); conn = DriverManager.getConnection(url,username,password); stmt = conn.createStatement(); ResultSet resultSet = stmt.executeQuery(sql); //如果輸入的SQL屬于select * 操作 if (sql.contains(“*”)){ List list = new ArrayList(); //獲取SQL中需要查詢的表的結(jié)構(gòu) ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i {}”,metaData.getColumnName(i)); //獲取表中的所有列 list.add(metaData.getColumnName(i)); } while (resultSet.next()){ HashMap hashMap = new HashMap(); for (String index : list) { //根據(jù)列名稱查詢出該列對(duì)應(yīng)的數(shù)據(jù) String rs = resultSet.getString(index); //將其放入列和值存放HashMap中 hashMap.put(index,rs); //將多個(gè)HashMap合并成一個(gè)Map hashMap.putAll(hashMap); } res.add(hashMap); } }else { while (resultSet.next()){ HashMap hashMap = new HashMap(); List str = getString(sql); for (String index : str) { String rs = resultSet.getString(index); hashMap.put(index,rs); hashMap.putAll(hashMap); } res.add(hashMap); } } //完成連接數(shù)據(jù)庫(kù) stmt.close(); conn.close(); System.out.println(“查詢連接結(jié)束”); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (SQLException e){ e.printStackTrace(); } return res; } /** * 將SQL語(yǔ)句進(jìn)行拆分 * @param sql * @return */ @NotNull private static List getString(String sql) { List list = new ArrayList(); String str = sql.substring(0, sql.indexOf(“from”)); String realSql = str.replace(“select”, “”).trim(); if (realSql.contains(“,”)){ String[] split = realSql.split(“,”); for (String s : split) { list.add(s); } }else { list.add(realSql); } return list; }

                ⑦ Vue前端引入monaco-editor組件進(jìn)行編寫SQL語(yǔ)句

                項(xiàng)目總結(jié)

                在使用 JDBC 來進(jìn)行數(shù)據(jù)庫(kù)的操作,在使用時(shí)由于對(duì)其方法并不是全部了解,所以需要邊看源碼邊改善功能,因此遇到問題時(shí)才會(huì)感覺到腦中知識(shí)儲(chǔ)備的不足,目前只是實(shí)現(xiàn)了查詢操作,還未完善 CRUD 全部過程的操作。

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月23日 15:12
                下一篇 2022年6月23日 15:13

                相關(guān)推薦

                • 30個(gè)無加盟費(fèi)的項(xiàng)目(茶顏悅色奶茶店加盟費(fèi)多少)

                  茶顏悅色又爆了,8月18日,茶顏悅色南京門店正式開業(yè),開張不到半小時(shí),門店就人滿為患,消費(fèi)者的購(gòu)買熱情十分高漲,而由于人流量過大造成擁堵,茶顏悅色也不得不暫停營(yíng)業(yè)。 當(dāng)然,這里面排…

                  2022年11月27日
                • 凈利潤(rùn)率越高越好嗎(凈利潤(rùn)率多少合適)

                  一、持續(xù)增收不增利,平均凈利潤(rùn)率首次跌入個(gè)位數(shù) 2021年,增收不增利依舊是行業(yè)主流。具體來看,大部分企業(yè)營(yíng)業(yè)收入呈增長(zhǎng)態(tài)勢(shì),E50企業(yè)平均同比增速達(dá)到17.3%,但是利潤(rùn)增速則明…

                  2022年11月26日
                • 規(guī)范透明促PPP高質(zhì)量發(fā)展——16萬億元大市場(chǎng)迎來新規(guī)

                  近日,財(cái)政部印發(fā)《關(guān)于進(jìn)一步推動(dòng)政府和社會(huì)資本合作(PPP)規(guī)范發(fā)展、陽(yáng)光運(yùn)行的通知》,從做好項(xiàng)目前期論證、推動(dòng)項(xiàng)目規(guī)范運(yùn)作、嚴(yán)防隱性債務(wù)風(fēng)險(xiǎn)、保障項(xiàng)目陽(yáng)光運(yùn)行四個(gè)方面進(jìn)一步規(guī)范P…

                  2022年11月25日
                • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

                  CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來定…

                  2022年11月25日
                • 推薦3種白手起家的賺錢項(xiàng)目(白手起家賺錢項(xiàng)目有哪些)

                  如今社會(huì)壓力非常的大,家有老少要養(yǎng)活,這些都加速了窮人想要?jiǎng)?chuàng)業(yè)的欲望,但是創(chuàng)業(yè)路總是那么的艱難,資金就是創(chuàng)業(yè)的重頭戲,所以選擇一個(gè)低成本又賺錢的項(xiàng)目是大多數(shù)人最期望的了,那么有哪些…

                  2022年11月25日
                • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

                  如今抖音這個(gè)短視頻的變現(xiàn)能力越來越突顯了,尤其是在平臺(tái)上開通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來越多的普通人加入到其中了。不過直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

                  2022年11月24日
                • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

                  直播帶貨無論是對(duì)于商家來說還是主播收益都是非??捎^的,所以不少平臺(tái)都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)硖詫氈辈ラ_通后帶…

                  2022年11月24日
                • 閑魚運(yùn)營(yíng)的4大技巧解析(閑魚運(yùn)營(yíng)怎么做)

                  熟悉我又來了,上一次寫的文章是爆出風(fēng)水項(xiàng)目的潛規(guī)則,但那個(gè)項(xiàng)目已經(jīng)涼涼了。 這一次我是要教一些小白,你們第一次做互聯(lián)網(wǎng)的建議做的項(xiàng)目之一,這個(gè)項(xiàng)目就是閑魚賣二手物品賺差價(jià)了!!! …

                  2022年11月24日
                • 明查|美國(guó)新冠后遺癥患者中有16%癥狀嚴(yán)重以致無法工作?

                  點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺(tái) 速覽 – 網(wǎng)傳數(shù)據(jù)比例無權(quán)威信源佐證,該比例有可能是結(jié)合了美國(guó)疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

                  2022年11月24日
                • 2023年農(nóng)村創(chuàng)業(yè)最好的種植項(xiàng)目有哪些(2023年農(nóng)村宅基地)

                  隨著2023年時(shí)間的臨近,有關(guān)農(nóng)村創(chuàng)業(yè)大家也都十分關(guān)注。2023年農(nóng)村創(chuàng)業(yè)最好的種植項(xiàng)目有哪些?新的一年農(nóng)村創(chuàng)業(yè)到底做什么最能賺錢呢?今天小編整理了一些非常具有發(fā)展?jié)摿Φ霓r(nóng)村種植業(yè)…

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息