Java后端開發(fā)時的一些實用技巧
本篇文章分別在2022年6月21日、2022年6月30日、2022年7月4日,被分成三篇學(xué)習(xí)摘要筆記,發(fā)表于某平臺。主要是在2022年5月份至7月份開發(fā)工作過程中學(xué)習(xí)到的新知識和技巧,現(xiàn)轉(zhuǎn)載至B站。
Linux-使用SSH從服務(wù)器下載或上傳文件
利用scp傳輸文件,實現(xiàn)從遠(yuǎn)程服務(wù)器下載文件或上傳文件到服務(wù)器上,本地使用unix(linux/mac)命令行完成操作?
1. 從遠(yuǎn)程服務(wù)器下載文件到本地
下載文件到本地的桌面
下載文件夾到本機(jī)?
下載文件夾到本地的桌面
2. 從本地上傳到服務(wù)器上

JDBC-ResultSet對象
set.next()
可以配合while()循環(huán)語句遍歷數(shù)據(jù)庫返回值內(nèi)容。next()方法支持?jǐn)?shù)據(jù)指針的下移。
set.getString(int or string)
注意列是從左至右編號的,并且從列 1 開始。同時,用作 getXXX 方法的輸入的列名不區(qū)分大小寫。
ResultSet.getMetaData()
關(guān)于 ResultSet 中列的信息,可通過調(diào)用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 對象將給出其 ResultSet 對象各列的編號、類型和屬性。
如果列名已知,但不知其索引,則可用方法 findColumn 得到其列號。
ResultSet指針
NULL結(jié)果值
使用 ResultSet.wasNull 方法檢查該次讀取是否返回 JDBC NULL。
當(dāng)使用 ResultSet.getXXX 方法讀取 JDBC NULL 時,方法 wasNull 將返回下列值之一:
Java null 值:對于返回 Java 對象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。
零值:對于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。
false 值:對于 getBoolean。
可選結(jié)果集或多結(jié)果集
通常使用?executeQuery(它返回單個 ResultSet)或?executeUpdate(它可用于任何數(shù)據(jù)庫修改語句,并返回更新行數(shù))可執(zhí)行 SQL 語句。
但有些情況下,應(yīng)用程序在執(zhí)行語句之前不知道該語句是否返回結(jié)果集。此外,有些已存儲過程可能返回幾個不同的結(jié)果集和/或更新計數(shù)。
為了適應(yīng)這些情況,JDBC 提供了一種機(jī)制,允許應(yīng)用程序執(zhí)行語句,然后處理由結(jié)果集和更新計數(shù)組成的任意集合。這種機(jī)制的原理是首先調(diào)用一個完全通用的execute?方法,然后調(diào)用另外三個方法,getResultSet、getUpdateCount?和getMoreResults。這些方法允許應(yīng)用程序一次一個地研究語句結(jié)果,并確定給定結(jié)果是 ResultSet 還是更新計數(shù)。
用戶不必關(guān)閉 ResultSet;當(dāng)產(chǎn)生它的 Statement 關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個結(jié)果時,該 ResultSet 將被 Statement 自動關(guān)閉。
getRow()用法
需要注意的一點是,getRow()并不是獲取總行數(shù),而是返回當(dāng)前指針?biāo)诤瘮?shù)。
1. 判斷ResultSet行數(shù)是否為0
ResultSet表示select語句的查詢結(jié)果集。ResultSet對象具有指向其當(dāng)前數(shù)據(jù)行的指針,最初,指針被置于第一行記錄之前,通過next()方法可以將指針移動到下一行記錄。next()方法在ResultSet對象沒有一行記錄時返回false,因此可以在while循環(huán)中使用它來遍歷結(jié)果集,也可以利用該方法判斷結(jié)果集是否為空。
2. 獲取行數(shù)

Java-想要在psvm中調(diào)用本類里的方法
在psvm中實例化自身即可。
Java-FileWriter對象
文件寫入對象。
Java-Stream流的常用方法count
Linux-javac使用技巧
問:javac腳本的時候,發(fā)生未找到引用的類、未找到符號的錯誤,但是明明import了。
解決:可能是因為要引用類和本類不在一個包里,并且你也是在本目錄下執(zhí)行的javac指令,編譯時系統(tǒng)沒有檢測到此目錄之外的java類,即使你import它了。你需要退出路徑至該項目的根目錄下執(zhí)行javac指令。
Linux-nohup指令
使用nohup可以將腳本掛在后臺運(yùn)行(不能存在中文字符),&后綴參數(shù)也可以實現(xiàn)同樣的效果。

Java-獲取當(dāng)前時間
方法一
方法二

Java-使用線程池來處理大數(shù)據(jù)/多任務(wù)
Java-讀取文件(以行的形式)
Java-寫入文件
JDBC-通過ResultSet了解數(shù)據(jù)庫是否存在指定表
JDBC-獲取表數(shù)據(jù)量
JDBC-獲取表字段數(shù)
JDBC-Statement的各個execute類型的區(qū)別
ResultSet executeQuery(String sql); 執(zhí)行SQL查詢,并返回ResultSet 對象。
int executeUpdate(String sql); 可執(zhí)行增,刪,改,返回執(zhí)行受到影響的行數(shù)。
boolean execute(String sql); 可執(zhí)行任何SQL語句,返回一個布爾值,表示是否返回ResultSet 。
execute是executeQuery和executeUpdate的綜合.

AtomicInteger
原子操作在單個任務(wù)單元中執(zhí)行,而不受其他操作的干擾。 在多線程環(huán)境中,原子操作是必需的,以避免數(shù)據(jù)不一致。
printStackTrace()
通過try catch異常幫助程序員了解實際問題發(fā)生的位置。深層次的輸出異常調(diào)用,作用就是把原始錯誤信息打印出來。
ExecutorService()
接口位于 java.util.concurrent 包中。該接口代表了一種異步執(zhí)行機(jī)制,可以在后臺并發(fā)執(zhí)行多個任務(wù)。執(zhí)行程序服務(wù)框架有助于在應(yīng)用程序中創(chuàng)建和管理線程。執(zhí)行器框架執(zhí)行以下任務(wù)。
線程創(chuàng)建: Executor服務(wù)提供了很多線程創(chuàng)建的方法。這有助于并發(fā)運(yùn)行應(yīng)用程序。
線程管理: Executor 服務(wù)也有助于管理線程生命周期。在提交任務(wù)執(zhí)行之前,我們不必?fù)?dān)心線程是處于活動狀態(tài)、忙碌狀態(tài)還是死狀態(tài)。
任務(wù)提交與執(zhí)行: Executor 框架還提供了在線程池中提交任務(wù)的方法。它還提供了決定線程是否執(zhí)行的權(quán)力。
額外知識點:newFixedThreadPool() 線程池
參考:https://blog.csdn.net/allway2/article/details/118793216
getColumnCount()
(SQLServerResultSetMetaData)列計數(shù) 返回int
getColumnName(int)
獲取列名 返回string
str.substring(int,int)
截取字符串

split()?
根據(jù)匹配給定的正則表達(dá)式來拆分字符串。?
. 、 $、 | 和 * 等轉(zhuǎn)義字符,必須得加 \。
注意:多個分隔符,可以用 | 作為連字符。
語法
參數(shù)
regex -- 正則表達(dá)式分隔符。
limit -- 分割的份數(shù)。
返回值
字符串?dāng)?shù)組。
PreparedStatement.setString(0,1)
例子:
concat ()
用于連接兩個或多個數(shù)組。
ASC和DESC
select … ORDER BY xxx ASC(升序,默認(rèn)就是,不需要寫)/DESC(降序)
額外知識點:ExpireDate是失效時間的意思。

ResultSet
數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet是數(shù)據(jù)中查詢結(jié)果返回的一種對象。
獲取字段的值
ResultSet對象常用的一些方法
將光標(biāo)移動到此 ResultSet對象中的給定行號。
將光標(biāo)移動到這個 ResultSet對象的末尾,就在最后一行之后。
將光標(biāo)移動到這個 ResultSet對象的正面,就在第一行之前。
取消對此 ResultSet對象中當(dāng)前行的更新。
清除此 ResultSet對象上報告的所有警告。
ResultSet釋放此 ResultSet對象的數(shù)據(jù)庫和JDBC資源,而不是等待其自動關(guān)閉時發(fā)生。
從此 ResultSet對象和底層數(shù)據(jù)庫中刪除當(dāng)前行。
將給定的 ResultSet列標(biāo)簽映射到其 ResultSet列索引。
將光標(biāo)移動到此 ResultSet對象中的第一行。
將該 ResultSet對象的當(dāng)前行中指定列的值作為Java編程語言中的 Array對象檢索。
將此 ResultSet對象的當(dāng)前行中指定列的值作為Java編程語言中的 Array對象檢索
ResultSetMetaData
可以根據(jù) ResultSet.getMetaData() 方法獲得 ResultSetMetaData
通過該對象可以得到表的結(jié)構(gòu),包括 列名,列的個數(shù),列數(shù)據(jù)類型
獲取列名
獲取列個數(shù)
獲得列類型
應(yīng)用場景
獲取每個列的值和對應(yīng)的列名
shell語法初識
定義以開頭:#!/bin/bash
#!用來聲明腳本由什么shell解釋,否則使用默認(rèn)shell
單個"#"號代表注釋當(dāng)前行
加上可執(zhí)行權(quán)限
三種執(zhí)行方式的不同點?(./xxx.sh bash xxx.sh . xxx.sh)
./xxx.sh :先按照 文件中#!指定的解析器解析
如果#!指定指定的解析器不存在 才會使用系統(tǒng)默認(rèn)的解析器
bash xxx.sh:指明先用bash解析器解析
如果bash不存在 才會使用默認(rèn)解析器
. xxx.sh 直接使用默認(rèn)解析器解析

定義變量
引用變量
清除變量
read從鍵盤獲取值
在一行上顯示和添加提示 需要加上-p


readonly只讀變量
echo內(nèi)的雙引號和單引號
雙引號:可以解析變量的值
單引號:不能解析變量的值
想在PATH變量中 追加一個路徑寫法
export PATH=$PATH:/需要添加的路徑
預(yù)設(shè)變量
shell直接提供無需定義的變量

案例


控制語句
格式一:
格式二:
條件測試
test命令:用于測試字符串、文件狀態(tài)和數(shù)字 test命令有兩種格式: test condition 或[ condition ](結(jié)果:1:否;0:是) 使用方括號時,要注意在條件兩邊加上空格。
文件測試

字符串測試

數(shù)值測試


符合語句測試



單百分號%和雙百分號%%的作用
使用百分號將變量的內(nèi)容從變量的后面刪除,并從變量的尾部刪除。
不同的是,一個%號表示從尾部最近的匹配刪除,兩個%%從尾部最遠(yuǎn)的匹配刪除。同時支持使用通配符。
比如:
先聲明一個變量:
使用一個百分號截取尾部bb
結(jié)果:
可以看到是截取了最后面的bbccdd。
使用兩個百分號截取尾部bb
結(jié)果:
可以看到是截取的最前面的匹配的到的bb。

expr指令全解
expr命令可以實現(xiàn)數(shù)值運(yùn)算、數(shù)值或字符串比較、字符串匹配、字符串提取、字符串長度計算等功能。它還具有幾個特殊功能,判斷變量或參數(shù)是否為整數(shù)、是否為空、是否為0等。
shell的時間參數(shù)含義
shell 中 “<”“>“ 與 “>>“ 的區(qū)別
“ > ” 在shell中代表的意義
“ > ” ,我們常用的用法是用來記錄 log 日志,它也有其他的用法,如:
這是將 "hello world"寫入到 hello.log 日志中,但是如果hello.log中有內(nèi)容的話,它會將其清空再重新寫入,這個用法有點像寫入文件時用的 "w" 用法。
“ >> ” 在shell中代表的意義
“ >> ”, 我們也是常用來記錄 log 日志,但是它與 " > "還是有區(qū)別的,下面就來講講區(qū)別吧!
如:
這是將 hello world!寫入到hello.log中,但是沒有清空hello.log中原有的內(nèi)容,而是追加到hello.log的末尾,這跟文件寫入的 " a+ "一樣。
“<”在shell中代表的意義
從文件中讀取內(nèi)容,然后作為輸入。