在數(shù)據(jù)庫方面,主要是涉及到之前沒有接觸或者接觸很少的知識(shí)點(diǎn)。比如存儲(chǔ)過程、select top實(shí)現(xiàn)數(shù)據(jù)分頁、短路表達(dá)式。下面使用簡單的例子來說明
首先在數(shù)據(jù)庫中簡單建立一個(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í)際開發(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ǔ)過程,會(huì)得到下面的頁面
本例中先使用簡單的查詢?nèi)繑?shù)據(jù),稍后會(huì)進(jìn)行參數(shù)的添加
如圖:設(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é)果:
2.select top實(shí)現(xiàn)數(shù)據(jù)分頁
select top在數(shù)據(jù)庫中是讀取前多少條數(shù)據(jù)。
新建存儲(chǔ)過程,如下
上圖中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.短路表達(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é)果如下
主要知識(shí)點(diǎn)就是這些,都是按照自己的理解來寫的,可能會(huì)有不全面的地方,如果有錯(cuò)誤,歡迎指出共同探討哈。