JDBC 2.0比1.0有了一些不同,體現(xiàn)在四個(gè)比較明顯的方面:
1>. ResutlSet對(duì)象中的Cursor能夠自由上下移動(dòng)
2>. 能直接使用Java程序語(yǔ)言來(lái)更新DB表里的內(nèi)容,而不需要額外寫(xiě)SQL語(yǔ)法
3>. 可以一次傳送許多SQL語(yǔ)句到DB執(zhí)行----Batch
4>. 新增2個(gè)數(shù)據(jù)類型(BLOB和CLOB)
?? 我們知道在JDBC 1.0時(shí),只要用 connection.createStatement()就能取得Statement()對(duì)象.不過(guò)在2.0中多的createStatement()
多了兩個(gè)參數(shù)值,需要我們自己來(lái)定義它.
public Statement createStatement(int resultSetType,
???????????????????????????????? int resultSetConcurrency)throws SQLException
?? 第一個(gè)參數(shù)resultSetType用來(lái)設(shè)定ResultSet對(duì)象中的光標(biāo)是否可以自由上下移動(dòng),它的值有三種,TYPE_FORWARD_ONLY,TYPE_SCROLL_SENSITIVE,
TYPE_SCROLL_INSENSITIVE.若為T(mén)YPE_FORWARD_ONLY就表示和1.0一樣只能用next()方法;然后后兩者可以讓Cursor隨便的自由移動(dòng),不過(guò),
它們兩者最大的區(qū)別在于:當(dāng)ResutlSet中的值有改變時(shí),TYPE_SCROLL_SENSITIVE能取得修改后的值,而TYPE_SCROLL_INSENSITIVE則不能.
? 第而個(gè)參數(shù)resultSetConcurrentcy,主要是設(shè)定ResultSet對(duì)象是只讀(read-only)還是可以改變的(updateable),它可能的值有兩種,
CONCUR_READ_ONLY或者是CONCUR_UPDATE.若設(shè)置為CONCUR_READ_ONLY,ResultSet對(duì)象和1.0一樣;若為CONCUR_UPDATEABLE,那么就可以用
ResultSet對(duì)象執(zhí)行數(shù)據(jù)庫(kù)的修改,增加和移除功能.for example:
先看功能和1.0一樣的寫(xiě)法:
Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
while(rs.next())
{
?? String name=rs.getString("ename");
?? int empno=rs.getInt("empno");
?? System.out.println("name="+name+","+"number="+empno);
}
輸出結(jié)果為:
name=feiyang,number=1190
name=jack,?? number=1230
name=BillGates number=12
...........
再看看下面這個(gè):
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
rs.afterLast();
while(rs.previous())
{
?? String name=rs.getString("ename");
?? int empno=rs.getInt("empno");
?? System.out.println("name="+name+","+"number="+empno);
}
輸出結(jié)果為:
name=BillGates number=12
name=jack,?? number=1230
name=feiyang,number=1190
.............
這和上面第一有點(diǎn)不同的是順序顛倒了,這是因?yàn)槲覀兪褂昧藃s.afterLast()這個(gè)方法.其實(shí)2.0中還有很多方法,如下:
rs.absolute(-1); //表示cursor在最后一筆數(shù)據(jù),即 rs.last()
rs.absolute(1);? //表示cursor在第一筆數(shù)據(jù),即rs.first()
rs.absolute(n);? //表示cursor在第N筆數(shù)據(jù)
假使我們目前有1000筆數(shù)據(jù),取得第997筆
rs.absolute(-4);
還有一個(gè)方法和absolute很相像,那就是relative(),
rs.absolute(5); //表示第五筆數(shù)據(jù)
......
rs.relative(-3);? //表示cursor目前在第二筆數(shù)據(jù)
.......
rs.relative(1);? //cursor目前在第三筆數(shù)據(jù)
看看怎么用ResultSet對(duì)象執(zhí)行更新數(shù)據(jù)庫(kù)動(dòng)作
?? 要讓ResultSet對(duì)象執(zhí)行更新數(shù)據(jù)庫(kù)的動(dòng)作,首先在聲明Statement對(duì)象時(shí),參數(shù)必須設(shè)置為T(mén)YPE_SCROLL_SENSITIVE和
CUNCOR_UPDATEABLE.
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select ename,empno from emp);
rs.last();
rs.updateInt("empno",2230);
rs.cancelRowUpdates();
rs.updateInt("empno",1213);
rs.updateRow();
新增數(shù)據(jù)到數(shù)據(jù)庫(kù)
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.moveToInsertRow();
rs.updateInt("empno",2230);
rs.updateString("ename","feiyang");
rs.updateString("job","clerk");
rs.updateFloat("sal",123456.5);
rs.insertRow();
刪除數(shù)據(jù)
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.absolute(4);
rs.deleteRow();
依次執(zhí)行多條SQL語(yǔ)句
Statement stmt=con.createStatment();
int[] rows;
stmt.addBatch("insert into emp values('feiyang','123456')");
stmt.addBatch("insert into offcie values('employee','Shanghai')");
rows=stmt.executeBatch();
當(dāng)執(zhí)行大量數(shù)據(jù)的時(shí)候?yàn)榱藬?shù)據(jù)的完整性,建議使用Transaction
eg:
con.setAutoCommit(false);
Statement stmt=con.createStatement();
int[] rows;
stmt.addBatch("1...........");
stmt.addBatch("2...........");
stmt.addBatch("3...........");
stmt.addBatch("4...........");
stmt.addBatch("5...........");
stmt.addBatch("6...........");
rows=stmt.executeBatch();
con.commit();
在JDBC2.0中新增加BLOB和CLOB兩個(gè)數(shù)據(jù)類型
BOLB指的是二進(jìn)制大型對(duì)象(Binary Large Object),CLOB指的是字符大型對(duì)象(Character Large Object).它們用來(lái)處理大型
的數(shù)據(jù)類型,他們分別代表大量的二進(jìn)制數(shù)據(jù)和文字?jǐn)?shù)據(jù).
1>. ResutlSet對(duì)象中的Cursor能夠自由上下移動(dòng)
2>. 能直接使用Java程序語(yǔ)言來(lái)更新DB表里的內(nèi)容,而不需要額外寫(xiě)SQL語(yǔ)法
3>. 可以一次傳送許多SQL語(yǔ)句到DB執(zhí)行----Batch
4>. 新增2個(gè)數(shù)據(jù)類型(BLOB和CLOB)
?? 我們知道在JDBC 1.0時(shí),只要用 connection.createStatement()就能取得Statement()對(duì)象.不過(guò)在2.0中多的createStatement()
多了兩個(gè)參數(shù)值,需要我們自己來(lái)定義它.
public Statement createStatement(int resultSetType,
???????????????????????????????? int resultSetConcurrency)throws SQLException
?? 第一個(gè)參數(shù)resultSetType用來(lái)設(shè)定ResultSet對(duì)象中的光標(biāo)是否可以自由上下移動(dòng),它的值有三種,TYPE_FORWARD_ONLY,TYPE_SCROLL_SENSITIVE,
TYPE_SCROLL_INSENSITIVE.若為T(mén)YPE_FORWARD_ONLY就表示和1.0一樣只能用next()方法;然后后兩者可以讓Cursor隨便的自由移動(dòng),不過(guò),
它們兩者最大的區(qū)別在于:當(dāng)ResutlSet中的值有改變時(shí),TYPE_SCROLL_SENSITIVE能取得修改后的值,而TYPE_SCROLL_INSENSITIVE則不能.
? 第而個(gè)參數(shù)resultSetConcurrentcy,主要是設(shè)定ResultSet對(duì)象是只讀(read-only)還是可以改變的(updateable),它可能的值有兩種,
CONCUR_READ_ONLY或者是CONCUR_UPDATE.若設(shè)置為CONCUR_READ_ONLY,ResultSet對(duì)象和1.0一樣;若為CONCUR_UPDATEABLE,那么就可以用
ResultSet對(duì)象執(zhí)行數(shù)據(jù)庫(kù)的修改,增加和移除功能.for example:
先看功能和1.0一樣的寫(xiě)法:
Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
while(rs.next())
{
?? String name=rs.getString("ename");
?? int empno=rs.getInt("empno");
?? System.out.println("name="+name+","+"number="+empno);
}
輸出結(jié)果為:
name=feiyang,number=1190
name=jack,?? number=1230
name=BillGates number=12
...........
再看看下面這個(gè):
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
RestultSet rs=stmt.executeQuery("select ename,empno from emp");
rs.afterLast();
while(rs.previous())
{
?? String name=rs.getString("ename");
?? int empno=rs.getInt("empno");
?? System.out.println("name="+name+","+"number="+empno);
}
輸出結(jié)果為:
name=BillGates number=12
name=jack,?? number=1230
name=feiyang,number=1190
.............
這和上面第一有點(diǎn)不同的是順序顛倒了,這是因?yàn)槲覀兪褂昧藃s.afterLast()這個(gè)方法.其實(shí)2.0中還有很多方法,如下:
rs.absolute(-1); //表示cursor在最后一筆數(shù)據(jù),即 rs.last()
rs.absolute(1);? //表示cursor在第一筆數(shù)據(jù),即rs.first()
rs.absolute(n);? //表示cursor在第N筆數(shù)據(jù)
假使我們目前有1000筆數(shù)據(jù),取得第997筆
rs.absolute(-4);
還有一個(gè)方法和absolute很相像,那就是relative(),
rs.absolute(5); //表示第五筆數(shù)據(jù)
......
rs.relative(-3);? //表示cursor目前在第二筆數(shù)據(jù)
.......
rs.relative(1);? //cursor目前在第三筆數(shù)據(jù)
看看怎么用ResultSet對(duì)象執(zhí)行更新數(shù)據(jù)庫(kù)動(dòng)作
?? 要讓ResultSet對(duì)象執(zhí)行更新數(shù)據(jù)庫(kù)的動(dòng)作,首先在聲明Statement對(duì)象時(shí),參數(shù)必須設(shè)置為T(mén)YPE_SCROLL_SENSITIVE和
CUNCOR_UPDATEABLE.
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select ename,empno from emp);
rs.last();
rs.updateInt("empno",2230);
rs.cancelRowUpdates();
rs.updateInt("empno",1213);
rs.updateRow();
新增數(shù)據(jù)到數(shù)據(jù)庫(kù)
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.moveToInsertRow();
rs.updateInt("empno",2230);
rs.updateString("ename","feiyang");
rs.updateString("job","clerk");
rs.updateFloat("sal",123456.5);
rs.insertRow();
刪除數(shù)據(jù)
Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
ResultSet rs=stmt.executeQuery("select * from emp);
rs.absolute(4);
rs.deleteRow();
依次執(zhí)行多條SQL語(yǔ)句
Statement stmt=con.createStatment();
int[] rows;
stmt.addBatch("insert into emp values('feiyang','123456')");
stmt.addBatch("insert into offcie values('employee','Shanghai')");
rows=stmt.executeBatch();
當(dāng)執(zhí)行大量數(shù)據(jù)的時(shí)候?yàn)榱藬?shù)據(jù)的完整性,建議使用Transaction
eg:
con.setAutoCommit(false);
Statement stmt=con.createStatement();
int[] rows;
stmt.addBatch("1...........");
stmt.addBatch("2...........");
stmt.addBatch("3...........");
stmt.addBatch("4...........");
stmt.addBatch("5...........");
stmt.addBatch("6...........");
rows=stmt.executeBatch();
con.commit();
在JDBC2.0中新增加BLOB和CLOB兩個(gè)數(shù)據(jù)類型
BOLB指的是二進(jìn)制大型對(duì)象(Binary Large Object),CLOB指的是字符大型對(duì)象(Character Large Object).它們用來(lái)處理大型
的數(shù)據(jù)類型,他們分別代表大量的二進(jìn)制數(shù)據(jù)和文字?jǐn)?shù)據(jù).