實(shí)習(xí)中接觸到的數(shù)據(jù)庫知識(shí)

在數(shù)據(jù)庫方面,主要是涉及到之前沒有接觸或者接觸很少的知識(shí)點(diǎn)。比如存儲(chǔ)過程、select top實(shí)現(xiàn)數(shù)據(jù)分頁、短路表達(dá)式。下面使用簡單的例子來說明

首先在數(shù)據(jù)庫中簡單建立一個(gè)數(shù)據(jù)表,如圖


users表.PNG

對(duì)于上表,只是截取部分,數(shù)據(jù)遠(yuǎn)不止7個(gè),建表時(shí)采用循環(huán)插入數(shù)據(jù)的方法共插入99條數(shù)據(jù)
<pre>declare @i int,@j int;
set @i=1;
set @j=10;
while @i < 100
begin insert into test.dbo.users(id,name,password) values(@i,@j+1,@j+2);
set @i=@i+1;
set @j=@j+1;
end </pre>

在實(shí)際開發(fā)中建表時(shí)需要注意的問題:相似數(shù)據(jù)類型的區(qū)別
char:使用時(shí)需固定長度,如char(10),表示它占有10個(gè)字節(jié),如果實(shí)際數(shù)據(jù)并未達(dá)到10字節(jié),則差的部分會(huì)以空格來填補(bǔ)
varchar:使用時(shí)雖然設(shè)置有長度,如varchar(10),但是實(shí)際占位以實(shí)際數(shù)據(jù)為準(zhǔn),若數(shù)據(jù)只有5個(gè)字節(jié)則只占5個(gè)字節(jié)
text:不需要定義長度,一般用來存儲(chǔ)文本數(shù)據(jù)
nchar、nvarchar、ntext:與char、varchar和text的區(qū)別在于存儲(chǔ)數(shù)據(jù)的方式不同,nchar、nvarchar和ntext采用unicode字符存儲(chǔ)數(shù)據(jù),所有字符都是使用兩個(gè)字節(jié)表示,因此存儲(chǔ)總量(都是存儲(chǔ)英文的情況下)char、varchar和text為8000,ncahr、nvarchar和ntext則只有4000

1.存儲(chǔ)過程:在數(shù)據(jù)庫中進(jìn)行sql代碼編寫,類似java中的一個(gè)方法,可以接收參數(shù),在java代碼中可以直接調(diào)用這個(gè)方法獲取數(shù)據(jù),避免在java代碼中編寫sql語句(只是舉例,并不是只有java可以使用)
建立存儲(chǔ)過程

新建存儲(chǔ)過程.png

右鍵新建存儲(chǔ)過程,會(huì)得到下面的頁面
存儲(chǔ)過程示例.PNG

本例中先使用簡單的查詢?nèi)繑?shù)據(jù),稍后會(huì)進(jìn)行參數(shù)的添加
存儲(chǔ)過程getUsers.PNG

如圖:設(shè)置方法名為getUsers,查詢?nèi)繑?shù)據(jù)
然后在java代碼中進(jìn)行調(diào)用
<pre>Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test","xxx","xxx");
CallableStatement cs = conn.prepareCall("{call getUsers()}"); //調(diào)用getUser()方法
ResultSet rs = cs.executeQuery(); //查詢結(jié)果保存在ResultSet中
while(rs.next()){ //讀取ResultSet中的數(shù)據(jù)
String name = rs.getString("name");
String password = rs.getString("password");
System.out.println("name is " + name + "and password is" + password);
}</pre>
打印結(jié)果:
部分?jǐn)?shù)據(jù).PNG

2.select top實(shí)現(xiàn)數(shù)據(jù)分頁
select top在數(shù)據(jù)庫中是讀取前多少條數(shù)據(jù)。
新建存儲(chǔ)過程,如下

存儲(chǔ)過程getUsersByIndex.PNG

上圖中select top部分的代碼,pageSize是指每個(gè)頁面顯示多少數(shù)據(jù),pageIndex是指當(dāng)前的頁面,@pageSize*(@pageIndex-1)得到的結(jié)果便是當(dāng)前頁之前已經(jīng)顯示了多少條數(shù)據(jù),第二個(gè)select top就是獲得這些數(shù)據(jù)的id,然后第一個(gè)select top則是從id不在這些id之中的數(shù)據(jù)開始選取前多少條,由此實(shí)現(xiàn)分頁功能
在java代碼中進(jìn)行調(diào)用
<pre>CallableStatement cs = connection.prepareCall("{call getUsersByIndex(?,?)}");
callableStatement.setInt(1, 10); //第一個(gè)參數(shù)指的是pageSize,就是每頁顯示多少數(shù)據(jù)
callableStatement.setInt(2, 3); //第二個(gè)參數(shù)指的是pageIndex,當(dāng)前的頁碼
ResultSet rs = callableStatement.executeQuery();
while (rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
System.out.println("id is " + id + " name is" + name + " password is " + password);
}</pre>
綜上就是每頁顯示10條數(shù)據(jù),當(dāng)前顯示第3頁,打印結(jié)果如下
第3頁的10條數(shù)據(jù).PNG

3.短路表達(dá)式
在涉及模糊查詢和全部查詢時(shí),可以分兩條語句操作,需要寫兩個(gè)方法,但是會(huì)有重復(fù)代碼,使用短路表達(dá)式可以將兩條語句變?yōu)橐粭l, 只需要一個(gè)方法即可。還是以上表為例,查詢?nèi)繑?shù)據(jù),查詢name中關(guān)鍵字為0的數(shù)據(jù)(這次不使用存儲(chǔ)過程)
<pre> keyword = "%" + keyword + "%"; //keyword由調(diào)用該方法時(shí)傳入
String sql = "select * from users where ((0=? and name like '%%') or (name like ?))";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=test","huangkunkun","312293");
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 1); //第一個(gè)參數(shù)作為判斷條件,這里為了執(zhí)行or后面的語句,直接設(shè)置成1
ps.setString(2, keyword);
ResultSet rs = ps.executeQuery();
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
System.out.println("id is " + id + " name is " + name + " password is " + password);
}
} catch (Exception e) {
e.printStackTrace();
}</pre>
上面代碼中的<pre>select * from users where ((0=? and name like '%%') or (name like ?))</pre> 如果0=?即傳入的參數(shù)若滿足和0相等,則執(zhí)行or前面的代碼,且忽略or后面的代碼,如果等式不成立,則會(huì)執(zhí)行or后面的代碼。打印結(jié)果如下

name關(guān)鍵字為0的數(shù)據(jù).PNG

主要知識(shí)點(diǎn)就是這些,都是按照自己的理解來寫的,可能會(huì)有不全面的地方,如果有錯(cuò)誤,歡迎指出共同探討哈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,839評(píng)論 0 11
  • 迎春花爬滿斜坡, 一片黃色; 春風(fēng)吹皺了湖水, 一片綠色; 蒼穹中飛翔著小鳥, 一片蘭色; 我在小道上走著, 一身青色。
    秋山秋水閱讀 323評(píng)論 5 5
  • 大前天上午因?yàn)榉咐б彩强蘖撕脦状危形缤抟驗(yàn)樘В牌艓窍滦^(qū)希望她吹著自然風(fēng),呼吸著外邊新鮮的空氣自主入睡...
    怡倩婷閱讀 236評(píng)論 0 0