溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java的技術(shù)知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-12-02 09:58:40 來(lái)源:億速云 閱讀:127 作者:柒染 欄目:編程語(yǔ)言

本篇文章為大家展示了Java的技術(shù)知識(shí)點(diǎn)有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

數(shù)據(jù)庫(kù)篇

JDBC連接數(shù)據(jù)庫(kù)步驟(以MYSQL為例)

1、加載JDBC驅(qū)動(dòng)程序:   

通過(guò)Class類的forName方法實(shí)現(xiàn),并將驅(qū)動(dòng)地址放進(jìn)去

成功加載后,會(huì)將Driver類的實(shí)例注冊(cè)到DriverManager類中。   

2、提供JDBC連接的URL 、創(chuàng)建數(shù)據(jù)庫(kù)的連接   

?要連接數(shù)據(jù)庫(kù),需要向java.sql.DriverManager請(qǐng)求并獲得Connection對(duì)象,   

該對(duì)象就代表一個(gè)數(shù)據(jù)庫(kù)的連接。

?使用DriverManager的getConnectin()方法傳入指定的欲連接的數(shù)據(jù)庫(kù)的路徑、數(shù) 據(jù)庫(kù)的用戶名和密碼。

     Connection con=DriverManager.getConnection(url , username , password);

&&&:"jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8”;  

3、創(chuàng)建一個(gè)Statement   

      ?要執(zhí)行SQL語(yǔ)句,必須獲得java.sql.Statement實(shí)例

?執(zhí)行靜態(tài)SQL語(yǔ)句。通常通過(guò)Statement實(shí)例實(shí)現(xiàn)。   

?執(zhí)行動(dòng)態(tài)SQL語(yǔ)句。通常通過(guò)PreparedStatement實(shí)例實(shí)現(xiàn)。   

        String sql = “”;

        Statement st = con.createStatement() ;   

        PreparedStatement pst = con.prepareStatement(sql) ;

4、執(zhí)行SQL語(yǔ)句   

Statement接口提供了executeQuery、executeUpdate、execute三種方法  

executeQuery:執(zhí)行select語(yǔ)句,返回ResultSet結(jié)果集

ResultSet rst = pst.executeQuery();  

?  executeUpdate:執(zhí)行insert、update、delete語(yǔ)句

   pst.executeUpdate();

5、關(guān)閉JDBC對(duì)象    

操作完成以后要把所有使用的JDBC對(duì)象全都關(guān)閉,以釋放JDBC資源。

數(shù)據(jù)庫(kù)連接池

數(shù)據(jù)庫(kù)連接池的優(yōu)點(diǎn)運(yùn)行原理:

在我們不使用數(shù)據(jù)庫(kù)連接池的時(shí)候,每次訪問(wèn)數(shù)據(jù)庫(kù)都需要?jiǎng)?chuàng)建連接,使用完成之后需要釋放關(guān)閉連接,而這樣是很耗費(fèi)資源的。當(dāng)我們使用數(shù)據(jù)庫(kù)連接池的時(shí)候,在tomcat啟動(dòng)的時(shí)候就創(chuàng)建了指定數(shù)量的連接,之后當(dāng)我們程序使用的時(shí)候就直接從連接池里面取,而不需要?jiǎng)?chuàng)建,同理,當(dāng)我們使用完的時(shí)候也不需要關(guān)閉連接,而是將連接返回到連接池中,供其他請(qǐng)求繼續(xù)使用。

DBCP:比較穩(wěn)定。

C3P0:性能比較高。

mysql的數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出

 配置:

首先找到mysql的安裝目錄,進(jìn)入bin目錄下復(fù)制路徑、將mysql的bin目錄粘貼在計(jì)算機(jī)環(huán)境變量的path中、授權(quán):、登錄mysq、將某張表的某個(gè)權(quán)限賦給某個(gè)用戶。

grant [select,insert,update,delete,create,drop] on [databaseName].[tableName]   to [userName]@[userIP] identified by [‘連接口令’]

grant select,insert,update,delete,create,drop on oa_ssh.user to root@[IP]  identified by 'root';

將所有庫(kù)的所有權(quán)限賦給某個(gè)用戶

grant all privileges on *.* to [userName]@[userIp] identified by [‘連接口令’]

grant all privileges on *.* to root@[IP] identified by ‘root';

將所有庫(kù)的所有權(quán)限賦給所有用戶

    grant all privileges on *.* to root@'%' identified by ‘root’;


    導(dǎo)出本地?cái)?shù)據(jù)庫(kù):

    mysqldump -u用戶名 -p 數(shù)據(jù)庫(kù)名 > 磁盤:導(dǎo)出的文件名(加后綴)

    遠(yuǎn)程導(dǎo)出數(shù)據(jù)庫(kù):

    mysqldump -h IP -u用戶名 -p 數(shù)據(jù)庫(kù)名稱 >導(dǎo)出的文件名(加后綴)

    遠(yuǎn)程導(dǎo)出數(shù)據(jù)表:

    mysqldump -u root -p -d --add-drop-table數(shù)據(jù)庫(kù)名稱 > 導(dǎo)出文件名(加后綴)

    導(dǎo)入數(shù)據(jù):

    mysql -u root -p登錄成功后 ==》 source 磁盤:導(dǎo)入的文件名(加后綴)

jdbc分段批量提交的時(shí)候出現(xiàn)異常怎么處理?

      通過(guò)Map來(lái)解決性能問(wèn)題。首先在分段批量提交的時(shí)候,我們不采用事務(wù),這樣就保證了合法的數(shù)據(jù)就自動(dòng)提交,不合法的數(shù)據(jù)就自己自動(dòng)進(jìn)行回滾,為了避免不合法數(shù)據(jù)影響后續(xù)合法數(shù)據(jù)的提交,采用定義業(yè)務(wù)規(guī)則字典表,實(shí)現(xiàn)對(duì)數(shù)據(jù)的驗(yàn)證,將不合法的數(shù)據(jù)記錄下來(lái),供用戶進(jìn)行后續(xù)處理,而合法的數(shù)據(jù)就全部提交。

jdbc批量處理數(shù)據(jù)

批量處理數(shù)據(jù):(代碼優(yōu)化:提高程序執(zhí)行性能)降低了java程序代碼(客戶端)和數(shù)據(jù)庫(kù)之間的 網(wǎng)絡(luò)通信的次數(shù)。在jdbc中進(jìn)行批量插入的核心API為 addBatch,executeBatch大數(shù)據(jù)量的插入問(wèn)題:(jdbc,hibernate,ibatis)

1.每次只插入一條和數(shù)據(jù)庫(kù)交互多次(很耗時(shí)間)

2.批量插入和數(shù)據(jù)庫(kù)只交互一次(內(nèi)存溢出)

3.分段批量插入(推薦)

    jdbc批量處理數(shù)據(jù)是通過(guò)PreparedStatement對(duì)象的 addbatch(), executebatch() clearbatch()進(jìn)行和數(shù)據(jù)庫(kù)的交互。通常我們使用分段批量處理的方式 這樣可以提高程序的性能 ,防止內(nèi)存溢出。

 1.每個(gè)sql語(yǔ)句都和數(shù)據(jù)庫(kù)交互一次(非批量操作)

 2.只和數(shù)據(jù)庫(kù)交互一次(批量操作)(內(nèi)存溢出)

 當(dāng)數(shù)據(jù)達(dá)到一定額度的時(shí)候就和數(shù)據(jù)庫(kù)進(jìn)行交互,分多次進(jìn)行(分段批量操作)

 (500或者1000)

pst.addBatch();

             if (i > 0 && i%1000 == 0) {

                                        pst.executeBatch();

                                        pst.clearBatch();

 }

Oracle分頁(yè)

select * from (select * from (select s.*,rownum rn from student s ) where rn<=5) where rn>0

如果你依然覺(jué)得有些茫然,不如加入我的Java架構(gòu)師之路:766529531 跟有多年Java開發(fā)經(jīng)驗(yàn)的資深工程師聊一聊。也可獲取免費(fèi)的視頻學(xué)習(xí)資料以及電子書學(xué)習(xí)資料喔!

Oracle的基本數(shù)據(jù)類型

  Oracle的基本數(shù)據(jù)類型(常用):

1、字符型

Char固定長(zhǎng)度字符串  占2000個(gè)字節(jié)

Varchar2可變長(zhǎng)度字符串 占4000個(gè)字節(jié)

Nvarchar2占2000個(gè)字符(最多能存2000個(gè)字母/中文)

2、大對(duì)象型(lob)

Blob:二進(jìn)制數(shù)據(jù) 最大長(zhǎng)度4G

Blob用于存一些圖片,視頻,文件。

比如:當(dāng)我們?cè)谶M(jìn)行文件上傳時(shí),我們一般把上傳的文件存在硬盤上,可以不占用 數(shù)據(jù)庫(kù),下載時(shí),如果項(xiàng)目遷移時(shí),文件也要跟著遷移。因此我們可以把用blob把它存在數(shù)據(jù)庫(kù)中。但這樣也增加了數(shù)據(jù)庫(kù)的負(fù)擔(dān)。

Clob:字符數(shù)據(jù) 最大長(zhǎng)度4G,可以存大字符串  varchar2和nvarchar2都具有一定的局限性,它們長(zhǎng)度有限,但數(shù)據(jù)庫(kù)中無(wú)論用varchar2或nvarchar2類型,還是用clob,在java端都使用String接收。

3、數(shù)值型

Integer整數(shù)類型,小的整數(shù)。

Float浮點(diǎn)數(shù)類型。

Real實(shí)數(shù)類型。

Number(p,s)包含小數(shù)位的數(shù)值類型。P表示精度,s表示小數(shù)后的位數(shù)。

                Eg: number(10,2)表示小數(shù)點(diǎn)之前可有8位數(shù)字,小數(shù)點(diǎn)后有2位。

4、日期類型

Date日期(日-月-年) DD-MM-YY(HH-MI-SS)

Timestamp跟date比 它可以精確到微秒。精確范圍0~9 默認(rèn)為6.

id、rowid、rownum的區(qū)別

rowid物理位置的唯一標(biāo)識(shí)。

而id是邏輯上的唯一標(biāo)識(shí),所以rowid查找速度要快于id,是目前最快的         

定位一條記錄的方式

rowid和rownum都是"偽數(shù)列"

所謂“偽數(shù)列”也就是默認(rèn)隱藏的一個(gè)數(shù)列。

rownum用于標(biāo)記結(jié)果集中結(jié)果順序的一個(gè)字段,

它的特點(diǎn)是按順序標(biāo)記,而且是連續(xù)的,

換句話說(shuō)就是只有有rownum=1的記錄,才可能有rownum=2的記錄。

rownum關(guān)鍵字只能和<或者<=直接關(guān)聯(lián)

如果是>或者=則需要給他起個(gè)別名

主鍵和唯一索引的區(qū)別? 

在創(chuàng)建主鍵的同時(shí)會(huì)生成對(duì)應(yīng)的唯一索引,主鍵在保證數(shù)據(jù)唯一性的同時(shí)不允許為空,而唯一可以有一個(gè)為空數(shù)據(jù)項(xiàng),一個(gè)表中只能有一個(gè)主鍵,但是一個(gè)主鍵可以有多個(gè)字段,一個(gè)表中可以有多個(gè)唯一索引。

Preparedstatement和statement的區(qū)別

     用Prepared statement進(jìn)行開發(fā)。Prepared statement是預(yù)編譯的,而statement不是,在每次執(zhí)行sql語(yǔ)句的增刪改時(shí),如果是一條數(shù)據(jù)兩者沒(méi)差距,但如果數(shù)據(jù)量大于1,那么每次執(zhí)行sql語(yǔ)句statement都要重新編譯一次,而Prepared statement不用,Prepared statement的運(yùn)行效率大于statement;從代碼的可維護(hù)性和可讀性來(lái)說(shuō),雖然用Prepared statement來(lái)代替statement會(huì)使代碼多出幾行,但這樣的代碼無(wú)論從可讀性還是可維護(hù)性來(lái)說(shuō),都比直接使用statement的代碼高很多檔次;最重要的一點(diǎn),從安全角度來(lái)說(shuō),使用Prepared statement可以大大提高程序的安全性,因?yàn)镻repared statement是用‘?’傳參,可以防止sql注入,具有安全性,而statement用的是‘+’字符串拼接,安全性較低。

數(shù)據(jù)庫(kù)三范式

       第一范式:數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值。

       第二范式:需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)

       第三范式:需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)

如果你依然覺(jué)得有些茫然,不如加入我的Java架構(gòu)師之路:766529531 跟有多年Java開發(fā)經(jīng)驗(yàn)的資深工程師聊一聊。也可獲取免費(fèi)的視頻學(xué)習(xí)資料以及電子書學(xué)習(xí)資料喔!

視圖概述

      視圖可以視為“虛擬表”或“存儲(chǔ)的查詢”

      創(chuàng)建視圖所依據(jù)的表稱為“基表”

      視圖的優(yōu)點(diǎn):

      提供了另外一種級(jí)別的表安全性:隱藏了一些關(guān)鍵的字段

      簡(jiǎn)化的用戶的SQL命令

      隔離基表結(jié)構(gòu)的改變

存儲(chǔ)過(guò)程概述

存儲(chǔ)過(guò)程(Stored Procedure)

  可以包含邏輯判斷的sql語(yǔ)句集合。

  是經(jīng)過(guò)預(yù)編譯,存在于數(shù)據(jù)庫(kù)中。

  通過(guò)調(diào)用指定存儲(chǔ)過(guò)程的名字(可有參,可無(wú)參)來(lái)執(zhí)行。

優(yōu)點(diǎn):

  簡(jiǎn)化了復(fù)雜的業(yè)務(wù)邏輯,根據(jù)需要可重復(fù)使用

  屏蔽了底層細(xì)節(jié),不暴露表信息即可完成操作

  降低網(wǎng)絡(luò)的通信量,多條語(yǔ)句可以封裝成一個(gè)存儲(chǔ)過(guò)程來(lái)執(zhí)行

  設(shè)置訪問(wèn)權(quán)限來(lái)提高安全性

  提高執(zhí)行效率,因?yàn)樗穷A(yù)編譯以及存儲(chǔ)在數(shù)據(jù)庫(kù)中

缺點(diǎn):

  可移植性差,相同的存儲(chǔ)過(guò)程并不能跨多個(gè)數(shù)據(jù)庫(kù)進(jìn)行操作

  大量使用存儲(chǔ)過(guò)程后,首先會(huì)使服務(wù)器壓力增大,而且維護(hù)難度逐漸增加

存儲(chǔ)過(guò)程的語(yǔ)法:

--下面是在oracle數(shù)據(jù)庫(kù)下最基本的語(yǔ)法

--僅創(chuàng)建一個(gè)名為testProcedure 的無(wú)參的存儲(chǔ)過(guò)程

--IS也可以是AS

--如果已經(jīng)存在名為 testProcedure 的存儲(chǔ)過(guò)程,下面的語(yǔ)法會(huì)出現(xiàn) 名稱已被使用的錯(cuò)誤

--解決辦法:

--第一句可以寫成 create or replace procedure testProcedure

--這樣會(huì)替換原有的存儲(chǔ)過(guò)程

--NULL表示任何可以正確執(zhí)行的sql 語(yǔ)句,但至少一句

create procedure testProcedure

IS

BEGIN

NULL

END;

存儲(chǔ)過(guò)程的參數(shù)的分類:

IN

OUT

INOUT

注意:

  存儲(chǔ)過(guò)程之間可相互調(diào)用

  存儲(chǔ)過(guò)程一般修改后,立即生效。

索引概述

1、索引的概念

索引就是為了提高數(shù)據(jù)的檢索速度。

數(shù)據(jù)庫(kù)的索引類似于書籍的索引。

在書籍中,索引允許用戶不必翻閱完整個(gè)書就能迅速地找到所需要的信息。

在數(shù)據(jù)庫(kù)中,索引也允許數(shù)據(jù)庫(kù)程序迅速地找到表中的數(shù)據(jù),

而不必掃描整個(gè)數(shù)據(jù)庫(kù).

2、索引的優(yōu)點(diǎn)

  1.創(chuàng)建唯一性索引,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性

  2.大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因

  3.減少磁盤IO(向字典一樣可以直接定位)

3、索引的缺點(diǎn)

   1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加

  2.索引需要占用額外的物理空間

   3.當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,

索引也要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度

4、索引的分類

  1.普通索引和唯一性索引

  普通索引:CREATE  INDEX mycolumn_index ON mytable (myclumn)

  唯一性索引:保證在索引列中的全部數(shù)據(jù)是唯一的

  CREATE unique INDEX mycolumn_index ON mytable (myclumn)

2.單個(gè)索引和復(fù)合索引

  單個(gè)索引:對(duì)單個(gè)字段建立索引

  復(fù)合索引:又叫組合索引,在索引建立語(yǔ)句中同時(shí)包含多個(gè)字段名,

  最多16個(gè)字段

  CREATE INDEX name_index ON userInfo(firstname,lastname)

3.順序索引,散列索引,位圖索引

必背的sql語(yǔ)句

    1:oracle分頁(yè)

         select * from (select t.*, rownum rn from (select * from menu order by id desc) t where rownum < 10) where rn >=5

  2: mysql分頁(yè)

         select * from music where id limit 5,5

  3:oracle中如何快速將一張表的數(shù)據(jù)復(fù)制到另外一張表中(另外一張表不存在,另外一張       表存在,但數(shù)據(jù)為空)

[if !supportLists]1、[endif].不存在另一張表時(shí):

create  table新表  as  select * from 將要復(fù)制的表

[if !supportLists]2、[endif]存在另一張表時(shí):

insert  into新表名  select  字段  from  將要復(fù)制的表名

  4:音樂(lè)專輯

   查詢出special 表中的id  專輯名 并下面有多少首歌曲

      Select  s.id , min(s.sname),count(m.mid)  from  special s  inner

      join  ms  m  on  s.id=m.id  group  by  s.id

  5:快速刪除一張表(不可事物回滾,也就是沒(méi)有日志記錄)

TRUNCATE from表名

  6:inner join

select查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名

  7:left join

左外連接select查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名

  8:right join

右外連接select查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名

  9:oracle中查詢遍歷樹形結(jié)構(gòu)(start  with)

            select * from extmenu

            start with pid=1

            connect by prior id = pid

            快速刪除父節(jié)點(diǎn)以及父節(jié)點(diǎn)下的所有節(jié)點(diǎn):

            Delete from extmenu where id in (

            elect * from extmenu

            start with pid=1

            connect by prior id = pid

            )

  10:查詢出來(lái)60-70,80-90,95-100學(xué)生的信息

select * from stu where chengji between 60 and 70 or between 80 and 90 or between 95 and 100

select * from stu where chengji > 60 and chengji < 70 or chengji > 80 and chengji < 90 or chengji > 95 and chengji < 100

11:用exists替換in------進(jìn)行聯(lián)表查詢

select * from dept where exists(select * from emp where emp.deptno=dept.deptno);或select  *  from  dept  d  inner  join  emp  e  on  d.deptno = e.deptno(只查詢出兩表共同擁有的字段數(shù)據(jù))

如果你依然覺(jué)得有些茫然,不如加入我的Java架構(gòu)師之路:766529531 跟有多年Java開發(fā)經(jīng)驗(yàn)的資深工程師聊一聊。也可獲取免費(fèi)的視頻學(xué)習(xí)資料以及電子書學(xué)習(xí)資料喔!

12:刪除表中的重復(fù)數(shù)據(jù):

delete from xin a where a.rowid != (

select max(b.rowid) from xin b

where a.name = b.name

);

13:row_number(),rank() over ,dense_rank() over 按工資排序

  select sal,

                 row_number() over(order by sal desc) rank1,

                 rank() over(order by sal desc) rank,

                 dense_rank() over(order by sal desc) drank

            from emp

14:select * from (select emp.* from(

dense_rank() over(partition by departNo order by sal desc)

rk from emp )

Where rk=4

ibatis批量

this.getSqlMapClientTemplate().execute(

new SqlMapClientCallback() {

        public Object doInSqlMapClient(

                SqlMapExecutor executor)

                throws SQLException {

        executor.startBatch();

        for (int i = 0, n = list.size(); i < n; i++) {

                executor.insert(

                "productAttach.insertProductAttach",

                list.get(i));

        }

        executor.executeBatch();

        return null;

    }

});


ibatis,jdbc,hibernate的分段的實(shí)現(xiàn):

都應(yīng)該在組裝list的時(shí)候進(jìn)行拆分(如:action層加入)

if(list.size() % 1000 == 0)

{

            productAttachService.addBatch(list);

            list.clear();

}

if (list.size() > 0)

productAttachService.addBatch(list);

上述內(nèi)容就是Java的技術(shù)知識(shí)點(diǎn)有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI