在數(shù)據(jù)庫(kù)方面朋鞍,主要是涉及到之前沒(méi)有接觸或者接觸很少的知識(shí)點(diǎn)。比如存儲(chǔ)過(guò)程迫横、select top實(shí)現(xiàn)數(shù)據(jù)分頁(yè)番舆、短路表達(dá)式。下面使用簡(jiǎn)單的例子來(lái)說(shuō)明
首先在數(shù)據(jù)庫(kù)中簡(jiǎn)單建立一個(gè)數(shù)據(jù)表矾踱,如圖
對(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í)際開(kāi)發(fā)中建表時(shí)需要注意的問(wèn)題:相似數(shù)據(jù)類(lèi)型的區(qū)別
char:使用時(shí)需固定長(zhǎng)度禾怠,如char(10),表示它占有10個(gè)字節(jié)贝搁,如果實(shí)際數(shù)據(jù)并未達(dá)到10字節(jié)吗氏,則差的部分會(huì)以空格來(lái)填補(bǔ)
varchar:使用時(shí)雖然設(shè)置有長(zhǎng)度,如varchar(10),但是實(shí)際占位以實(shí)際數(shù)據(jù)為準(zhǔn)雷逆,若數(shù)據(jù)只有5個(gè)字節(jié)則只占5個(gè)字節(jié)
text:不需要定義長(zhǎng)度弦讽,一般用來(lái)存儲(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ǔ)過(guò)程:在數(shù)據(jù)庫(kù)中進(jìn)行sql代碼編寫(xiě)衣迷,類(lèi)似java中的一個(gè)方法畏鼓,可以接收參數(shù),在java代碼中可以直接調(diào)用這個(gè)方法獲取數(shù)據(jù)蘑险,避免在java代碼中編寫(xiě)sql語(yǔ)句(只是舉例滴肿,并不是只有java可以使用)
建立存儲(chǔ)過(guò)程
右鍵新建存儲(chǔ)過(guò)程,會(huì)得到下面的頁(yè)面
本例中先使用簡(jiǎn)單的查詢(xún)?nèi)繑?shù)據(jù)佃迄,稍后會(huì)進(jìn)行參數(shù)的添加
如圖:設(shè)置方法名為getUsers,查詢(xún)?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(); //查詢(xún)結(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é)果:
2.select top實(shí)現(xiàn)數(shù)據(jù)分頁(yè)
select top在數(shù)據(jù)庫(kù)中是讀取前多少條數(shù)據(jù)泼差。
新建存儲(chǔ)過(guò)程贵少,如下
上圖中select top部分的代碼,pageSize是指每個(gè)頁(yè)面顯示多少數(shù)據(jù)堆缘,pageIndex是指當(dāng)前的頁(yè)面滔灶,@pageSize*(@pageIndex-1)得到的結(jié)果便是當(dāng)前頁(yè)之前已經(jīng)顯示了多少條數(shù)據(jù),第二個(gè)select top就是獲得這些數(shù)據(jù)的id吼肥,然后第一個(gè)select top則是從id不在這些id之中的數(shù)據(jù)開(kāi)始選取前多少條录平,由此實(shí)現(xiàn)分頁(yè)功能
在java代碼中進(jìn)行調(diào)用
<pre>CallableStatement cs = connection.prepareCall("{call getUsersByIndex(?,?)}");
callableStatement.setInt(1, 10); //第一個(gè)參數(shù)指的是pageSize,就是每頁(yè)顯示多少數(shù)據(jù)
callableStatement.setInt(2, 3); //第二個(gè)參數(shù)指的是pageIndex,當(dāng)前的頁(yè)碼
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>
綜上就是每頁(yè)顯示10條數(shù)據(jù)缀皱,當(dāng)前顯示第3頁(yè)斗这,打印結(jié)果如下
3.短路表達(dá)式
在涉及模糊查詢(xún)和全部查詢(xún)時(shí),可以分兩條語(yǔ)句操作啤斗,需要寫(xiě)兩個(gè)方法表箭,但是會(huì)有重復(fù)代碼,使用短路表達(dá)式可以將兩條語(yǔ)句變?yōu)橐粭l钮莲, 只需要一個(gè)方法即可免钻。還是以上表為例,查詢(xún)?nèi)繑?shù)據(jù)崔拥,查詢(xún)name中關(guān)鍵字為0的數(shù)據(jù)(這次不使用存儲(chǔ)過(guò)程)
<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后面的語(yǔ)句,直接設(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ù)若滿(mǎn)足和0相等链瓦,則執(zhí)行or前面的代碼拆魏,且忽略or后面的代碼,如果等式不成立慈俯,則會(huì)執(zhí)行or后面的代碼稽揭。打印結(jié)果如下
主要知識(shí)點(diǎn)就是這些,都是按照自己的理解來(lái)寫(xiě)的肥卡,可能會(huì)有不全面的地方,如果有錯(cuò)誤事镣,歡迎指出共同探討哈步鉴。